需要用到的第三方包"golang.org/x/crypto/ssh",go版本不同这个包用的也不一样 :
如果go版本是1.20以后版本的使用(我验证的是1.23版本)
链接: https://pan.baidu.com/s/162Y0lJ8wsRTxEGMThHiZJQ?pwd=94gf
如果go版本是1.20以前版本的使用(我验证的是1.17版本)
链接: https://pan.baidu.com/s/14acuzDkj2ba0WUkeVE3JYw?pwd=r3bd
具体代码如下
package main
import (
"dateSshSys/util"
"fmt"
"strconv"
"strings"
"time"
)
func main() {
worksSsh("192.168.101.84", "Lenovo", "******", 22)
}
func worksSsh(sshHost, sshUser, sshPassword string, sshPort int) {
// 连接到服务器
conn, err := util.GetPwdConnect(sshHost, sshUser, sshPassword, sshPort)
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
cmd := "date +%s"
strInfo, err1 := util.SessionRun(conn, cmd)
if err1 != nil {
return
}
strInfoList := strings.Split(strInfo, "\n")
fmt.Println(strInfoList)
i64, _ := strconv.ParseInt(strings.ReplaceAll(strInfoList[0], "\n", ""), 10, 64)
timestamp := time.Now().Unix()
fmt.Println("====1::::", timestamp, i64, timestamp-i64)
if timestamp-i64 > 59 || timestamp-i64 < -59 {
fmt.Println("====2::::", timestamp, i64, timestamp-i64)
t := time.Unix(timestamp, 0)
timestampStr := t.Format("2006-01-02 15:04") // 例如: 2006-01-02 15:04:05 是Go时间的标准格式
timestampStr = strings.ReplaceAll(timestampStr, "-", "")
timestampStr = strings.ReplaceAll(timestampStr, ":", "")
cmd2 := "date -s '" + timestampStr + "'"
fmt.Println(timestampStr, cmd2)
//
strInfo2, err2 := util.SessionRun(conn, cmd2)
if err2 != nil {
return
}
fmt.Println("123:::", strInfo2)
}
}
工具go文件
package util
//cmd1 := exec.Command("sh", "-c", "date +%s")
//cmd := exec.Command("bash","-c","ls ~ | grep .zip")
//cmd := exec.Command("cmd", "/C", "echo", "Hello, World!")
//out, _ := cmd1.Output()
import (
"bufio"
"fmt"
"golang.org/x/crypto/ssh"
"time"
)
// GetPwdConnect SSH配置信息
func GetPwdConnect(sshHost, sshUser, sshPassword string, sshPort int) (*ssh.Client, error) {
// 创建ssh登录配置
config := &ssh.ClientConfig{
Timeout: 30 * 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)
fmt.Println("连接到服务器失败:::", err)
return nil, err
}
//defer sshClient.Close()
return Client, nil
}
func SessionRun(conn *ssh.Client, cmd string) (string, error) {
// 创建 ssh session 会话
session, err := conn.NewSession()
if err != nil {
fmt.Println("连接错误:::", err)
//panic(err)
}
defer session.Close()
// 执行命令
stdout, err1 := session.StdoutPipe()
if err1 != nil {
fmt.Println("通道错误:", err1)
return "", err1
}
if err2 := session.Run(cmd); err2 != nil {
fmt.Println("执行命令:", err2)
return "", err2
}
// 读取输出
scan := bufio.NewScanner(stdout)
strInfo := ""
for scan.Scan() {
strInfo = strInfo + scan.Text()
}
if err3 := scan.Err(); err3 != nil {
fmt.Println("错误打印:", err3)
return "", err3
}
// 关闭连接
//if err4 := session.Close(); err4 != nil {
// fmt.Println("关闭连接错误:", err4)
// return "", err4
//}
return strInfo, nil
}
演示程序:
链接: https://pan.baidu.com/s/12paBLDUz2FhV21QcnNVYoA?pwd=b9ih