mirror of
https://github.com/containers/podman.git
synced 2025-05-17 23:26:08 +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 (
|
||||
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)
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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{}
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user