Add --execute flag to podman machine ssh

--execute, -e allows to execute a command through ssh

Signed-off-by: Ashley Cui <acui@redhat.com>
This commit is contained in:
Ashley Cui
2021-03-22 13:23:22 -04:00
committed by baude
parent b5f54a9b23
commit e766113737
4 changed files with 41 additions and 11 deletions

View File

@ -12,22 +12,33 @@ import (
var (
sshCmd = &cobra.Command{
Use: "ssh NAME",
Use: "ssh [options] NAME [COMMAND [ARG ...]]",
Short: "SSH into a virtual machine",
Long: "SSH into a podman-managed virtual machine ",
RunE: ssh,
Args: cobra.ExactArgs(1),
Example: `podman machine ssh myvm`,
Args: cobra.MinimumNArgs(1),
Example: `podman machine ssh myvm
podman machine ssh -e myvm echo hello`,
ValidArgsFunction: completion.AutocompleteNone,
}
)
var (
sshOpts machine.SSHOptions
)
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: sshCmd,
Parent: machineCmd,
})
flags := sshCmd.Flags()
executeFlagName := "execute"
flags.BoolVarP(&sshOpts.Execute, executeFlagName, "e", false, "Execute command from args")
_ = sshCmd.RegisterFlagCompletionFunc(executeFlagName, completion.AutocompleteDefault)
}
func ssh(cmd *cobra.Command, args []string) error {
@ -36,6 +47,17 @@ func ssh(cmd *cobra.Command, args []string) error {
vm machine.VM
vmType string
)
sshOpts.Args = args[1:]
// Error if no execute but args given
if !sshOpts.Execute && len(sshOpts.Args) > 0 {
return errors.New("too many args: to execute commands via ssh, use -e flag")
}
// Error if execute but no args given
if sshOpts.Execute && len(sshOpts.Args) < 1 {
return errors.New("must proivde at least one command to execute")
}
switch vmType {
default:
vm, err = qemu.LoadVMByName(args[0])
@ -43,5 +65,5 @@ func ssh(cmd *cobra.Command, args []string) error {
if err != nil {
return errors.Wrapf(err, "vm %s not found", args[0])
}
return vm.SSH(args[0], machine.SSHOptions{})
return vm.SSH(args[0], sshOpts)
}

View File

@ -4,7 +4,7 @@
podman\-machine\-ssh - SSH into a virtual machine
## SYNOPSIS
**podman machine ssh** *name*
**podman machine ssh** [*options*] *name* [*command* [*arg* ...]]
## DESCRIPTION

View File

@ -42,7 +42,10 @@ type Download struct {
VMName string
}
type SSHOptions struct{}
type SSHOptions struct {
Execute bool
Args []string
}
type StartOptions struct{}
type StopOptions struct{}

View File

@ -293,9 +293,14 @@ func (v *MachineVM) SSH(name string, opts machine.SSHOptions) error {
sshDestination := v.RemoteUsername + "@localhost"
port := strconv.Itoa(v.Port)
args := []string{"-i", v.IdentityPath, "-p", port, sshDestination}
if opts.Execute {
args = append(args, opts.Args...)
} else {
fmt.Printf("Connecting to vm %s. To close connection, use `~.` or `exit`\n", v.Name)
}
cmd := exec.Command("ssh", "-i", v.IdentityPath, "-p", port, sshDestination)
cmd := exec.Command("ssh", args...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin