mirror of
https://github.com/containers/podman.git
synced 2025-05-20 00:27:03 +08:00
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:
@ -12,22 +12,33 @@ import (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
sshCmd = &cobra.Command{
|
sshCmd = &cobra.Command{
|
||||||
Use: "ssh NAME",
|
Use: "ssh [options] NAME [COMMAND [ARG ...]]",
|
||||||
Short: "SSH into a virtual machine",
|
Short: "SSH into a virtual machine",
|
||||||
Long: "SSH into a podman-managed virtual machine ",
|
Long: "SSH into a podman-managed virtual machine ",
|
||||||
RunE: ssh,
|
RunE: ssh,
|
||||||
Args: cobra.ExactArgs(1),
|
Args: cobra.MinimumNArgs(1),
|
||||||
Example: `podman machine ssh myvm`,
|
Example: `podman machine ssh myvm
|
||||||
|
podman machine ssh -e myvm echo hello`,
|
||||||
|
|
||||||
ValidArgsFunction: completion.AutocompleteNone,
|
ValidArgsFunction: completion.AutocompleteNone,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
sshOpts machine.SSHOptions
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registry.Commands = append(registry.Commands, registry.CliCommand{
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
|
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
|
||||||
Command: sshCmd,
|
Command: sshCmd,
|
||||||
Parent: machineCmd,
|
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 {
|
func ssh(cmd *cobra.Command, args []string) error {
|
||||||
@ -36,6 +47,17 @@ func ssh(cmd *cobra.Command, args []string) error {
|
|||||||
vm machine.VM
|
vm machine.VM
|
||||||
vmType string
|
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 {
|
switch vmType {
|
||||||
default:
|
default:
|
||||||
vm, err = qemu.LoadVMByName(args[0])
|
vm, err = qemu.LoadVMByName(args[0])
|
||||||
@ -43,5 +65,5 @@ func ssh(cmd *cobra.Command, args []string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "vm %s not found", args[0])
|
return errors.Wrapf(err, "vm %s not found", args[0])
|
||||||
}
|
}
|
||||||
return vm.SSH(args[0], machine.SSHOptions{})
|
return vm.SSH(args[0], sshOpts)
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
podman\-machine\-ssh - SSH into a virtual machine
|
podman\-machine\-ssh - SSH into a virtual machine
|
||||||
|
|
||||||
## SYNOPSIS
|
## SYNOPSIS
|
||||||
**podman machine ssh** *name*
|
**podman machine ssh** [*options*] *name* [*command* [*arg* ...]]
|
||||||
|
|
||||||
## DESCRIPTION
|
## DESCRIPTION
|
||||||
|
|
||||||
|
@ -42,7 +42,10 @@ type Download struct {
|
|||||||
VMName string
|
VMName string
|
||||||
}
|
}
|
||||||
|
|
||||||
type SSHOptions struct{}
|
type SSHOptions struct {
|
||||||
|
Execute bool
|
||||||
|
Args []string
|
||||||
|
}
|
||||||
type StartOptions struct{}
|
type StartOptions struct{}
|
||||||
|
|
||||||
type StopOptions struct{}
|
type StopOptions struct{}
|
||||||
|
@ -293,9 +293,14 @@ func (v *MachineVM) SSH(name string, opts machine.SSHOptions) error {
|
|||||||
sshDestination := v.RemoteUsername + "@localhost"
|
sshDestination := v.RemoteUsername + "@localhost"
|
||||||
port := strconv.Itoa(v.Port)
|
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.Stdout = os.Stdout
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
cmd.Stdin = os.Stdin
|
cmd.Stdin = os.Stdin
|
||||||
|
Reference in New Issue
Block a user