0

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) 組み込みシェル (ash)

root@openwrt:~#

NodeJSの唯一の対話型 ssh ソリューションは、次のように 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 に対してのみテストされています。また、この ssh2 ノード ライブラリの上に設定されたソリューションは機能しません。プロンプトを識別するためにビルドされました(例)

だから私の次のアイデアは、stdinとstdoutを使ってシェルコマンドを実行することでした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 からパラメータを指定してオペレーティング システムsshコマンドを実行することでした。しかし、これを行う方法が見つかりませんでした。考えてみると、終了したプロセスから返されるのはエラーコードだけであることに気付きました。したがって、完全なstdin/stdout/stderrを取得するのはchild_processでなければなりません...しかし、これを行う正しい方法は何ですか?

また、Dropbear-Servers で動作しますか?

ここで、私がテストしている仮想マシンを見つけることができます

4

2 に答える 2

1

で「インタラクティブな部分」ssh2が必要な場合は、リモート シェル プロセスとローカルの 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')
});
于 2015-08-01T12:17:37.283 に答える
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();
});
于 2015-07-30T14:35:40.100 に答える