一文理清sshc包的使用场景和掌握两种连接方式及异常场景

news2024/11/23 13:35:54

一文理清sshc、ssh包的使用场景和两种连接方式

  • SSH协议
      • SSH(Secure Shell)协议支持通过多种编程语言实现客户端和服务端的功能,包括Go、Python、Java、C#等。
  • GO语言 sshc包的使用
    • 建立连接
      • 1.DialWithKey
      • 2.DialWithPasswd
    • 运行命令
    • 异常场景
      • 思维导图

SSH协议

在实际工作中我们往往需要通过各种语言实现SSH客户端和服务端的功能。

SSH(Secure Shell)协议支持通过多种编程语言实现客户端和服务端的功能,包括Go、Python、Java、C#等。

在网络通信领域,SSH协议因其出色的安全性和广泛的应用场景而成为远程管理服务器不可或缺的工具。从系统管理员到开发人员,不同背景的用户都依赖于SSH来实现安全的文件传输、命令执行以及环境配置等。接下来介绍一下使用不同编程语言实现SSH客户端和服务端的具体方式:

  • Go:通过golang.org/x/crypto/ssh包,Go语言提供了丰富的API来创建SSH客户端和服务端。如搜索结果中的示例代码所示,开发者可以建立连接、认证、执行远程命令等操作。

  • Python:Python的paramiko库是构建SSH客户端的常用方式。它提供了一个简单的方法来连接SSH服务器并执行命令,同时支持密钥认证等多种认证方式。

  • Java:Java生态中,JSch是一个流行的纯Java实现的SSH2客户端,允许连接到一个SSH服务器并执行命令、文件传输等操作。

  • C#:对于.NET环境,可以使用SSH.NET库来实现SSH功能。这个库提供了SCP客户端和服务器端的实现,支持SSH文件传输。

  • JavaScript:Node.js环境中,可以使用ssh2库来实现SSH客户端。它支持异步调用,适用于需要长时间运行SSH会话的场景。

  • C++:虽然不如其他语言流行,但C++也有像libssh这样的库,为C和C++开发者提供SSH功能的实现。

了解各种语言的SSH实现不仅有助于跨平台的应用程序开发,还能提高开发效率,特别是在进行自动化部署、配置管理和远程监控任务时。每种语言的SSH实现都有其特点,开发者应根据具体需求和环境选择最合适的工具。

综上所述,通过各种编程语言实现SSH客户端和服务端的功能不仅展示了SSH协议的灵活性和强大性,也为开发者提供了广泛的选择来满足不同的应用需求。无论是在系统运维、自动化测试还是日常开发中,合理利用这些工具都能显著提高工作的效率和安全性。

这里给大家介绍一下GO语言的crypto/ssh、sshc使用场景以及两种连接方式举例。

GO语言 sshc包的使用

golang.org/x/crypto/ssh 包为Go语言开发者提供了实现SSH客户端和服务端的功能。在现代的软件开发中,远程操作和管理服务器是一项常见的需求,而SSH协议是这一过程中的关键。通过使用Go语言的ssh包,开发人员能够以编程方式与SSH服务器进行交互,实现自动化和脚本化管理任务。
SSHc包通常是指实现了SSH客户端功能的代码库或工具集。
使用sshc包具体流程如下:

  1. 建立连接:通过以上介绍的两个连接函数,可以传入服务器地址、端口以及客户端用户、密码或者密钥,从而建立起到SSH服务器的连接,并返回一个Client对象。
  2. 运行命令:在获取到Client对象之后,可以通过err = client.Cmd(cmd).SetStdio(&stdout, &stderr).Run() 执行一个命令,并将标准输出和标准错误输出重定向到指定的变量中。其中,cmd是要执行的命令,stdout和stderr分别是用于存储标准输出和标准错误输出的变量。最后,Run()方法会执行该命令并返回一个error类型的值,表示命令执行的结果。

建立连接

1.DialWithKey

函数说明:这是一个使用密钥进行SSH连接的函数,函数名为DialWithKey,接收三个参数:addr(地址),user(用户名)和keyfile(密钥文件路径)。
函数返回一个*Client类型的对象和一个error类型的错误信息。

/*
函数内部首先读取密钥文件内容,然后解析私钥,如果出错则返回错误信息。
接着创建一个ssh.ClientConfig类型的对象config,设置用户名、认证方式(公钥)
和主机密钥回调函数。最后调用Dial函数,传入协议类型(tcp)、地址和配置信息,返回结果。
*/
func DialWithKey(addr, user, keyfile string) (*Client, error) {
	key, err := ioutil.ReadFile(keyfile)
	if err != nil {
		return nil, err
	}

	signer, err := ssh.ParsePrivateKey(key)
	if err != nil {
		return nil, err
	}

	config := &ssh.ClientConfig{
		User: user,
		Auth: []ssh.AuthMethod{
			ssh.PublicKeys(signer),
		},
		HostKeyCallback: ssh.HostKeyCallback(func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil }),
	}

	return Dial("tcp", addr, config)
}

