SSH:创建可以与之交互的ruby SSH服务器有多容易?

SSH:创建可以与之交互的ruby SSH服务器有多容易?,ruby,net-ssh,Ruby,Net Ssh,我有一个ruby库,它可以建立到远程设备的telnet或ssh连接。一切似乎都起作用了。测试框架(适用于telnet)定义绑定到端口的设备模拟器,以及绑定到同一端口的测试连接。然后,整个有效负载交换将通过该通道以及身份验证步骤 对于SSH,我在适应这一点上遇到了问题,因为很明显,模仿协议的身份验证步骤并不是那么容易。由于我们使用netssh,客户端需要所有的身份验证步骤(ssh版本、alghoritm协商、密钥交换等等),我不知道消息的详细格式(我在任何地方都找不到很多示例) 我所期望的是一种实

我有一个ruby库,它可以建立到远程设备的telnet或ssh连接。一切似乎都起作用了。测试框架(适用于telnet)定义绑定到端口的设备模拟器,以及绑定到同一端口的测试连接。然后,整个有效负载交换将通过该通道以及身份验证步骤

对于SSH,我在适应这一点上遇到了问题,因为很明显,模仿协议的身份验证步骤并不是那么容易。由于我们使用netssh,客户端需要所有的身份验证步骤(ssh版本、alghoritm协商、密钥交换等等),我不知道消息的详细格式(我在任何地方都找不到很多示例)

我所期望的是一种实际向客户端发送信号的方式,即通道可以不加密(对于测试,不是问题),并且我希望收到提示(基于密码,对于测试环境,我不需要授权密钥过程)

有没有一个简单的实现/现有的实现来应对这样的考验?

是的

对于单元测试mock
Net::SSH
,对于集成测试,执行完整堆栈的测试(
Net::SSH
+您的应用程序+您的基础架构)

单元测试

对于单元测试,将
Net::SSH
替换为
Struct
OpenStruct
或实现您正在使用的方法的相同名称的普通旧Ruby对象。这个模拟类不需要连接到实际的SSH服务器,它只需要像连接到SSH服务器一样嘎嘎作响,它可以将其输入和输出存储到实例变量中,以便您可以对它们进行断言

通过这种方式,您可以测试应用程序是否发送正确的用户名/pass/ip/正确执行和解析命令/etc,而不是测试
Net::SSH
是否能够进行SSH连接(这将由
Net::SSH
gem负责)

测试将比连接到真实的东西快得多

这是gem背后的基本思想——不要让服务器嘎嘎作响,让客户端嘎嘎作响

一旦你做到了这一点,如果你为它制作了一个很好的API,你就可以把它提交给网站上的好人,这是一个很有用的东西,而且目前似乎还没有

集成测试

保持集成测试非常基本

您可能希望通过一个额外的硬编码集成测试来检查
Net::SSH
+您的应用程序+您的服务器基础结构是否兼容,该测试将连接到基础结构中的实际服务器,并建立连接并执行命令


升级SSH守护程序或强化基础设施可能会破坏应用程序的功能—例如,如果您引入selinux、禁用弱密码、切换到有趣的操作系统(如Solaris)或
Net::SSH
人们忘记为您可能使用的特定体系结构引入错误解决方案(solaris SSH密码问题,Ubuntu10已知主机问题,…).

您能否再详细介绍一下系统的体系结构?您是在开发SSH服务器?还是在制作自定义SSH客户端?您计划在SSH上运行哪种协议?如果是远程http,则可以选择将其作为Sinatra应用程序运行。我正在为特定供应商制作自定义SSH/Telnet客户端我的自定义虚拟服务器只处理预期的命令,并生成一些输出,这些输出模仿供应商远程设备对此类命令的输出。这一部分已经解决了(它适用于telnet)。只需要建立连接,自定义客户端使用Net::SSH作为SSH的会话层。@ChuckE,查看我的答案,如果我错过了大致的答案,请告诉我,但这似乎是一个好的总体方向。我一直遵循这个方向。我发现唯一的罪魁祸首是必须创建一个模拟传输对象抽象内部Net::Telnet或Net::SSH客户端的各种功能(等待输出、超时、再等待几秒钟以获得更多输出)。这是最难的,因为你的客户需要这些,你可以复制它们。这就像重写没有套接字的Net::Telnet,只是传递消息。不过,我不知道我能在两天内收到多少通知。@ChuckE,如果你在测试中需要这样的细节,你可能会用模拟客户端获得最好的长期结果t、 而不是一个模拟服务器。一旦你有了一个模拟客户端,它应该很容易抽象出来,这样你就可以将它用于Net::Telnet,而无需在测试中设置虚拟服务器,所以这是一件好事,我想我同意你的看法。只是为这些类型的客户端创建一个模拟客户端有点“偷听”…我正试图与之抗争,但您知道,我正在准备向客户端、telnet或ssh发送远程命令的所有附加选项(等待更多输出、超时、与提示符匹配、模拟异常等…)感觉就像是在没有套接字的情况下重写客户机。不过,如果库提供这样的模拟实现,那就太好了:)