Go语言笔记:使用ssh包作为客户端与SSH服务器交互

news2024/11/28 8:47:08

文章目录

  • 目的
  • 基础说明
  • 使用演示
    • 单次通讯
    • 连续通讯(远程终端)
  • 总结

目的

Golang中可以使用 golang.org/x/crypto/ssh 包作为SSH客户端或者SSH服务使用。这篇文章将简单记录下作为客户端使用的一些内容。

Package ssh implements an SSH client and server.

基础说明

作为客户端与SSH服务器操作上来说主要分为三步:

  • 使用一定的参数与SSH服务器建立连接得到 Client 对象;
  • Client 之上建立会话 Session ,设置会话的输入输出等配置;
  • 通过 Session 进行单次或是连续通讯;

使用演示

单次通讯

SessionRun Output CombinedOutput 方法都可用于单次通讯,下面是个简单的演示:

package main

import (
	"bytes"
	"fmt"
	"log"

	"golang.org/x/crypto/ssh"
)

func main() {
	// 设置客户端请求参数
	// var hostKey ssh.PublicKey
	config := &ssh.ClientConfig{
		User: "root",
		Auth: []ssh.AuthMethod{
			ssh.Password("naisu233"),
		},
		// HostKeyCallback: ssh.FixedHostKey(hostKey),
		HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 忽略主机密钥
	}

	// 作为客户端连接SSH服务器
	client, err := ssh.Dial("tcp", "192.168.31.142:22", config)
	if err != nil {
		log.Fatal("Failed to dial: ", err)
	}
	defer client.Close()

	// 创建会话
	session, err := client.NewSession()
	if err != nil {
		log.Fatal("Failed to create session: ", err)
	}
	defer session.Close()

	// 设置会话标准输出,运行命令
	var b bytes.Buffer
	session.Stdout = &b
	if err := session.Run("cat /proc/cpuinfo"); err != nil {
		log.Fatal("Failed to run: " + err.Error())
	}

	fmt.Println(b.String())
}

在这里插入图片描述

需要注意的是每个 Session 只能进行一次通讯,并且上述的几个方法通讯时会阻塞。另外需要注意的是这几个方法只会在指令运行结束时才会返回结果,不适合用在持续进行的命令中(比如 top 命令)。

连续通讯(远程终端)

连续通讯只要使用 SessionStart Shell 方法,使用这两者时需要使用 Wait 方法来等待结束会话。 Shell 方法可以作为远程终端使用:

package main

import (
	"log"
	"os"

	"golang.org/x/crypto/ssh"
	"golang.org/x/term"
)

func main() {
	// 设置客户端请求参数
	// var hostKey ssh.PublicKey
	config := &ssh.ClientConfig{
		User: "root",
		Auth: []ssh.AuthMethod{
			ssh.Password("naisu233"),
		},
		// HostKeyCallback: ssh.FixedHostKey(hostKey),
		HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 忽略主机密钥
	}

	// 作为客户端连接SSH服务器
	conn, err := ssh.Dial("tcp", "192.168.31.142:22", config)
	if err != nil {
		log.Fatal("unable to connect: ", err)
	}
	defer conn.Close()

	// 创建会话
	session, err := conn.NewSession()
	if err != nil {
		log.Fatal("unable to create session: ", err)
	}
	defer session.Close()

	// 设置会话的标准输出、错误输出、标准输入
	session.Stdout = os.Stdout
	session.Stderr = os.Stderr
	session.Stdin = os.Stdin

	// 设置终端参数
	modes := ssh.TerminalModes{
		ssh.ECHO:          0,     // disable echoing
		ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
		ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
	}

	termWidth, termHeight, err := term.GetSize(int(os.Stdout.Fd())) // 获取当前标准输出终端窗口尺寸 // 该操作可能有的平台上不可用,那么下面手动指定终端尺寸即可
	if err != nil {
		log.Fatal("unable to terminal.GetSize: ", err)
	}

	// 设置虚拟终端与远程会话关联
	if err := session.RequestPty("xterm", termHeight, termWidth, modes); err != nil {
		log.Fatal("request for pseudo terminal failed: ", err)
	}

	// 启动远程Shell
	if err := session.Shell(); err != nil {
		log.Fatal("failed to start shell: ", err)
	}

	// 阻塞直至结束会话
	if err := session.Wait(); err != nil {
		log.Fatal("exit error: ", err)
	}
}