使用这个方法前,你应该配置互信,在远程服务器中存在这样一个文件
在这里插入图片描述
这个文件可以是你手动创建的也可以是ssh-copy-id命令创建的
这里博主介绍一下手动创建的方法:在你的windows用户路径下找到.ssh文件夹,将里面的id_rsa.pub复制到远程authorized_keys文件中。现在即可通过密钥的方式进行ssh连接。
在这里插入图片描述
直接调用,建立起到SSH服务器的连接,并返回一个Client对象

client, err := sshc.DialWithKey(addr, user, "C:\\Users\\SU\\.ssh\\id_rsa")

2.DialWithPasswd

这是一个使用密码进行SSH连接的函数,函数名为DialWithPasswd,接收三个参数:addr(地址),user(用户名)和passwd(密码)。函数返回一个*Client类型的对象和一个error类型的错误信息。

/*
函数内部首先创建一个ssh.ClientConfig类型的对象config,
设置用户名、认证方式(密码)和主机密钥回调函数。
然后调用Dial函数,传入协议类型(tcp)、地址和配置信息,最后返回结果。
*/
func DialWithPasswd(addr, user, passwd string) (*Client, error) {
	config := &ssh.ClientConfig{
		User: user,
		Auth: []ssh.AuthMethod{
			ssh.Password(passwd),
		},
		HostKeyCallback: ssh.HostKeyCallback(func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil }),
	}

	return Dial("tcp", addr, config)
}

我们使用的时候仅需要提供地址(add := “172.156.13.22:22” 你需要使用的目标ip+端口号22即可)用户(user := “root” 你拥有远程服务器访问权限的用户名,你可以本地试验一下通过ssh IP -I root 比如我当前这个服务器不支持指定root用户登录)
在这里插入图片描述
直接调用,建立起到SSH服务器的连接,并返回一个Client对象

client, err := sshc.DialWithPasswd(addr, user, passwd)

运行命令

以密码登录连接为例:

func SshExec(addr string, user string, passwd string, cmd string) (code int, outStr, errStr string, err error) {
	var (
		stdout bytes.Buffer
		stderr bytes.Buffer
	)
	client, err := sshc.DialWithPasswd(addr, user, passwd)
	if err != nil {
		return -1, "", "", err
	}
	defer client.Close()
	err = client.Cmd(cmd).SetStdio(&stdout, &stderr).Run()
	if err != nil {
		var statErr *ssh.ExitError  //这个类型通常用于处理SSH连接过程中的错误。
		if errors.As(err, &statErr) {
			code = statErr.Waitmsg.ExitStatus()  //这里的code值可以用来做特判
			outStr = stdout.String()
			errStr = stderr.String()
			return
		}
		return -1, "", "", err
	}
	return 0, stdout.String(), stderr.String(), nil
}
//调用
code, stdout, stderr, err := SshExec("远程服务器ip:22", "登录用户", "登录密码", "你想执行的shell命令")

异常场景

在通过SSH(Secure Shell)进行远程连接时,可能会遇到一系列的异常场景,这些场景通常涉及到网络问题、服务器配置、SSH服务配置等因素。以下将探讨一些常见的SSH连接异常场景及其解决方法:

  1. 连接被拒绝

    原因分析:当出现“ssh: connect to host 端口 Connection refused”的错误信息时,通常意味着SSH服务未运行或者网络配置有误。
    解决办法:首先检查SSH服务是否已安装并启动。可以使用命令ps -e | grep ssh来检查sshd服务是否运行,如果没有安装sshd,需要使用apt-get install openssh-server命令进行安装。若服务已安装但未运行,可以通过service sshd restart命令重启服务。

  2. 权限拒绝

    原因分析:“Permission denied,please try again”错误通常表明用户账号存在问题,可能是账号不存在、密码错误或账号被禁止登录。
    解决办法:确认用户名是否存在,可以使用id 命令检查。如果用户不存在,需要创建该用户并设置密码。若密码输入无误但仍然无法登录,检查/etc/ssh/sshd_config配置文件中的PermitRootLogin选项,确保其设置为yes,然后重启sshd服务。

  3. 主机密钥验证失败

    原因分析“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!”这样的警告信息表示主机的密钥发生了变化,可能遭受了中间人攻击。
    解决办法:检查目标主机的公钥是否发生了变化。可以通过删除~/.ssh/known_hosts文件中的相关条目来解决,使用命令ssh-keygen -f "/root/.ssh/known_hosts" -R "<host_ip>",然后重新连接以更新密钥。

  4. SSH会话连接超时

    原因分析:SSH连接超时可能是由于网络不稳定、SSH配置文件设置不当或防火墙阻止等原因造成的。
    解决办法:首先检查网络连接稳定性,可以使用ping命令。接着,检查SSH配置文件/etc/ssh/sshd_config中的ClientAliveInterval和ClientAliveCountMax参数设置是否合理。如果问题依旧,检查防火墙设置,确保没有阻止SSH连接。

  5. SSH服务配置问题

    原因分析:SSH服务的配置错误也可能导致连接异常,例如错误的端口配置或认证方式设置。
    解决办法:检查SSH服务的配置文件/etc/ssh/sshd_config,确保所有设置正确无误,特别是端口号、认证方式等关键配置。修改配置后,需要重启SSH服务使更改生效。

