利用golang的ssh.Client包实现远程执行shell命令
一、客户端结构体
type Cli struct {
Host string //客户端地址
Port int //客户端的端口号
User string //连接客户端的用户
Password string //连接客户端的密码
Out []byte //执行结果
}
二、初始化ssh客户端
// 初始化ssh客户端
func (c *Cli) InitClient() (client *ssh.Client, err error) {
Addr := fmt.Sprintf("%s:%d", c.Host, c.Port)
if c.Password != "" {
client, err = ssh.Dial("tcp", Addr, &ssh.ClientConfig{
User: c.User,
Auth: []ssh.AuthMethod{ssh.Password(c.Password)},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
})
if err != nil {
return nil, tracerr.Errorf(fmt.Sprintf("SSH连接异常: %v", err))
}
} else {
keyRaw, err := nacos.GetMatrixConfigItemWithKeyYamlToJson("host-private-key")
if err != nil {
return nil, err
}
signer, err := ssh.ParsePrivateKey(keyRaw)
if err != nil {
return nil, tracerr.Errorf(fmt.Sprintf("解析私钥文件异常: %v", err))
}
client, err = ssh.Dial("tcp", Addr, &ssh.ClientConfig{
User: c.User,
Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
})
if err != nil {
return nil, tracerr.Errorf(fmt.Sprintf("SSH连接异常: %v", err))
}
}
return client, nil
}
三、ssh远程执行shell命令
// ssh远程执行shell命令
func (c *Cli) ExecCmd(cmd string) ([]byte, error) {
client, err := c.InitClient()
if err != nil {
return nil, err
}
session, err := client.NewSession()
if err != nil {
return nil, tracerr.Errorf(fmt.Sprintf("新建会话异常: %v", err))
}
defer client.Close()
c.Out, err = session.CombinedOutput(cmd)
if err != nil {
return nil, tracerr.Errorf(fmt.Sprintf("命令[%s]运行失败: %v", cmd, err))
}
return c.Out, nil
}
实例展示:
func main() {
sshCli := &ssh.Cli{
Host: "192.168.10.11",
Port: 22,
User: "root"
Password: "123456",
}
resultBts, err := sshCli.ExecCmd("cd /root")
if err != nil {
fmt.Println(err)
}
fmt.Println(resultBts)
}