在这里插入图片描述

总结

Golang作为客户端与SSH服务器交互还是比较方便的,实际使用中更多的需要注意阻塞方法以及持续执行的外部程序的处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/528701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT自定义控件折线图、趋势图。

这里提供两种实现方式,一直自绘的自定义控件,一直三方SDK(qcustomplot)。 这里主要介绍自绘的,它的优点是结构简单,代码逻辑好修改,容易定制,缺点是功能相对单一。三方的qcustomplot…

循迹模块(应用于小车)

1.1循迹模块使用 TCRT5000传感器的红外发射二极管不断发射红外线 当发射出的红外线没有被反射回来或被反射回来但强度不够大时, 红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态 被检测物体出现在检测范…

C++ | 数组拷贝

C | 数组拷贝 文章目录 C | 数组拷贝数组名数组拷贝1.对应位拷贝2.地址位移赋值3. memcpy内存拷贝4.字符数组拷贝 Reference 数组名 C数组间赋值不能直接通过数组名称 randy sesame进行,因为数组名并不是指针,大部分情况下,编译器会隐式转换…

使用nvm 管理node.js版本的安装过程

一个 nodejs 版本管理工具!—— nvm 在项目开发过程中,随着框架的不断更新迭代,对一些环境依赖的版本也有影响,部分的老项目可能需要低版本的 node.js 才能正常使用,而后期新开发的项目可能需要更高的 node.js 版本才…

都说2023是测试员的危机年,却不断有人跳槽拿20K+,为什么?

从 2021 年上旬开始触发的经济危机逐渐蔓延到普通人的生活中,裁员、倒闭、跑路俨然已成为刷爆朋友圈的高频热词。随之而来的是一系列因舆论所牵动的各种焦虑感弥漫在人群中,无论是大公司还是之前处于风口浪尖的明星创业公司,几乎无一幸免。聊…

ANR实战案例3 - 应用在部分低端机ANR优化案例

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、Blocked状态1.案例一2.案例二3.案例三 二、高低端机区分1.WebView预加载 三、…

Flink基础介绍-2 架构

Flink基础介绍-1 概述 二、Flink架构2.1 Flink的设计架构2.2 Flink的运行架构2.3 Flink的系统架构 二、Flink架构 2.1 Flink的设计架构 Flink是一个分层的架构系统,每一层所包含的组件都提供了特定的抽象,用来服务于上层组件,Flink的分层体…

搬家货运系统软件开发功能

生活中要用到搬家的场景很多,租房子、买房子、换房子都要搬家,不管是从时间还是专业性上来说,很多人都更愿意找专业的搬家公司来代为处理,于是市面上出现了各类各样的货运搬家软件,让有需求的用户可以直接在线预约搬家…

Java实现网上人才招聘系统【附源码】

网上人才招聘系统 1、概述 3 2、系统分析 4 2.1、问题定义 4 2.2、可行性研究 4 2.2.1、可行性需求分析 4 2.2.2、数据流分析 5 2.2.3、数据字典 6 2.2.4、程序流程图 6 2.2.4、开发进度计划 6 2.3、需求分析 7 2.3.1、功能需求分析 7 2.3.2、数据需求分析 10 2.3.3、性能需求…

Dozer拷贝DO到VO

DO&#xff1a; data object 查出来的数据 VO&#xff1a; value object 要展示的数据&#xff0c;返回给前端的数据 DO查出来的字段比较多&#xff0c;VO过滤一下返回给前端 工具类Dozer <dependency><groupId>com.github.dozermapper</groupId><arti…

Vue3 router路由跳转传参Json数据,隐藏参数Url不显示跳转内容,使用History 来写,setup语法糖的写法

