导语:需要通过ssh私钥登录到服务器上执行命令并返回结果
直接上代码
package main
import (
"fmt"
"io/ioutil"
"log"
"time"
"github.com/mitchellh/go-homedir"
"golang.org/x/crypto/ssh"
)
func main() {
sshHost := "192.168.10.82"
sshUser := "root"
sshPassword := ""
sshType := "key" //password 或者 key
sshKeyPath := "./id_rsa" //ssh id_rsa.id 路径"
sshPort := 22
//if sshUser == "" { // 设置默认用户
// sshUser = "root"
//}
//
//if sshKeyPath == "" { // 设置默认私钥路径
// userHome, _ := os.UserHomeDir()
// sshKeyPath = fmt.Sprintf("%s/.ssh/id_rsa", userHome)
//}
//创建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("whoami;cd / ; ls -al;echo https://github.com/dejavuzhou/felix") // ls -al 可能返回会卡住
combo, err := session.CombinedOutput("whoami;pwd")
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)
}
return ssh.PublicKeys(signer)
}
参考
https://github.com/golang/crypto/blob/master/ssh/example_test.go
https://studygolang.com/articles/20582