golang ssh 登录网络设备

背景

如何通过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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值