0
点赞
收藏
分享

微信扫一扫

使用go远程调用Linux主机

juneyale 2023-05-09 阅读 82

一、搭建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))
}



举报

相关推荐

0 条评论