思维导图

在这里插入图片描述

综上所述,Go语言的ssh包为开发人员提供了一个强大且灵活的工具,用于构建需要SSH交互的应用程序。通过合理利用其提供的API,可以实现高效且安全的远程服务器管理和自动化任务执行。

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

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

相关文章

【并发编程系列一】并发编年史:线程的双刃剑——从优势到风险的全面解析

文章目录 并发简史&#x1f5a5;️初期探索&#xff08;20世纪50-60年代&#xff09;并发理论基础&#xff08;1965年以后&#xff09;并行计算的兴起&#xff08;1970年代至1980年代&#xff09;现代并发技术&#xff08;1990年代至今&#xff09; 线程的优势&#x1f60d;发挥…

CleanMyMac X和腾讯柠檬清理谁更优秀?最新6.18活动CleanMyMac 优惠码

经常有新关注的粉丝问&#xff0c;同样做为垃圾清理软件&#xff0c;付费CleanMyMac和免费的柠檬清理哪个更好用&#xff1f;其实&#xff0c;两款软件都是属于非常成熟的软件&#xff0c;一个有着悠久的开发迭代历史&#xff0c;另一个更是背靠鹅厂金主爸爸&#xff0c;很难说…

SAP 角色授权账户 重复的问题 解决方案

直接从agr_usrs 里面删除新的 *&---------------------------------------------------------------------* *& Report ZRPT_BC_ROLEASSIGN_RM_DUP *&---------------------------------------------------------------------* *&角色授权去重 *&--------…

【Android】文本服务器获取内容

链接web服务器&#xff0c;打开apaquee 收到数据 public void getNewsIndexData() throws Exception{String sUrl"http://10.107.24.12:8080/newsIndex.json";URL urlnew URL(sUrl);HttpURLConnection urlConn(HttpURLConnection) url.openConnection();InputStrea…

Linux Kernel 编程-你不知道的printk(2)

内核版本&#xff1a;6.1 书接上回&#xff1a;Linux Kernel 编程-你不知道的printk(1)&#xff1a;https://mp.weixin.qq.com/s/TIuxhG3b-KBYXzrDYy__Aw 上回我们介绍了&#xff1a; printk()的简单使用pintk 的实现&#xff1a;ring buffer使用 systemd 命令 journalctl 查…

计算机视觉全系列实战教程:(九)图像滤波操作

1.图像滤波的概述 (1)Why (为什么要进行图像滤波) 去噪&#xff1a;去除图像在获取、传输等过程中的各种噪音干扰提取特征&#xff1a;使用特定的图像滤波器提取图像特定特征 (2)What (什么是图像滤波) 使用滤波核对图像进行卷积运算或非线性运算&#xff0c;以达到去噪或提…

经典的网站系统架构(入门级)

从开发到部署&#xff0c;从用户访问到底层数据库&#xff0c;介绍搭建网站系统的经典架构的10个核心部分。 &#xff08;图转自bytebytego&#xff0c;翻译整理by dogstar&#xff09; 1、使用Git管理和协同源代码&#xff0c;通过CI/CD或Git的Webhook方式自动同步更新部署到服…

Python开源项目周排行 2024年第9周

#2024年第9周2024年6月3日1buku强大的浏览器书签管理工具。这是一款开源的书签命令行管理工具&#xff0c;它轻量、隐私安全且易于使用&#xff0c;支持从主流浏览器导入书签、自动获取书签信息、跨平台同步和强大的搜索功能。2flagsmith轻松管理功能开关和配置的平台。这是一个…