前言&#xff1a;Vue3中 Router的自2022-8-22 日后不能使用 params传参 —— 可以这么写&#xff0c;但是接收的时候会是空值 —— query可以用但不能用隐藏Url地址内的值&#xff0c;所以我们用History来写 history敲不出来的可以看最下面 这个相当于history模式父级调到子集后…

Linux文本三剑客之~~~awk 详细讲解 与date粗略讲解

目录 一. awk工作原理&#xff1a;1.1命令格式:1.2 awk常见的内建变量(可直接用)如下所示: 二 实验示例2.1 按行输出文本2.2按字段输出文本2.3 通过管道符双引号调用shell命令 date命令 一. awk工作原理&#xff1a; 逐行读取文本&#xff0c;默认以空格或tab键为分隔符进行分…

软件测试月薪2万,需要技术达到什么水平?

最近跟朋友在一起聚会的时候&#xff0c;提了一个问题&#xff0c;说一个软件测试工程师如何能月薪达到二万&#xff0c;技术水平需要达到什么程度&#xff1f;人回答说这只能是大企业或者互联网企业工程师才能拿到。也许是的&#xff0c;小公司或者非互联网企业拿二万的不太可…

网络性能监控(NPM)工具

网络是每个企业的支柱。即使在小型或企业级企业中&#xff0c;网络中断期间的生产力损失也可能导致巨大的损失。网络监控解决方案可帮助您预测潜在的中断并主动解决网络问题。这有助于维护无拥塞网络&#xff0c;使您的业务保持正常运行。这可以在网络监控工具的帮助下实现。网…

spring boot 完整后端接口案例

第一章 会员管理项目父模块搭建 1.1 创建模块mengxuegu-member mengxuegu-member 作为所有工程的父工程&#xff0c;用于管理项目的所有依赖。 1.2 添加pom依赖&#xff0c;pom.xml 文件位于&#xff1a;会员管理系统/03-配套资料/pom文件/member-pom.xml <?xml version&…

自建minio实现doris的快速备份与恢复

一.概述 doris支持通过腾讯云bos、阿里云oss、hdfs实现备份与恢复&#xff0c;但是我们公司doris部署在线下机房&#xff0c;如采用oss/bos, 大数据备份与恢复比较慢&#xff0c;会占用一定的带宽&#xff0c;如采用hdfs&#xff0c;担心小文件太多影响现有的hadoop集群。为了保…

C# Forecast 预测数据方法,MathNet.Numerics学习分享

Forecast 数据预测 /// <summary>/// 数据预测/// </summary>/// <param name"xValues">数据序列</param>/// <param name"yValues">数据值</param>/// <param name"forecastPoint">第N个预测序列<…

腾讯面试经验,岗位是C++后端

分享一篇腾讯面经&#xff0c;岗位是C后端&#xff0c;考察的内容是C、Redis、网络。 c shared_ptr的原理 答&#xff1a;内部的共享数据和引用计数实现 补充&#xff1a; shared_ptr多个指针指向相同的对象。shared_ptr使用引用计数&#xff0c;每一个shared_ptr的拷贝都…

【瑞萨RA系列FSP库开发】RASC+Keil的环境搭建

文章目录 一、获取资源包二、安装 Keil 软件、RA 芯片包和 RASC三、RASC 集成到 Keil四、使用 RASC 生成 Keil 工程五、通过 Keil 打开 RASC 的 FSP 配置器界面六、配置和编译 Keil 工程七、使用调试器下载程序 本节将介绍如何在Keil上开发瑞萨RA MCU &#xff08;如需了解 e2 …

元宇宙虚拟展馆和VR的关系与区别

元宇宙是指一个数字化的虚拟世界&#xff0c;这个世界由虚拟现实、增强现实等多种技术构建而成。这个世界中&#xff0c;人们可以用虚拟身份在其中自由穿梭&#xff0c;享受到与现实世界不同的多样化和极致体验。虚拟现实&#xff08;VR&#xff09;则是一种技术手段&#xff0…