golang-ssh-01:执行远程命令
golang-ssh-01:执行远程命令
![golang-ssh-01:执行远程命令](https://mojotv.cn/assets/image/golang_ssh00.png)
前言
远程执行命令有什么用?为什么要远程执行命令? 如果您只有2,3台服务器需要管理的时候,远程执行命令确实没有没多大作用,您可以登录到每台服务器上去完成各种操作. 当您的服务器大于3台的时候,远程执行的命令的方式就可以大大提高您的生产力了.
如果您有一个可以远程执行命令的工具,那么就可以像操作单台机器那样操作多台机器,机器越多,效率提高的越多. 远程执行命令最常用的方法就是利用 SSH 协议,将命令发送到远程机器上执行,并获取返回结果.
代码
连接包含了认证,可以使用 password
或者 sshkey
2种方式来认证.下面的示例为了简单,使用了密码认证的方式来完成连接.
package main
import (
"fmt"
"github.com/mitchellh/go-homedir"
"golang.org/x/crypto/ssh"
"io/ioutil"
"log"
"time"
)
func main(){
sshHost := "home.xxx.cn"
sshUser := "x"
sshPassword := "xxxxxx"
sshType := "password"//password 或者 key
sshKeyPath := ""//ssh id_rsa.id 路径"
sshPort := 22
//创建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/libragen/felix")
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)