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

2023-11-02

目的

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服务器交互还是比较方便的,实际使用中更多的需要注意阻塞方法以及持续执行的外部程序的处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang笔记:使用ssh包作为客户端与SSH服务器交互 的相关文章

  • GoLang ssh:尽管将其设置为 nil,但仍出现“必须指定 HosKeyCallback”错误

    我正在尝试使用 GoLang 连接到远程服务器 在客户端配置中 除了用户和密码之外 我将 HostKeyCallback 设置为 nil 以便它接受每个主机 config ssh ClientConfig User user HostKey
  • Ansible bitbucket 克隆存储库配置 ssh 错误

    我之前发布过这个问题 但那里的答案不再有效 总之 当使用 Ansible 配置我的 vagrant box 时 在尝试使用 ssh 克隆我的 bitbucket 私有存储库时 我遇到了一个神秘的错误 该错误指出 权限被拒绝 公钥 然而 如果
  • 使用 ChannelExec 的命令未执行 - Jsch

    我正在使用 Jsch 在服务器中创建一个文件并执行一些命令 对于文件创建 它工作正常 但是对于命令执行 则不然 它保持状态 1 仍在处理它 并永远保持该状态 这种情况发生在 shell 执行或我尝试成为 root 时 请按照以下方法操作 p
  • ssh远程变量赋值?

    以下内容对我不起作用 ssh email protected cdn cgi l email protection k 5 echo k 它只是返回一个空行 如何在远程会话 ssh 上分配变量 Note 我的问题是not关于如何将本地变量传
  • 使用 ssh-keygen 创建 SSH 密钥不会创建 .ssh 文件夹

    我正在尝试使用 msysgit 创建我的公共 私有 rsa 密钥对 我运行这个命令 ssh keygen C email protected cdn cgi l email protection t rsa 一切看起来都很好 我收到消息了
  • 如何使用ssh直接连接远程docker容器

    我想直接使用 ssh 连接到远程运行的 Docker 容器 通常我可以 ssh i privateKey user host docker ps which will list all running containers docker e
  • Ruby,通过 SSH 和 LOG 逐一运行 linux 命令

    我想用 Ruby 女巫 net ssh 编写代码 在远程 Linux 机器上一一运行命令并记录所有内容 在 Linux 机器上称为命令 stdout 和 stderr 所以我写函数 def rs ssh cmds cmds each do
  • Powershell Invoke-SSHCommand:使用“1”个参数调用“EndExecute”时出现异常

    我正在尝试通过 powershell 中的 Posh SSH 模块连接到 Netscaler SDX 服务器 以搜索特定文件 然后下载它 如果我用 putty 连接到服务器 它就可以工作 然后我可以输入 shell 来打开普通的 bash
  • 通过 ssh 运行 Bash 脚本

    我正在尝试编写一个 Bash 脚本 它将通过 SSH 连接到计算机并创建一个目录 长期目标有点复杂 但现在我从简单的开始 然而 虽然很简单 但我似乎不太明白 这是我的代码 bin bash ssh T email protected cdn
  • 使用 JSch 分别为各个提示提供输入

    问题是 SSH 连接需要在常规登录后提供另一个用户 ID 和密码信息 我正在使用 JSch 连接到远程服务器 它接受以下形式的输入InputStream 和这个InputStream只能通过一次 由于会话是交互式的 这会导致问题 我尝试将输
  • 通过 SSH 的 sbt (Scala) 结果找不到命令,但如果我自己这样做就可以工作

    所以我正在尝试做一些涉及跑步的事情sbt通过 SSH 命令 这就是我正在尝试的 ssh my username
  • SVN 不断提示我输入密码并拒绝缓存我的凭据

    环境 Eclipse Indigo Ubuntu 11 04 Subclipse 1 6 SVN 客户端 Subclipse RabbitVCS 我通过 svn ssh 连接 我的网址如下所示 svn ssh 我的名字 我的域名 路径 我可
  • 无法在 PHP 中使用 SFTP

    我正在用 PHP 编写一个简单的 SFTP 客户端 因为我们需要通过 n 个远程服务器以编程方式检索文件 我正在使用 PECL SSH2 扩展 不过 我遇到了障碍 php net 上的文档建议您可以这样做 stream fopen ssh2
  • VS 代码 ssh;服务器安装路径

    我正在尝试更改 VS Code 服务器文件夹安装位置 该功能最近已实现 我找到了以下参考资料 1 https github com microsoft vscode remote release issues 472 2 https sta
  • 关于使用Python启动SSH隧道的问题

    我在从用 Python 编写的 HTTP RPC 服务器启动 SSH 隧道时遇到了麻烦 基于Python的BaseHTTPServer 有一个用Python编写的简单的HTTP RPC服务器 作为其中一项服务的一部分 我想启动从 RPC 服
  • 在 Google Compute Engine 上访问 FTP

    我正在 debian 7 wheezy 上运行一个实例 而且我对 Google 计算引擎有点陌生 我浏览了该网站上的支持请求以及 Google 网站上的常见问题解答帖子 然而我没有发现任何我可以完全遵循的东西 我对 Linux 有一点了解
  • 使用knife ec2插件在VPC私有子网中创建虚拟机

    尽管我已经写了相当多的 Chef 文章 但我对 AWS VPC 和管理网络流量 尤其是堡垒主机 还相当陌生 使用 Knife ec2 插件 我希望能够从我的开发人员工作站动态创建和引导虚拟机 VM 应能够存在于我的 VPC 的公有子网或私有
  • MySQL Workbench(版本 6.0.8)SSH 身份验证问题

    我正在尝试通过 SSH 通过计算机 Y 连接到主机 X 上的 MySQL 服务器 相同的设置 但 MySQL 工作台的版本较旧 适用于我的另一个机器 CentOS 6 3 但是 相同的设置在我的 CentOS 6 5 上不起作用 我尝试使用
  • 如何通过ssh获取远程命令的退出代码

    我正在通过 ssh 从远程计算机运行脚本 ssh some cmd my script 现在 我想在本地计算机上存储 shell 脚本的退出状态 我该怎么做 假设没有任何问题ssh其本身 其退出状态是在远程主机上执行的最后一个命令的退出状态
  • 允许 Amazon VPC A 访问 VPC B 上的新私有子网吗?

    我有一个现有的 VPC vpcA 并且最近设置了一个新的 VPC vpcB 同时具有私有子网 privateSubnet 和公共子网 publicSubnet 我想允许来自以下位置的连接vpcA to vpcB vpcB设置了堡垒服务器以允

