一、搭建go运行环境
# wget https://go.dev/dl/go1.17.6.linux-amd64.tar.gz
# tar zxvf go1.17.6.linux-amd64.tar.gz -C /usr/local/
# vi /etc/profile
# golang
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
# . /etc/profile
# mkdir -p /root/go/project01
# cd /root/go/project01
# go mod init project01
执行示例文件,验证环境
[root@localhost project01]# cat main.go
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("ls")
out, err := cmd.Output()
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(string(out))
}
# [root@localhost project01]# go run main.go
go.mod
go.sum
main.go
二、远程调用Linux系统并执行命令
package main
import (
"fmt"
"golang.org/x/crypto/ssh"
"log"
"time"
)
func pwdConnect(sshHost, sshUser, sshPassword string, sshPort int) (*ssh.Client, error) {
// 创建ssh登录配置
config := &ssh.ClientConfig{
Timeout: 5 * time.Second, // 超时时间
User: sshUser, // 登录账号
Auth: []ssh.AuthMethod{ssh.Password(sshPassword)}, // 密码
HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 这个不够安全,生产环境不建议使用
//HostKeyCallback: ssh.FixedHostKey(), // 建议使用这种,目前还没研究出怎么使用[todo]
}
// dial连接服务器
addr := fmt.Sprintf("%s:%d", sshHost, sshPort)
Client, err := ssh.Dial("tcp", addr, config)
if err != nil {
log.Fatal("连接到服务器失败", err)
return nil, err
}
//defer sshClient.Close()
return Client, nil
}
func main() {
// 连接到服务器
conn, err := pwdConnect("192.168.237.128", "root", "password", 22)
if err != nil {
return
}
defer conn.Close()
// 创建 ssh session 会话
session, err := conn.NewSession()
if err != nil {
panic(err)
}
defer session.Close()
// 执行远程命令
cmd := "date;hostname"
cmdInfo, err := session.CombinedOutput(cmd)
if err != nil {
panic(err)
}
fmt.Println(string(cmdInfo))
}