// Command implements Client.Command. func (c *OpenSSHClient) Command(host string, command []string, options *Options) *Cmd { args := opensshOptions(options, sshKind) args = append(args, host) if len(command) > 0 { args = append(args, command...) } bin, args := sshpassWrap("ssh", args) logger.Debugf("running: %s %s", bin, utils.CommandString(args...)) return &Cmd{impl: &opensshCmd{exec.Command(bin, args...)}} }
func opensshOptions(options *Options, commandKind opensshCommandKind) []string { args := append([]string{}, opensshCommonOptions...) if options == nil { options = &Options{} } if len(options.proxyCommand) > 0 { args = append(args, "-o", "ProxyCommand "+utils.CommandString(options.proxyCommand...)) } if !options.passwordAuthAllowed { args = append(args, "-o", "PasswordAuthentication no") } if options.allocatePTY { args = append(args, "-t", "-t") // twice to force } identities := append([]string{}, options.identities...) if pk := PrivateKeyFiles(); len(pk) > 0 { // Add client keys as implicit identities identities = append(identities, pk...) } // If any identities are specified, the // default ones must be explicitly specified. if len(identities) > 0 { for _, identity := range defaultIdentities { path, err := utils.NormalizePath(identity) if err != nil { logger.Warningf("failed to normalize path %q: %v", identity, err) continue } if _, err := os.Stat(path); err == nil { identities = append(identities, path) } } } for _, identity := range identities { args = append(args, "-i", identity) } if options.port != 0 { port := fmt.Sprint(options.port) if commandKind == scpKind { // scp uses -P instead of -p (-p means preserve). args = append(args, "-P", port) } else { args = append(args, "-p", port) } } return args }
// Copy implements Client.Copy. func (c *OpenSSHClient) Copy(args []string, userOptions *Options) error { var options Options if userOptions != nil { options = *userOptions options.allocatePTY = false // doesn't make sense for scp } allArgs := opensshOptions(&options, scpKind) allArgs = append(allArgs, args...) bin, allArgs := sshpassWrap("scp", allArgs) cmd := exec.Command(bin, allArgs...) var stderr bytes.Buffer cmd.Stderr = &stderr logger.Debugf("running: %s %s", bin, utils.CommandString(args...)) if err := cmd.Run(); err != nil { stderr := strings.TrimSpace(stderr.String()) if len(stderr) > 0 { err = fmt.Errorf("%v (%v)", err, stderr) } return err } return nil }