ce := func(err error, msg string) {
Ā Ā if err != nil {
Ā Ā Ā log.Fatalf("%s error: %v", msg, err)
Ā Ā }
}
var (
Ā Ā auth Ā Ā Ā Ā []ssh.AuthMethod SSH client with a
Ā Ā addr Ā Ā Ā Ā string
Ā Ā clientConfig *ssh.ClientConfig
Ā Ā client Ā Ā Ā *ssh.Client
Ā Ā config Ā Ā Ā ssh.Config
Ā Ā session Ā Ā Ā *ssh.Session
Ā Ā err Ā Ā Ā Ā Ā error
Ā Ā key string
)
user := "vagrant"
addr = "localhost:2222"
key = "my_vagrant_private_key_path"
auth = make([]ssh.AuthMethod, 0)
pemBytes, err := ioutil.ReadFile(key)
if err != nil {
Ā Ā panic(err)
}
var signer ssh.Signer
signer, err = ssh.ParsePrivateKey(pemBytes)
if err != nil {
Ā Ā panic("parse error")
}
auth = append(auth, ssh.PublicKeys(signer))
if err != nil {
Ā Ā panic("public key append error")
}
auth = append(auth, ssh.PublicKeys(signer))
config = ssh.Config{
Ā Ā Ciphers: []string{"aes128-ctr", "aes192-ctr", "aes256-ctr", "aes12...@openssh.com", "arcfour256", "arcfour128", "aes128-cbc", "3des-cbc", "aes192-cbc", "aes256-cbc"},
}
clientConfig = &ssh.ClientConfig{
Ā Ā User: Ā Ā user,
Ā Ā Auth: Ā Ā auth,
Ā Ā Timeout: 30 * time.Second,
Ā Ā Config: Ā config,
Ā Ā HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
Ā Ā Ā return nil
Ā Ā },
}
client, err = ssh.Dial("tcp", addr,clientConfig)
ce(err, "dial")
session, err = client.NewSession()
ce(err, "new session")
defer session.Close()
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Stdin = os.Stdin
modes := ssh.TerminalModes{
Ā Ā ssh.ECHO: Ā Ā Ā Ā Ā 1,
Ā Ā ssh.ECHOCTL: Ā Ā Ā 0,
Ā Ā ssh.TTY_OP_ISPEED: 14400,
Ā Ā ssh.TTY_OP_OSPEED: 14400,
}
termFD := int(os.Stdin.Fd())
w, h, _ := terminal.GetSize(termFD)
termState, _ := terminal.MakeRaw(termFD)
defer terminal.Restore(termFD, termState)
err = session.RequestPty("xterm-256color", h, w, modes)
ce(err, "request pty") SSH client with a
err = session.Shell()
ce(err, "start shell")
err = session.Wait()
ce(err, "return")