diff options
-rw-r--r-- | cmd/podman/machine/ssh.go | 37 | ||||
-rw-r--r-- | pkg/machine/config.go | 3 | ||||
-rw-r--r-- | pkg/machine/qemu/machine.go | 7 |
3 files changed, 45 insertions, 2 deletions
diff --git a/cmd/podman/machine/ssh.go b/cmd/podman/machine/ssh.go index 85101a641..84e9e88ab 100644 --- a/cmd/podman/machine/ssh.go +++ b/cmd/podman/machine/ssh.go @@ -3,6 +3,9 @@ package machine import ( + "net/url" + + "github.com/containers/common/pkg/config" "github.com/containers/podman/v3/cmd/podman/registry" "github.com/containers/podman/v3/pkg/machine" "github.com/containers/podman/v3/pkg/machine/qemu" @@ -44,6 +47,14 @@ func ssh(cmd *cobra.Command, args []string) error { // Set the VM to default vmName := defaultMachineName + + // If we're not given a VM name, use the remote username from the connection config + if len(args) == 0 { + sshOpts.Username, err = remoteConnectionUsername() + if err != nil { + return err + } + } // If len is greater than 0, it means we may have been // provided the VM name. If so, we check. The VM name, // if provided, must be in args[0]. @@ -57,16 +68,25 @@ func ssh(cmd *cobra.Command, args []string) error { if validVM { vmName = args[0] } else { + sshOpts.Username, err = remoteConnectionUsername() + if err != nil { + return err + } sshOpts.Args = append(sshOpts.Args, args[0]) } } } + // If len is greater than 1, it means we might have been // given a vmname and args or just args if len(args) > 1 { if validVM { sshOpts.Args = args[1:] } else { + sshOpts.Username, err = remoteConnectionUsername() + if err != nil { + return err + } sshOpts.Args = args } } @@ -80,3 +100,20 @@ func ssh(cmd *cobra.Command, args []string) error { } return vm.SSH(vmName, sshOpts) } + +func remoteConnectionUsername() (string, error) { + cfg, err := config.ReadCustomConfig() + if err != nil { + return "", err + } + dest, _, err := cfg.ActiveDestination() + if err != nil { + return "", err + } + uri, err := url.Parse(dest) + if err != nil { + return "", err + } + username := uri.User.String() + return username, nil +} diff --git a/pkg/machine/config.go b/pkg/machine/config.go index cad71ba49..8db2335aa 100644 --- a/pkg/machine/config.go +++ b/pkg/machine/config.go @@ -61,7 +61,8 @@ type ListResponse struct { } type SSHOptions struct { - Args []string + Username string + Args []string } type StartOptions struct{} diff --git a/pkg/machine/qemu/machine.go b/pkg/machine/qemu/machine.go index 855a39c56..5d8c6e6ce 100644 --- a/pkg/machine/qemu/machine.go +++ b/pkg/machine/qemu/machine.go @@ -488,7 +488,12 @@ func (v *MachineVM) SSH(name string, opts machine.SSHOptions) error { return errors.Errorf("vm %q is not running.", v.Name) } - sshDestination := v.RemoteUsername + "@localhost" + username := opts.Username + if username == "" { + username = v.RemoteUsername + } + + sshDestination := username + "@localhost" port := strconv.Itoa(v.Port) args := []string{"-i", v.IdentityPath, "-p", port, sshDestination, "-o", "UserKnownHostsFile /dev/null", "-o", "StrictHostKeyChecking no"} |