NodeJS远程终端到Dropbear OpenWRT-Server

时间:2015-07-30 11:05:02

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

我是否有一个有效的解决方案是从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(灰)

     

根@的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节点lib也不起作用。它的构建是为了识别提示(例如)

所以我的下一个想法是,用stdin和stdout执行shell命令为child_process

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中的params执行操作系统ssh命令。 但我找不到办法做到这一点。在考虑之后,我注意到......它只是一个错误代码,而不是从终止进程返回的内容。所以它必须是一个child_process才能获得完整的stdin / stdout / stderr ......但是这样做的正确方法是什么?

它是否适用于Dropbear-Servers?

Here you can find the virtual machine I am testing against

2 个答案:

答案 0 :(得分:1)

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

ssh2

答案 1 :(得分:0)

解决方案是:

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();
});