NodeJS удаленный терминал для Dropbear OpenWRT-Server
Я брожу, есть ли правильное решение иметь удаленный терминал для OpenWRT-Box из NodeJS-APP?
Подключение с терминала работает: ssh -i ~/.myKeys/id_rsa root@192.168.178.39
BusyBox v1.23.2 (2015-04-22 23:25:48 UTC) встроенная оболочка (ясень)
корень @ OpenWRT:~#
Единственное интерактивное ssh-решение для 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. Также установка решения поверх этого узла ssh2 lib не работает. Он был построен, чтобы идентифицировать подсказку (например)
Поэтому моей следующей идеей было выполнить команду оболочки с использованием 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 и запустить операционные системы ssh
команда с параметрами из прекращенного NodeJS-приложения. Но я не мог найти способ сделать это. Подумав, я заметил... это всего лишь код ошибки и ничего больше, что возвращается из завершенного процесса. Так что это должен быть child_process, который получает полный stdin/stdout/stderr ... но как правильно это сделать?
И работает ли он с Dropbear-Servers?
Здесь вы можете найти виртуальную машину, с которой я тестирую.
2 ответа
Если вы хотите "интерактивную часть" с 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')
});
Решение:
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();
});