package main import ( "fmt" "io/ioutil" "log" "time" "github.com/mitchellh/go-homedir" "golang.org/x/crypto/ssh" ) func main() { sshHost := "119.28.163.42" sshUser := "root" sshPassword := "" sshType := "key" //password 或者 key sshKeyPath := "/root/.ssh/id_rsa" //ssh id_rsa.id 路径" sshPort := 7721 //创建sshp登陆配置 config := &ssh.ClientConfig{ Timeout: time.Second, //ssh 连接time out 时间一秒钟, 如果ssh验证错误 会在一秒内返回 User: sshUser, HostKeyCallback: ssh.InsecureIgnoreHostKey(), //这个可以, 但是不够安全 //HostKeyCallback: hostKeyCallBackFunc(h.Host), } if sshType == "password" { config.Auth = []ssh.AuthMethod{ssh.Password(sshPassword)} } else { config.Auth = []ssh.AuthMethod{publicKeyAuthFunc(sshKeyPath)} } //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("ifconfig") if err != nil { log.Fatal("远程执行cmd 失败", err) } log.Println("命令输出:", string(combo)) } func publicKeyAuthFunc(kPath string) ssh.AuthMethod { //交叉编译打开文件 keyPath, err := homedir.Expand(kPath) if err != nil { log.Fatal("find key's home dir failed", err) } //读文件 key, err := ioutil.ReadFile(keyPath) if err != nil { log.Fatal("ssh key file read failed", err) } //解析为一个对象 // Create the Signer for this private key. signer, err := ssh.ParsePrivateKey(key) if err != nil { log.Fatal("ssh key signer failed", err) } //放入key对象 生成一个指针 return ssh.PublicKeys(signer) }