初学 Golang,打算用它写个服务器批量执行命令的程序,在远程 ssh 登录的时候出现了报错:ssh: handshake failed: EOF
演示代码
- 
package main
 - 
import (
 - 
"fmt"
 - 
"golang.org/x/crypto/ssh"
 - 
"log"
 - 
"time"
 - 
)
 - 
func main() {
 - 
sshHost := "10.0.88.66"
 - 
sshUser := "root"
 - 
sshPassword := "123456"
 - 
sshType := "password" //password 或者 key
 - 
sshPort := 22
 - 
////创建sshp登陆配置
 - 
config := &ssh.ClientConfig{
 - 
Timeout: time.Second * 3,
 - 
User: sshUser,
 - 
HostKeyCallback: ssh.InsecureIgnoreHostKey(), //这个可以, 但是不够安全
 - 
//HostKeyCallback: hostKeyCallBackFunc(h.Host),
 - 
}
 - 
if sshType == "password" {
 - 
config.Auth = []ssh.AuthMethod{ssh.Password(sshPassword)}
 - 
}
 - 
//dial 获取ssh client
 - 
addr := fmt.Sprintf("%s:%d", sshHost, sshPort)
 - 
sshClient, err := ssh.Dial("tcp", addr, config)
 - 
if err != nil {
 - 
log.Fatal("创建ssh client 失败", err)
 - 
}
 - 
defer sshClient.Close()
 - 
//创建ssh-session
 - 
session, err := sshClient.NewSession()
 - 
if err != nil {
 - 
log.Fatal("创建ssh session 失败", err)
 - 
}
 - 
defer session.Close()
 - 
//执行远程命令
 - 
combo, err := session.CombinedOutput("ls -lh")
 - 
if err != nil {
 - 
log.Fatal("远程执行cmd 失败", err)
 - 
}
 - 
log.Println("命令输出:", string(combo))
 - 
}
 
解决办法:
ssh 虽然经常用,但协议层面我了解不多;出现这个问题的原因好像挺多的,如果你也遇到,可以尝试换个加密算法;
在配置里面更换一种算法,成功解决问题,希望能够帮到您。
- 
config.Ciphers = append(config.Ciphers, "aes128-ctr")
 
小林博客





