一文理清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.rhkb.cn/news/349305.html

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

相关文章

Git+Gitlab 远程库测试学习

Git远程仓库 1、Git远程仓库 何搭建Git远程仓库呢&#xff1f;我们可以借助互联网上提供的一些代码托管服务来实现 Gitee 码云是国内的一个代码托管平台&#xff0c;由于服务器在国内&#xff0c;所以相比于GitHub&#xff0c;码云速度会更快 码云 Gitee - 基于 Git 的代码托…

Mathtype插入word,以及mathtype在word上的卸载

1.Mathtype插入word 花了两个小时&#xff0c;最终得出的极品简单的安装方法&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; mathype下载地址&#xff1a;https://store.wiris.com/zh/products/mathtype/download/windows 下载完傻瓜式安装&#xff0c;不要…

集成学习模型对比优化—银行业务

1.Data Understanding 2.Data Exploration 3.Data Preparation 4.Training Models 5.Optimization Model 集成学习模型对比优化—银行业务 1.Data Understanding import pandas as pd from matplotlib import pyplot as plt import seaborn as sns df pd.read_csv(&quo…

如何通过 6 种方法从 iPhone 恢复已删除的文件

想知道如何从 iPhone 恢复已删除的文件吗&#xff1f;本文将指导您如何从 iPhone 恢复数据&#xff0c;无论您是否有 iTunes/iCloud 备份。 iPhone 上已删除的文件去哪儿了&#xff1f; 许多 iPhone 用户抱怨他们经常丢失 iPhone 上的一些重要文件。由于意外删除、iOS 更新失败…

安装golang

官网:All releases - The Go Programming Language (google.cn) 下载对应的版本安装即可

C++ 34 之 单例模式

#include <iostream> #include <string.h> using namespace std;class King{// 公共的函数&#xff0c;为了让外部可以获取唯一的实例 public:// getInstance 获取单例 约定俗成static King* getInstance(){return true_king;}private: // 私有化// 构造函数设置为…

2024 Idea最新激活码

idea的激活与安装 操作如下&#xff1a; ① 打开网站&#xff1a;https://web.52shizhan.cn 切换到&#xff1a;激活码&#xff0c;点击获取 ② 这个时候就跳转到现成账号页面&#xff0c;点击获取体验号&#xff0c;如图 ③ 来到了获取现成账号的页面了。输入你的邮箱账号即…

VRChat 2024年裁员原因与背景深度分析

VRChat&#xff0c;作为2022年元宇宙/VR社交领域的巨头&#xff0c;近期在2024年宣布裁员计划&#xff0c;其背后原因和背景值得业界尤其是仍在纯元宇宙虚拟空间创业的同仁们重点关注。 一、创始人决策失误 根据CEO的邮件披露&#xff0c;VRChat的创始人因缺乏经验和过度自信…

最新区块链论文速读--CCF A会议 ICSE 2024 共13篇 附pdf下载 (2/2)

Conference&#xff1a;International Conference on Software Engineering (ICSE) CCF level&#xff1a;CCF A Categories&#xff1a;Software Engineering/System Software/Programming Languages Year&#xff1a;2024 Num&#xff1a;13 第1~7篇区块链文章请点击此处…

大语言模型 (LLM) 红队测试:提前解决模型漏洞

大型语言模型 (LLM) 的兴起具有变革性&#xff0c;以其在自然语言处理和生成方面具有与人类相似的卓越能力&#xff0c;展现出巨大的潜力。然而&#xff0c;LLM 也被发现存在偏见、提供错误信息或幻觉、生成有害内容&#xff0c;甚至进行欺骗行为的情况。一些备受关注的事件包括…

什么充电宝牌子好用耐用?高评分绿联、西圣、罗马仕充电宝实测

在如今这个科技飞速发展的时代&#xff0c;充电宝已经成为我们日常生活中不可或缺的电子配件之一。当我们外出旅行、办公或者日常出行时&#xff0c;充电宝能够为我们的电子设备及时补充电量&#xff0c;让我们时刻保持在线。然而&#xff0c;面对市场上众多的充电宝品牌和型号…

小程序无法调用服务端问题排查

1、问题描述 突然有一天线上的小程序不能登录&#xff0c;经查小程序无法调用。经查无法小程序页面无法调用后台服务。 2、排查过程 由于无法登录小程序发布服务器&#xff0c;无法测试小程序前端服务器到服务端网络&#xff0c;并且小程序无法看到日志。所以就得从服务端和网…

idea有这个类却报红,无法用快捷键找到

idea有这个类却报红&#xff0c;无法用快捷键找到&#xff0c;但是项目启动却没有任何问题&#xff0c;严重影响到了开发效率&#xff0c;关idea 重新打开没有用。 找了一圈&#xff0c;办法如下&#xff1a; 1、点击左上角的 File—>Invalidate Caches/Restar 2、点击 In…

Vue CLI 4与项目构建实战指南

title: Vue CLI 4与项目构建实战指南 date: 2024/6/9 updated: 2024/6/9 excerpt: 这篇文章介绍了如何使用Vue CLI优化项目构建配置&#xff0c;提高开发效率&#xff0c;涉及配置管理、项目部署策略、插件系统定制以及Webpack和TypeScript的深度集成技巧。 categories: 前端…

ubuntu下使用cmake编译opencv4.8.0+ffmpeg4.2.2+cuda11.1

1.源码下载 &#xff08;1&#xff09;下载ffmpeg4.2.2、opencv4.8.0源码&#xff0c;这里提供一个百度网盘地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1pBksr0_RtKL0cM6Gsf2MGA?pwdcyai 提取码&#xff1a;cyai &#xff08;2&#xff09;解压所有文件 例…

【自动部署】4.阿里云ECS服务器 IDEA自动部署项目

如何在IDEA中&#xff0c;自动部署项目到阿里云ECS服务器&#xff1f;今天我们就来实现一键部署功能。 执行maven命令打包免密登录&#xff0c;在IEDA中连接服务器执行stop脚本上传jar包到服务器执行start脚本查看运行日志 1.安装Alibaba Cloud Toolkit 2.配置host 3.自动化部…

智能合约漏洞类型

Are We There Yet? Unraveling the State-of-the-Art Smart Contract Fuzzers | Proceedings of the IEEE/ACM 46th International Conference on Software Engineering

HTML静态网页成品作业(HTML+CSS)—— 家乡山西介绍网页(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有6个页面。 二、作品演示 三、代…

【嵌入式DIY实例】-Nokia 5110显示DHT11/DHT22传感器数据

Nokia 5110显示DHT11/DHT22传感器数据 文章目录 Nokia 5110显示DHT11/DHT22传感器数据1、硬件准备2、代码实现2.1 显示DHT11数据2.2 显示DHT22数据本文介绍如何将 ESP8266 NodeMCU 开发板 (ESP-12E) 与 DHT11 数字湿度和温度传感器以及诺基亚 5110 LCD 连接。 NodeMCU 从 DHT11…