func runSSH(args []string) (exit int) { if flagUnit != "" && flagMachine != "" { fmt.Fprintln(os.Stderr, "Both machine and unit flags provided, please specify only one.") return 1 } var err error var addr string switch { case flagMachine != "": addr, _ = findAddressInMachineList(flagMachine) case flagUnit != "": addr, _ = findAddressInRunningUnits(flagUnit) default: addr, err = globalMachineLookup(args) if err != nil { fmt.Fprintln(os.Stderr, err) return 1 } // trim machine/unit name from args if len(args) > 0 { args = args[1:] } } if addr == "" { fmt.Fprintln(os.Stderr, "Requested machine could not be found.") return 1 } args = pkg.TrimToDashes(args) var sshClient *ssh.SSHForwardingClient if tun := getTunnelFlag(); tun != "" { sshClient, err = ssh.NewTunnelledSSHClient("core", tun, addr, getChecker(), flagSSHAgentForwarding) } else { sshClient, err = ssh.NewSSHClient("core", addr, getChecker(), flagSSHAgentForwarding) } if err != nil { fmt.Fprintf(os.Stderr, "Failed building SSH client: %v\n", err) return 1 } defer sshClient.Close() if len(args) > 0 { cmd := strings.Join(args, " ") err, exit = ssh.Execute(sshClient, cmd) if err != nil { fmt.Fprintf(os.Stderr, "Failed running command over SSH: %v\n", err) } } else { if err := ssh.Shell(sshClient); err != nil { fmt.Fprintf(os.Stderr, "Failed opening shell over SSH: %v\n", err) exit = 1 } } return }
func runSSH(args []string) (exit int) { if flagUnit != "" && flagMachine != "" { stderr("Both machine and unit flags provided, please specify only one.") return 1 } var err error var addr string switch { case flagMachine != "": addr, _, err = findAddressInMachineList(flagMachine) case flagUnit != "": addr, _, err = findAddressInRunningUnits(flagUnit) default: addr, err = globalMachineLookup(args) // trim machine/unit name from args if len(args) > 0 { args = args[1:] } } if err != nil { stderr("Unable to proceed: %v", err) return 1 } if addr == "" { stderr("Could not determine address of machine.") return 1 } args = pkg.TrimToDashes(args) var sshClient *ssh.SSHForwardingClient timeout := getSSHTimeoutFlag() if tun := getTunnelFlag(); tun != "" { sshClient, err = ssh.NewTunnelledSSHClient(globalFlags.SSHUserName, tun, addr, getChecker(), flagSSHAgentForwarding, timeout) } else { sshClient, err = ssh.NewSSHClient(globalFlags.SSHUserName, addr, getChecker(), flagSSHAgentForwarding, timeout) } if err != nil { stderr("Failed building SSH client: %v", err) return 1 } defer sshClient.Close() if len(args) > 0 { cmd := strings.Join(args, " ") err, exit = ssh.Execute(sshClient, cmd) if err != nil { stderr("Failed running command over SSH: %v", err) } } else { if err := ssh.Shell(sshClient); err != nil { stderr("Failed opening shell over SSH: %v", err) exit = 1 } } return }