2015-07-30 6 views
0

Я блуждаю, есть ли действительное решение для удаленного терминала в OpenWRT-Box из NodeJS-APP?Удаленный терминал NodeJS для Dropbear OpenWRT-Server

Подключение от терминала работает: ssh -i ~/.myKeys/id_rsa [email protected]

BusyBox v1.23.2 (2015-04-22 23:25:48 UTC) встроенный в скорлупе (пеплом)

корень @ OpenWRT: ~ #

only interactive ssh solution для NodeJS не делает интерактивную часть, как описано в 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

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

... висит также, как первое решение.

Моя последняя идея состояла в том, чтобы выйти из NodeJS-приложения и выполнить команду ssh с параметрами из завершенного NodeJS-приложения. Но я не мог найти способ сделать это. Подумав об этом, я заметил ... это всего лишь код ошибки, ничего больше, что возвращается из завершенного процесса. Таким образом, это должен быть child_process, который получает полный stdin/stdout/stderr ... но каков правильный способ сделать это?

И это работает с Dropbear-серверами?

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

ответ

1

Если вы хотите «интерактивную часть» с ssh2, вам нужно на самом деле труба между процессом удаленной оболочки и местного стандартного ввода/стандартный вывод/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') 
}); 
+0

ОК, спасибо - полезно знать. – Danny

0

Решение:

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

 Смежные вопросы

  • Нет связанных вопросов^_^