背景
如何通过go登录网络设备了,go提供了一个 golang.org/x/crypto/ssh 的包供大家使用,一起来看看如何使用吧。
系统环境
- win11
- go-1.8
安装go
前往官方下载并安装对应版本: https://golang.google.cn/
编译软件(vscode)
前往官方下载并安装对应版本: https://code.visualstudio.com/Download
安装go插件
注意事项
go 与 python不同不需要提前下载包,可以直接调用,调用时会下载包,建议先将包下载至本地以免报错,通过下面三条命令构建环境及下载包
go mod init hello // 使用`go mod init hello`初始化生成 go.mod 文件
go mod tidy // 添加需要用到但go.mod中查不到的模块
go mod vendor // 将新增的依赖包自动写入当前项目的 vendor 目录,下载依赖
构建完成后有这几个文件夹
推送命令
推送一条命令至设备
package main
import (
"bytes"
"fmt"
"log"
"golang.org/x/crypto/ssh"
)
func main() {
// 定义设备连接设备
config := &ssh.ClientConfig{
User: "admin",
Auth: []ssh.AuthMethod{ssh.Password("123")},
// 不验证服务器
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
// 连接设备
client, err := ssh.Dial("tcp", "10.100.0.101:22", config)
if err != nil {
log.Fatal("Failed to dial: ", err)
}
// 每个客户端连接支持多个交互会话,由会话表示,创建一个新会话
session, err := client.NewSession()
if err != nil {
log.Fatal("Failed to create session: ", err)
}
// 释放资源
defer client.Close()
// 定义b 变量用于存储日志信息
var b bytes.Buffer
// 将b变量指向会话的标准输出
session.Stdout = &b
// Run方法一般用于查询命令,只能执行一条命令,另外run命令已经高度集成了多个方法。
if err := session.Run("show ip int brief"); err != nil {
log.Fatal("Failed to run: " + err.Error())
}
// 打印日志
fmt.Println(b.String())
// 关闭会话
session.Close()
}
在终端下执行:
go run .\login_sw.go
回显如下:
推送多条命令至设备
package main
import (
"fmt"
"log"
"os"
"golang.org/x/crypto/ssh"
)
func main() {
user := "admin"
pass := "123"
targethost := "10.100.0.100:22"
config := &ssh.ClientConfig{
User: user,
Auth: []ssh.AuthMethod{
ssh.Password(pass),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
conn, err := ssh.Dial("tcp", targethost, config)
if err != nil {
log.Fatal("Failed to dial: ", err)
}
sess, err := conn.NewSession()
if err != nil {
log.Fatal("Failed to create session: ", err)
}
// StdinPipe方法返回一个管道,该管道将在命令启动时连接到远程命令的标准输入。
stdin, _ := sess.StdinPipe()
// 读取标准输入
sess.Stdout = os.Stdout
// 读取标准错误
sess.Stderr = os.Stderr
sess.Shell()
// 通过数组定义多条命令
cmds := []string{
"screen-length 0 temporary",
"display ip int brief",
"display clock",
"quit"}
// 循环指向数组中的命令
for _, cmd := range cmds {
fmt.Fprintf(stdin, "%s\n", cmd)
}
// 等待命令指向完成
sess.Wait()
sess.Close()
}
回显如下:
参考文档
https://pkg.go.dev/golang.org/x/crypto/ssh#Client