计算机网络(6) UDP协议

一.UDP数据报格式 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种简单的传输层协议&#xff0c;与TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;相比&#xff0c;UDP提供一种无连接、不可靠的数据传…

【建议收藏】技术人必看:如何选择适合你公司的消息队列工具

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好,我是小米,一个充满活力、喜欢分享技术的程序员。今天我想和大家聊聊消息队列这个主题。对于许多开发者来说,消息队列并不是一个陌生的概念,…

Docker部署常见应用之企业级堡垒机JumpServer-问题记录

文章目录 项目场景问题1问题描述原因分析解决方案 问题2问题描述原因分析解决方案 参考文章 项目场景 项目场景&#xff1a;Docker部署常见应用之企业级堡垒机JumpServer 问题1 问题描述 docker-compose.yml 中使用 $SECRET_KEY 和 $BOOTSTRAP_TOKEN加载 ~/.bashrc 环境变量…

2024 年最新 Python 使用 gewe 框架搭建微信机器人实现语音智能回复(详细教程)

Gewe 个微框架 GeWe&#xff08;个微框架&#xff09;是一个创新性的软件开发框架&#xff0c;专注于IPAD协议&#xff0c;为个人微信号以及企业信息安全提供了强大的功能和保障。GeWe的设计旨在简化开发过程&#xff0c;使开发者能够高效、灵活地构建和定制通信协议&#xff…

C++ 35 之 对象模型基础

#include <iostream> #include <string.h> using namespace std;class Students05{ public:// 只有非静态成员变量才算存储空间&#xff0c;其他都不算int s_a; // 非静态成员变量&#xff0c;算对象的存储空间double s_c;// 成员函数 不算对象的存储空间void f…

1毛钱1百万token,写2遍红楼梦!国产大模型下一步还想卷什么?

大模型价格战&#xff0c;这匹国产黑马又破纪录了&#xff01;最低的GLM-4 Flash版本&#xff0c;百万token价格已经低至0.1元&#xff0c;可以说是击穿地心。MaaS 2.0大升级&#xff0c;让企业训练私有模型的成本无限降低。 刚刚&#xff0c;智谱AI开放日上&#xff0c;新一代…

神经网络字符分类

按照题目要求修改了多层感知机 题目将图片的每个点作为输入&#xff0c;其中大小为28*28&#xff0c;中间有两个大小为100的隐藏层&#xff0c;激活函数是relu&#xff0c;然后输出大小是10&#xff0c;激活函数是softmax 优化器是Adam&#xff0c;结合了AdaGrad和RMSProp算法…

六、高级路由交换技术

目录 一、Eth-trunk&#xff08;以太通道或链路捆绑&#xff09; 1.1、 链路聚合模式 1.2、链路选举规则&#xff08;选举活跃和备份&#xff09; 1.3、负载分担方式 1.4、配置流程 二、vlan聚合 三、MUX vlan&#xff08;混合vlan&#xff09; 四、QinQ 五、V…

一个顶级产品经理的自我修养,从掌控AI工具开始

前言 在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;技术的快速发展正深刻地改变着各行各业的运营模式与竞争格局。产品经理&#xff0c;作为连接用户需求与产品设计之间的桥梁&#xff0c;在这场变革中扮演着至关重要的角色。随着AI技术的广泛应用&…

实战计算机网络02——物理层

实战计算机网络02——物理层 1、物理层实现的功能2、数据与信号2.1 数据通信模型2.2 通信领域常用术语2.3 模拟信号和数字信号 3、信道和调制3.1 信道3.2 单工通信、半双工通信、全双工通信3.3 调制3.4 奈式准则3.5 香农定律 4、传输媒体4.1 导向传输媒体4.2 非导向传输媒体 5、…

二刷算法训练营Day30 | 回溯算法(6/6)

目录 详细布置&#xff1a; 1. 回溯总结 2. 332. 重新安排行程 3. 51. N 皇后 4. 37. 解数独 详细布置&#xff1a; 1. 回溯总结 回溯是递归的副产品&#xff0c;只要有递归就会有回溯&#xff0c;所以回溯法也经常和二叉树遍历&#xff0c;深度优先搜索混在一起&#x…

KafkaQ - 好用的 Kafka Linux 命令行可视化工具

软件效果前瞻 ~ 鉴于并没有在网上找到比较好的linux平台的kafka可视化工具&#xff0c;今天为大家介绍一下自己开发的在 Linux 平台上使用的可视化工具KafkaQ 虽然简陋&#xff0c;主要可以实现下面的这些功能&#xff1a; 1&#xff09;查看当前topic的分片数量和副本数量 …