GO--SSH连接实现
前提
生成密钥
分发密钥
root@ubuntu2204-244:~# ssh-copy-id 192.168.139.244
root@ubuntu2204-244:~# ssh-copy-id 192.168.139.241
代码目录
具体Go代码
package main
import (
"fmt"
"golang.org/x/crypto/ssh"
"os"
"time"
)
type message struct {
User string
Host string
Prkey string
Port int
Commond string
}
// 实现方式一: 通过结构体方法的形式实现
func (m *message) SSHConnectWithKey() (string, error) {
// 读取私钥文件
key, err := os.ReadFile(m.Prkey)
if err != nil {
return "", err
}
// 解析私钥
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
return "", err
}
// 创建SSH客户端配置
config := &ssh.ClientConfig{
User: m.User,
Auth: []ssh.AuthMethod{
ssh.PublicKeys(signer),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
// 连接到SSH服务器
client, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", m.Host, m.Port), config)
if err != nil {
return "", err
}
defer client.Close()
// 创建SSH会话
session, err := client.NewSession()
if err != nil {
return "", err
}
defer session.Close()
// 执行命令
output, err := session.CombinedOutput(m.Commond)
if err != nil {
return "", err
}
fmt.Println(string(output))
return string(output), nil
}
// 实现方式一: 通过函数的形式实现
func RunShell(addr string, shell string) (string, error) {
privekey, _ := os.ReadFile("./test/id_rsa")
signer, err := ssh.ParsePrivateKey(privekey)
config := &ssh.ClientConfig{
User: "root",
Auth: []ssh.AuthMethod{
ssh.PublicKeys(signer),
},
Timeout: 2 * time.Second,
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
session, err := ssh.Dial("tcp", addr, config)
if err != nil {
fmt.Printf("连接主机异常-%v:%v\n", addr, err)
return "", err
}
defer session.Close()
newSession, err := session.NewSession()
if err != nil {
fmt.Printf("获取主机回话信息失败:%v\n", err)
return "", err
}
defer newSession.Close()
output, err := newSession.Output(shell)
if err != nil {
fmt.Printf("命执行失败,执行命令:%v 异常信息:%v\n", shell, err)
return "", err
}
return string(output), err
}
func main() {
// 实现方法一
var con message
con.Host = "192.168.139.241"
con.User = "root"
con.Port = 22
con.Prkey = "./test/id_rsa"
con.Commond = "touch 192.168.139.241.txt && ls -l"
con.SSHConnectWithKey()
// 实现方法二
shell, err := RunShell("192.168.139.244:22", "touch 192.168.139.244.txt && ls -l")
if err != nil {
panic(err)
}
fmt.Println(shell)
}
输出结果
C:\Users\TH\AppData\Local\Temp\GoLand\___go_build_main_go__3_.exe
total 4
-rw-r--r-- 1 root root 0 Apr 15 21:04 192.168.139.241.txt
drwx------ 3 root root 4096 Mar 22 11:17 snap
total 4
-rw-r--r-- 1 root root 0 Apr 15 21:04 192.168.139.244.txt
drwx------ 3 root root 4096 Mar 22 11:17 snap


文章评论