随机推荐

  • 由浅入深理解区块链技术

    一 区块链技术概述 区块链技术的核心思想与密码朋克组织的渊源很深 这个组织由一批致力于个人隐私保护的密码学爱好者组成 他们认为在互联网环境下想要保护个人隐私 应该使用基于技术的而非其他组织背书的加密方法 不能够全部依靠大型机构提供的加密工具
  • STM32使用SRAM扩展内存

    目录 一 SRAM介绍 二 STM32F103系列的FSMC模块 三 初始化配置及数据访问 四 使全局变量定义在外部SRAM中的方法 五 参考文章及资料 一 SRAM介绍 SRAM Static Random Access Memory 即
  • mesh学习1

    TOC 基础一 初识基础 首先点和面的联系 三个点构成一个小三角形 然后面就是由无数的小三角形构成 另外相同位置的顶点可以复用 就像一个正方形 四个点即可 三角面有正反之分 关键看法线方向 发现朝外的 我们能看到 反过来就看不到了 可以参考
  • Java利用ASCII码转换英文字母遇到的小问题

    public class Seconde public static void main String args int a 65 b 97 for int i 1 i lt 26 i a 1 b 1 System out println
  • 最大公约数和最小公倍数问题(3月30日)

    一 给出xo和yo 找两个数满足 xo是这两个数的最小公约数 yo是这两个数的最小公倍数 首先题目给的数据是 2 lt x0 lt 100000 2 lt y0 lt 1000000 如果用双层for循环的话一看就会直接超时 二 对于求最大
  • 93个springboot计算机毕业设计程序汇总大全,毕设练手必备。

    在选择计算机毕业设计题目和项目的时候 你是否曾经感到迷茫和犹豫不决 你知道怎样的项目才是既具有不重复性又能成功的吗 今天 我们将给即将毕业的同学分享一些毕业设计项目 希望对你的毕业设计有所帮助 一 成品列表 以下所有springboot框架
  • TensorFlow入门 - 变量(Variables)

    训练模型时 需要使用变量 Variables 保存和更新参数 Variables是包含张量 tensor 的内存缓冲 变量必须要先被初始化 initialize 而且可以在训练时和训练后保存 save 到磁盘中 之后可以再恢复 restor
  • 科普:PCI-E插槽都有哪些样子?

    主板上的扩展插槽曾经是多种多样的 例如曾经非常流行的组合就是PCI插槽搭配AGP插槽 其中AGP插槽主要用在显卡上 而PCI插槽的用途则更广一些 不仅有用在显卡上 还能用于扩展其它设备 如网卡 声卡 调制解调器等等 这两种插槽曾经共同为广大
  • RSYNC介绍 、备份、自动备份 脚本编写

    RSYNC 简介 rsync 是一个远程同步 是一个开源的快速安全高效的异地备份工具 可以在不同的主机之间镜像同步整个目录树 支持增量备份 有保持链接和权限功能 且采用优化的同步算法 传输前执行压缩 因此非常适合异地备份 镜像服务等应用 也
  • linux虚拟机开放端口号,虚拟机centos7开放端口

    1 先查看防火墙是否开启的状态 以及开放端口的情况 systemctl status firewalld service 查看防火墙开启还是关闭 sudo firewall cmd list all 可以查看端口开放情况 firewall
  • 超简单制作多系统启动U盘教程

    超简单制作多系统启动U盘教程 文章目录 超简单制作多系统启动U盘教程 前言 基本配置 配置PE系统 配置其他操作系统 前言 这两天心血来潮 本来想用Win to go做一个windows便携系统 B站教程无意间发现Ventoy软件 可谓功能
  • 套接字多种可选项

    Windows平台 WSADATA wsaData int iResult WSAStartup MAKEWORD 2 2 wsaData if iResult NO ERROR printf Error at WSAStartup n C
  • 虚拟机centos6.4网络连接设置--桥接设置

    Windows 本机虚拟网卡设置 虚拟机安装完成之后 在 本机网络设置里面出现 两个网卡VMware Network Adapter VMnet1和VMware Network Adapter Vmnet8 联网用Vmnet8 设置连接网络
  • PHP Smarty如何进行调试和错误处理?

    欢迎来到PHP Smarty的世界 如果你在这里寻求如何调试和错误处理的方法 那么我可以向你保证 我们会让这个过程尽可能的有趣和轻松 首先 让我们先来谈谈调试 在Smarty中 你可以使用以下几种方法来进行调试 使用Smarty的debug
  • Centos7 安装MongoDB5

    1 mongodb安装 MongoDB的下载网址 Download MongoDB Community Server MongoDB 下载完安装包之后上传到系统 然后解压 tar xf mongodb linux x86 64 rhel80
  • 灰色预测GM(1,1)代码

    目录 1 一项初始序列X0 2 累加序列 生成新序列 3 紧邻均值生成序列 4 求相关参数 5 由第四步求出参数 6 生成预测模型 7 累减还原 得原始数列的灰色预测值 8 模型检验 9 可视化 结果分析 1 一项初始序列X0 import
  • 数据库事务

    事务 TRANSACTION 是作为单个逻辑工作单元执行的一系列操作 这些操作作为一个整体一起向 系统提交 要么都执行 要么都不执行 事务是一个不可分割的工作逻辑单元 事务必须具备以下四个属性 简称 ACID 属性 原子性 Atomicit
  • 解决Could not connect to Redis at 39.101.74.81:6379: ConnectinectionException: Failed to create socket

    1 修改redis conf文件 1 注释掉原先的 bind 127 0 0 1 2 将protected mode yes 修改为no 2 查看是否开启6379端口号 firewall cmd list ports 没开启的话开启 fir
  • 从DB Browser for SQLite导出.csv文件

    如何从 db数据库文件中导出某个表的 csv文件 一般的 后台收集的日志保存在数据库中 查找日志时候需要打开 db文件的数据库 使用DB Browser for SQLite这个软件可以打开和查看数据库表以及数据 使用DB Browser
  • Golang笔记:使用ssh包作为客户端与SSH服务器交互

    文章目录 目的 基础说明 使用演示 单次通讯 连续通讯 远程终端 总结 目的 Golang中可以使用 golang org x crypto ssh 包作为SSH客户端或者SSH服务使用 这篇文章将简单记录下作为客户端使用的一些内容 Pac