aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/podman/machine/ssh.go36
-rw-r--r--docs/source/markdown/podman-machine-ssh.1.md2
-rw-r--r--pkg/machine/config.go5
-rw-r--r--pkg/machine/qemu/machine.go9
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