diff options
-rw-r--r-- | cmd/podman/machine/ssh.go | 36 | ||||
-rw-r--r-- | docs/source/markdown/podman-machine-ssh.1.md | 2 | ||||
-rw-r--r-- | pkg/machine/config.go | 5 | ||||
-rw-r--r-- | pkg/machine/qemu/machine.go | 9 |
4 files changed, 41 insertions, 11 deletions
diff --git a/cmd/podman/machine/ssh.go b/cmd/podman/machine/ssh.go index a0656d17b..32483f731 100644 --- a/cmd/podman/machine/ssh.go +++ b/cmd/podman/machine/ssh.go @@ -12,22 +12,33 @@ import ( var ( sshCmd = &cobra.Command{ - Use: "ssh NAME", - 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`, + Use: "ssh [options] NAME [COMMAND [ARG ...]]", + Short: "SSH into a virtual machine", + Long: "SSH into a podman-managed virtual machine ", + RunE: ssh, + 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) } diff --git a/docs/source/markdown/podman-machine-ssh.1.md b/docs/source/markdown/podman-machine-ssh.1.md index c0679347e..ed35a38e4 100644 --- a/docs/source/markdown/podman-machine-ssh.1.md +++ b/docs/source/markdown/podman-machine-ssh.1.md @@ -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 diff --git a/pkg/machine/config.go b/pkg/machine/config.go index 5e90dae51..2a70b8ff7 100644 --- a/pkg/machine/config.go +++ b/pkg/machine/config.go @@ -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{} diff --git a/pkg/machine/qemu/machine.go b/pkg/machine/qemu/machine.go index 92a16dda7..30d96ce08 100644 --- a/pkg/machine/qemu/machine.go +++ b/pkg/machine/qemu/machine.go @@ -293,9 +293,14 @@ func (v *MachineVM) SSH(name string, opts machine.SSHOptions) error { sshDestination := v.RemoteUsername + "@localhost" port := strconv.Itoa(v.Port) - fmt.Printf("Connecting to vm %s. To close connection, use `~.` or `exit`\n", v.Name) + 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 |