mirror of https://github.com/docker/docs.git
78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
package ssh
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
log "github.com/Sirupsen/logrus"
|
|
)
|
|
|
|
func GetSSHCommand(host string, port int, user string, sshKey string, args ...string) *exec.Cmd {
|
|
|
|
defaultSSHArgs := []string{
|
|
"-o", "IdentitiesOnly=yes",
|
|
"-o", "StrictHostKeyChecking=no",
|
|
"-o", "UserKnownHostsFile=/dev/null",
|
|
"-o", "LogLevel=quiet", // suppress "Warning: Permanently added '[localhost]:2022' (ECDSA) to the list of known hosts."
|
|
"-p", fmt.Sprintf("%d", port),
|
|
"-i", sshKey,
|
|
fmt.Sprintf("%s@%s", user, host),
|
|
}
|
|
|
|
sshArgs := append(defaultSSHArgs, args...)
|
|
cmd := exec.Command("ssh", sshArgs...)
|
|
cmd.Stderr = os.Stderr
|
|
|
|
if os.Getenv("DEBUG") != "" {
|
|
cmd.Stdout = os.Stdout
|
|
}
|
|
|
|
log.Debugf("executing: %v", strings.Join(cmd.Args, " "))
|
|
|
|
return cmd
|
|
}
|
|
|
|
func GenerateSSHKey(path string) error {
|
|
if _, err := exec.LookPath("ssh-keygen"); err != nil {
|
|
return fmt.Errorf("ssh-keygen not found in the path, please install ssh-keygen")
|
|
}
|
|
|
|
if _, err := os.Stat(path); err != nil {
|
|
if !os.IsNotExist(err) {
|
|
return err
|
|
}
|
|
|
|
cmd := exec.Command("ssh-keygen", "-t", "rsa", "-N", "", "-f", path)
|
|
|
|
if os.Getenv("DEBUG") != "" {
|
|
cmd.Stdout = os.Stdout
|
|
}
|
|
|
|
cmd.Stderr = os.Stderr
|
|
log.Debugf("executing: %v %v\n", cmd.Path, strings.Join(cmd.Args, " "))
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func WaitForTCP(addr string) error {
|
|
for {
|
|
conn, err := net.Dial("tcp", addr)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
defer conn.Close()
|
|
if _, err = conn.Read(make([]byte, 1)); err != nil {
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
return nil
|
|
}
|