一文理清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.Bufferstderr 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.mzph.cn/pingmian/27071.shtml

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

相关文章

Non-aligned Supervision for Real Image Dehazing

原文链接&#xff1a;https://www.semanticscholar.org/paper/Non-aligned-supervision-for-Real-Image-Dehazing-Fan-Guo/7595d39e71ae58343e8728fc1af0e18ffe38218b 数据集&#xff1a;https://www.cityscapes-dataset.com/ 真实的图像去雾的非对准监督 摘要 由于天气条件…

three.js纹理贴图褪色失真问题解决

网上查的都是加encoding配置&#xff0c;但是最新版本&#xff0c;纹理对象属性名.encoding已经变更为.colorSpace // 纹理贴图加载器 const texLoader new THREE.TextureLoader(); const texture texLoader.load("./test.jpg"); texture.colorSpace THREE.SRGBC…

掌握这招,串口通信高频收发32W数据,0丢包!

我做过挺多串口通讯类的产品&#xff0c;有用485通讯的pdu&#xff0c;有wifi/4G/蓝牙通讯类的网关... 做串口的应用&#xff0c;把串口外设调通只是第一步&#xff0c;串口只是数据传输的媒介&#xff0c;在此基础上&#xff0c;两个设备/器件要进行通信&#xff0c;传递更有意…

nginx 启动报错:Failed to start The nginx HTTP and reverse proxy server.

1&#xff0c;启动 nginx报错 systemctl start nginx[rootlaoban yum.repos.d]# systemctl start nginx Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "jetails. [rootlaoban…

react用ECharts实现组织架构图

找到ECharts中路径图。 然后开始爆改。 <div id{org- name} style{{ width: 100%, height: 650, display: flex, justifyContent: center }}></div> // data的数据格式 interface ChartData {name: string;value: number;children: ChartData[]; } const treeDep…

未来之门开启:探索电子墨水屏日历的无界可能

导语: 在科技的浪潮中&#xff0c;一种全新的电子产品正悄然改变我们的生活——电子墨水屏日历。不同于传统日历&#xff0c;它以极简的设计、超低的功耗和无光污染的特性&#xff0c;掀起了一场桌面革命。无需插座&#xff0c;一年一充&#xff0c;便携易用&#xff0c;它是如…

计算机网络 —— 应用层(应用层概述及服务方式)

计算机网络 —— 应用层&#xff08;应用层概述及服务方式&#xff09; 应用层服务方式C/S&#xff08;客户端-服务器&#xff08;C/S&#xff09;模型&#xff09;基本概念特点B/S&#xff08;Browser/Server&#xff09;基本概念特点应用场景 p2p &#xff08;对等网络&#…

【UML用户指南】-13-对高级结构建模-包

目录 1、名称 2、元素 3、可见性 4、引入与引出 用包把建模元素安排成可作为一个组来处理的较大组块。可以控制这些元素的可见性&#xff0c;使一些元素在包外是可见的&#xff0c;而另一些元素要隐藏在包内。也可以用包表示系统体系结构的不同视图。 狗窝并不复杂&#x…

【单片机毕业设计选题24003】-基于STM32和阿里云的家庭安全监测系统

系统功能: 此设计采用STM32单片机采集环境温湿度,烟雾浓度和一氧化碳浓度显示在OLED上&#xff0c;并将这些信息上报至阿里云平台。 1. 上电连接手机热点后自动连接阿里云&#xff0c;可通过阿里云平台收到系统上报的温湿度&#xff0c;烟雾 浓度&#xff0c;一氧化碳数据以…

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

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

1. NAS和SAN存储

NAS和SAN存储 一、存储设备1、根据工作方式2、DAS 直接附加存储3、NAS存储4、SAN存储 二、模拟配置SAN存储1、创建虚拟机、安装openfiler2、访问openfiler webUI3、创建RAID设备4、开启iSCSI服务5、配置SAN存储设备共享空间5.1 设置IQN 6、业务服务器连接使用存储6.1 安装客户端…

OceanBase 并行执行参数 parallel_servers_target 理解

为了最大程度降低 PX 使用难度&#xff0c;OceanBase 3.1 版起&#xff0c;parallel_max_servers 参数废弃。 用户只需用好 parallel_servers_target 即可。 target 的用途 用一个酒吧的例子来粗略理解下 parallel_servers_target 的意思&#xff1a; target 先生开了一个酒…

【中科蓝讯BT896X】app.lst、ram.ld、map.txt文件的分析和使用

【中科蓝讯BT896X】app.lst、ram.ld、map.txt文件的分析和使用 测试SDK版本&#xff1a;《SDK_BT896X_S12685_20240314》 文章目录 【中科蓝讯BT896X】app.lst、ram.ld、map.txt文件的分析和使用前言一、app.lst、ram.ld、map.txt文件介绍1.1 app.lst文件1.2 ram.ld文件1.3 map…

【FPGA项目】bin文件ram存取回环测试

&#x1f389;欢迎来到FPGA专栏~bin文件ram存取回环测试 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大…

探秘大数据信用报告:最佳查询方式

大数据信用报告查询方式一般有几种?哪种比较好?在了解这个问题之前&#xff0c;想必你对大数据信用与人行信用的区别都是比较清楚了&#xff0c;本文呢就着重讲一下大数据信用报告查询方式有几种&#xff0c;哪种比较好&#xff0c;感兴趣的朋友不妨一起去看看。 大数据信用报…

跟卖五种常用采集方式,关键词采集升级,更加让新手上手更快!

今天给大家分享一个跟卖选品软件&#xff0c;相信很多卖家都在为选品而苦恼&#xff0c;人工筛选一天也筛选不出几个能用的链接&#xff0c;不仅耗费时间精力&#xff0c;还提升不了选品效率&#xff0c;今天就分享一款实用的选品工具&#xff0c;它能够帮助我们节省选品时间&a…

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

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

Python 显示笔记本电脑的电池状态和百分比

方法一&#xff1a; import psutil import psutil battery psutil.sensors_battery() if battery is None:print("No battery is found.")exit() print (battery) percentagebattery.percent print(f"Battery Percentage: {percentage}%")Battery的信息…

『大模型笔记』缩放定律(scaling laws)是由记忆而非智力解释的吗?

MAC 文章目录 一. 缩放定律(scaling laws)是由记忆而非智力解释的吗?1. 视频原文内容2. 要点总结一般智能的定义规模最大化的论点性能衡量的方式及其影响大语言模型的基准测试大语言模型的本质与记忆基准测试插值的概念与基准测试实例人类和模型的推理与样本效率二. 参考文献一…