【问题标题】:NodeJS remote terminal to Dropbear OpenWRT-Server的NodeJS远程终端Dropbear的OpenWRT - 服务器
【发布时间】:2015-10-21 17:03:46
【问题描述】:

我在想是否有一个有效的解决方案可以让一个远程终端连接到一个 NodeJS-APP 之外的 OpenWRT-Box?

从终端连接工作:ssh -i ~/.myKeys/id_rsa root@192.168.178.39

BusyBox v1.23.2 (2015-04-22 23:25:48 UTC) 内置 shell (ash)

root@openwrt:~#

NodeJS 的 only interactive ssh solution 不执行 README.md 中描述的交互部分,如下所示:

var Client = require('ssh2').Client;

var conn = new Client();
conn.on('ready', function() {
  console.log('Client :: ready');
  conn.shell(function(err, stream) {
    if (err) throw err;
    stream.on('close', function() {
      console.log('Stream :: close');
      conn.end();
    }).on('data', function(data) {
      console.log('STDOUT: ' + data);
    }).stderr.on('data', function(data) {
      console.log('STDERR: ' + data);
    });
    stream.end('ls -l\nexit\n');
  });
}).connect({
  host: '192.168.100.100',
  port: 22,
  username: 'frylock',
  privateKey: require('fs').readFileSync('/here/is/my/key')
});

仅针对 OpenSSH 进行测试。 a solution setting atop of 这个 ssh2 节点库也不起作用。它是为了识别提示而构建的(例如)

所以我的下一个想法是,用标准输入和标准输出作为child_process执行一个shell命令

var spawn = require('child_process').spawn;
               var ssh    = spawn('ssh', ['-tt', 'root@'+host]);
                    process.stdin.resume();
                    process.stdin.on('data', function (chunk) {
                      ssh.stdin.write(chunk);
                    });

... 也像第一个解决方案一样挂起。

我的最后一个想法是退出 NodeJS-App 并使用已终止的 NodeJS-App 中的参数执行操作系统 ssh 命令。 但我找不到办法做到这一点。经过思考,我注意到......它只是一个错误代码,没有其他什么是从终止的进程中返回的。所以它必须是一个 child_process 才能获得完整的 stdin/stdout/stderr ...但是正确的方法是什么?

它是否适用于 Dropbear-Servers ?

Here you can find the virtual machine I am testing against.

【问题讨论】:

    标签: node.js ssh remote-access openwrt dropbear


    【解决方案1】:

    如果你想要 ssh2 的“交互部分”,你需要在远程 shell 进程和本地 stdin/stdout/stderr 之间进行实际管道,因为这不是自动完成的:

    var fs = require('fs');
    var Client = require('ssh2').Client;
    
    var conn = new Client();
    conn.on('ready', function() {
      console.log('Client :: ready');
      conn.shell(function(err, stream) {
        if (err) throw err;
        stream.on('close', function() {
          console.log('Stream :: close');
          conn.end();
        });
        stream.pipe(process.stdout);
        stream.stderr.pipe(process.stderr);
        process.stdin.pipe(stream);
      });
    }).connect({
      host: '192.168.178.39',
      port: 22,
      username: 'root',
      privateKey: fs.readFileSync('/home/' + process.env.USER + '/.myKeys/id_rsa')
    });
    

    【讨论】:

      【解决方案2】:

      解决办法是:

      process.stdin.pause();
      var ch = require('child_process')
        .spawn('/usr/bin/ssh', 
        ['-i',
         '~/.myKeys/id_rsa',
         'root@192.168.178.39'],
        {
         stdio: 'inherit'
        });  
      ch.on('error', function(error){
        console.log('error: ',error);
      });
      ch.on('exit',function(){
        process.stdin.resume();
      });
      

      【讨论】:

        猜你喜欢
        • 2011-12-10
        • 2014-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        • 1970-01-01
        • 2019-01-25
        相关资源
        最近更新 更多