이 상기 실시 예의 변형/완전한 버전이다
https://code.google.com/p/go/source/browse/ssh/example_test.go?repo=crypto
구체적 : I부터 실시 예를 다음과 같이은 상당히 단순
package main
import (
"bufio"
"bytes"
"fmt"
"os"
"strings"
"golang.org/x/crypto/ssh"
"golang.org/x/crypto/ssh/terminal"
)
func main() {
if len(os.Args) < 3 {
usage := "\n./remote-ssh {host} {port}"
fmt.Println(usage)
} else {
host := os.Args[1]
port := os.Args[2]
username, password := credentials()
config := &ssh.ClientConfig{
User: username,
Auth: []ssh.AuthMethod{
ssh.Password(password),
},
}
connectingMsg := fmt.Sprintf("\nConnecting to %s:%v remote server...", host, port)
fmt.Println(connectingMsg)
hostAddress := strings.Join([]string{host, port}, ":")
// fmt.Println("Host add %s ", hostAddress)
client, err := ssh.Dial("tcp", hostAddress, config)
if err != nil {
panic("Failed to dial: " + err.Error())
}
for {
session, err := client.NewSession()
if err != nil {
panic("Failed to create session: " + err.Error())
}
defer session.Close()
// Once a Session is created, can execute a single command on remote side
var cmd string
str := "\nEnter command (e.g. /usr/bin/whoami OR enter 'exit' to return) : "
fmt.Print(str)
fmt.Scanf("%s", &cmd)
if cmd == "exit" || cmd == "EXIT" {
break
}
s := fmt.Sprintf("Wait for command '%s' run and response...", cmd)
fmt.Println(s)
var b bytes.Buffer
session.Stdout = &b
if err := session.Run(cmd); err != nil {
panic("Failed to run: " + err.Error())
}
fmt.Println(b.String())
}
}
}
func credentials() (string, string) {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter Username: ")
username, _ := reader.ReadString('\n')
fmt.Print("Enter Password: ")
bytePassword, err := terminal.ReadPassword(0)
if err != nil {
panic(err)
}
password := string(bytePassword)
return strings.TrimSpace(username), strings.TrimSpace(password)
}
https://play.golang.org/p/4Ad1vKNXmI
'stdin'에서 암호를 읽지 않기 때문에'ssh'를 사용하면이 작업을 매우 쉽게 할 수 있습니다. http://stackoverflow.com/q/1340366을 참조하십시오. 가장 좋은 옵션은 키 쌍을 생성하고이를 사용하여 인증하는 것 같습니다. –
이전에 파이썬에서이 작업을 시도했습니다. 나는 [Paramiko] (http://www.lag.net/paramiko/)를 사용하여 작동시킬 수있었습니다. [go.crypto/ssh] (http://godoc.org/code.google.com/p/go.crypto/ssh)로 시도해야합니다. –
stdin과 stdout을 처리하는 법을 잘 알고있는 것 같습니다. 문제는 당신의 코드에있는 것이 아니라 ssh가 쉘이나 tty에서 돌아 가지 않는다는 것을 감지했을 때 다른 행동을하기 때문에 발생합니다. 암호 대신 인증서 인증을 사용해야합니다. –