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

一文理清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,可以实现高效且安全的远程服务器管理和自动化任务执行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

北斗车载终端TD30助力户外出行现代化、信息化——保障无信号区域通信、实时精准定位

据官方统计&#xff0c;截至2023年9月底&#xff0c;全国机动车保有量达4.3亿辆&#xff0c;其中汽车3.3亿辆&#xff0c;新能源汽车1821万辆&#xff1b;机动车驾驶人5.2亿人&#xff0c;其中汽车驾驶人4.8亿人。车辆持有率的上升也带来车辆安全的考量&#xff0c;再者交通运输…

【linux】给net/socket.c部分接口添加pr_info后运行情况

net/socket.c 合入文件及代码&#xff1a; https://gitee.com/r77683962/linux-6.9.0/commit/d9aca07352311a9c185cbc2d3c39894e02f10df3 开机后dmesg命令运行效果&#xff1a; 这也是一部分&#xff0c;不过从这里看出来&#xff0c;添加打印日志的地方不太好&#xff0c;另…

CTFshow-web sql注入

Web171 1 在题目中可以看到查询语句为 "select username,password from user where username !flag and id ".$_GET[id]." limit 1;"; 直接使用万能密码 查到了所有用户 获得flag Web172 0 可以看到返回逻辑显示 如果返回的查询数据中username不等于fl…

随着Midjourney越来越成熟,它将给现实世界带来哪些影响?

Midjourney使用的过程中&#xff0c;你是不是会遇到这样的情况&#xff1f; 生成出来的图片压根不是自己想要的&#xff1f; 想要的风格根本不知道怎么写提示词&#xff1f; 不用担心&#xff0c;今天白白给大家带来了280种酷炫动作咒语&#xff0c;拿去&#xff0c;都能生成…

诊所管理系统哪家会好一点

随着医疗行业的快速发展和信息化进程的加速&#xff0c;诊所作为医疗服务的重要基层单位&#xff0c;其运营管理效率与服务质量的提升愈发依赖于现代化的管理工具。诊所管理系统应运而生&#xff0c;旨在通过集成化、智能化的技术手段&#xff0c;帮助诊所实现诊疗流程优化、资…

Web3失败下互联网的未来转型之路

互联网的消亡已不再是夸大其词的说法。在大型科技巨头和生成式AI的推动下&#xff0c;网络的死亡螺旋正在加速&#xff0c;就像希腊神话中的蛇怪&#xff0c;象征着自我吞噬与永生。互联网已经开始自我喂养&#xff0c;并吐出最糟糕的部分供我们消费。 没有价值 Web3未能提供…

GPT-4搞不定的图推理,港科大7B模型搞定|KDD2024

大模型执行图推理任务&#xff0c;我们是希望大模型仅仅给出结果&#xff0c;还是在给出准确答案的同时&#xff0c;输出详细的推理过程&#xff1f; 先来看GPT-4的表现&#xff1a; 给出了一个非常简短且错误的答案&#xff08;判断该图中没有环&#xff09;&#xff0c;这可…

53.Python-web框架-Django开始第一个应用的多语言

针对上一篇的功能&#xff0c;本次仅对页面做了多语言&#xff0c;大家可以看看效果。 51.Python-web框架-Django开始第一个应用的增删改查-CSDN博客 目录 部门列表 新增部门 编辑部门 部门列表 源码 <!DOCTYPE html> {% load static %} {% load i18n %} <html …

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 团队派遣(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍓OJ题目截图 📎在线评测链接 团队派遣(100分) 🌍 评测功能需要订阅专栏…

集成学习 #数据挖掘 #Python

集成学习是一种机器学习方法&#xff0c;它通过结合多个模型的预测结果来提高整体性能和稳定性。这种方法的主要思想是“集合智慧”&#xff0c;通过将多个模型&#xff08;比如决策树、随机森林、梯度提升机等&#xff09;的预测集成起来&#xff0c;可以减少单个模型的过拟合…

如何发挥物联网电能表的优势

发挥物联网电能表的优势&#xff0c;对于提升电力系统的智能化水平、优化电力资源配置、提高用电效率以及促进环保发展等方面都具有重要意义。 一、实时监测与数据分析 物联网电能表的核心优势在于其能够实时监测电力使用情况&#xff0c;并通过无线网络将数据传输到云平台。…

【云岚到家】-day03-2-门户缓存实现实战

【云岚到家】-day03-2-门户缓存实现实战 5 缓存实现5.2 定时任务更新缓存5.2.1 分布式调度平台5.2.1.1 jdk提供的Timer定时器5.2.1.2 使用第三方Quartz方式5.2.1.3 使用分布式调度平台XXL-JOB 5.2.2 XXL-JOB5.2.2.1 介绍5.2.2.2 部署调度中心5.2.2.3 执行器 5.2.2 定义缓存更新…

laravel版本≥ 8.1

laravel10 php ≥ 8.1 且 ≤ 8.3&#xff1f; 8.1 < php < 8.3PHP版本要求在 8.1 到 8.3 之间&#xff0c;包括这两个版本。具体来说&#xff1a;"≥ 8.1" 表示 PHP 的版本至少是 8.1&#xff0c;也就是说 8.1 及以上的版本都可以。 "≤ 8.3" 表示 P…

2024年【广东省安全员A证第四批(主要负责人)】找解析及广东省安全员A证第四批(主要负责人)模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员A证第四批&#xff08;主要负责人&#xff09;找解析根据新广东省安全员A证第四批&#xff08;主要负责人&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将广东省安全员A证第四批&#xff…

光储充一体化,开启绿色出行新篇章

一、追光逐梦&#xff0c;绿色能源点亮未来 在蔚蓝的天空下&#xff0c;光伏发电板如同一片片金色的叶子&#xff0c;静静地捕捉着太阳的光芒。它们不仅为大地带来光明&#xff0c;更是绿色出行的强大后盾。光储充一体化充电站&#xff0c;以光伏为源&#xff0c;储能为桥&…

CV预测:快速使用LeNet-5卷积神经网络

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

Vue 3深度探索:自定义渲染器与服务端渲染

title: Vue 3深度探索&#xff1a;自定义渲染器与服务端渲染 date: 2024/6/14 updated: 2024/6/14 author: cmdragon excerpt: 这篇文章介绍了如何在Vue框架中实现自定义渲染器以增强组件功能&#xff0c;探讨了虚拟DOM的工作原理&#xff0c;以及如何通过SSR和服务端预取数…

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

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

体验亚马逊AIGC——Amazon Bedrock

前言 随着人工智能技术的不断发展&#xff0c;我们已经进入了一个全新的时代&#xff0c;即AI驱动的时代。在这个时代&#xff0c;人工智能已经逐渐成为我们生活中不可或缺的一部分&#xff0c;它可以帮助我们更好地处理各种复杂的问题&#xff0c;提高我们的工作效率&#xff…