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")