【问题标题】:Using the Node module SSH2 with shell使用带有 shell 的 Node 模块 SSH2
【发布时间】:2013-11-11 16:36:30
【问题描述】:

我的目标是制作一个 Web 应用程序,允许其用户远程连接到 SSH 服务器,即无需在他们的计算机上安装 SSH 客户端。所以这意味着我的服务器将成为用户和他们的 SSH 服务器之间的中间接口。

我找到了一个节点的 SSH2 模块:https://github.com/mscdex/ssh2

我认为最合适的连接方法是使用shell() 方法。

以下是让 shell 工作的基本尝试。

var Connection = require('ssh2');

var c = new Connection();

c.on('ready', function() {
   c.shell(onShell);
});

var onShell = function(err, stream) { 
    if (err != null) {
        console.log('error: ' + err);
    }

    stream.on('readable', function() {
        var chunk;
        while (null !== (chunk = stream.read())) {
            console.log('got %d bytes of data', chunk.length);
        }
    });

    stream.write('ls\r\n');

    console.log('Shell');

}

c.connect({
    host: 'localhost',
    port: 22, 
    username: 'matt',
    password: 'password'
});

连接正常,没有错误,但没有显示“got %d bytes of data”。我该如何解决这个问题?

此外,这种方法在可能同时存在许多不同连接的大规模应用程序中是否明智?

【问题讨论】:

  • 不应该只是on('data')吗?

标签: node.js shell ssh


【解决方案1】:

ssh2 目前还没有使用streams2,因为由于两个(stdout 和stderr)“子”流并试图以理智的方式处理背压,事情变得棘手。我仍然希望我能通过streams2找到一些解决方案。

现在,您必须改为监听“数据”、“排水”等事件。

更新: ssh2 v0.3.x 现在支持streams2。

【讨论】:

  • 我如何知道何时到writestream 执行命令?
  • @pkyeck 你可以为 shell 提示解析流数据,然后等到你看到一个,或者通常你也可以立即编写命令,它将被缓冲并在远程端执行。跨度>
【解决方案2】:

我为 ssh2 编写了一个包装类,它处理在 SSH shell 会话中运行的多个命令,并且可以使用嵌套的主机对象通过 SSH 隧道连接到多个主机。每个主机配置对象都有自己的命令、命令事件处理程序、会话结束处理程序和身份验证参数。可以检查命令响应以查找需要额外处理或从命令数组中添加/删除命令的提示或结果。如果命令产生未处理的意外提示并且通常会导致进程挂起等待它永远不会得到的响应,它也会超时。

检查一下:

自述文件中的大量信息,提供的测试示例,git wiki 中的附加信息。 https://www.npmjs.org/package/ssh2shell

https://github.com/cmp-202/ssh2shell

【讨论】:

  • 我正在尝试使用 ssh2shell,但遇到了问题。当我连接到 Cisco 路由器时,我几乎立即看到消息“已连接”,然后是“关闭”。在 Cisco 路由器上进行调试表明客户端 (ssh2shell) 提供的密码与路由器上的任何密码都不匹配。我尝试在主机内部的不同位置添加“算法”、“密码”和“kex”部分,但并没有改变结果。我能够让它与“SSH2”模块一起使用,但不能与“SSH2Shell”一起使用。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 2017-09-26
  • 2015-06-30
  • 2015-05-17
  • 2021-08-13
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
相关资源
最近更新 更多