NodeJS 远程终端到 Dropbear OpenWRT-Server
NodeJS remote terminal to Dropbear OpenWRT-Server
我在想是否有一个有效的解决方案可以让远程终端从 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) built-in 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 节点库不工作。它的构建是为了识别提示(例如)
所以我的下一个想法是,使用 stdin 和 stdout 作为 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 一起使用吗?
解决方法是:
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();
});
如果您想要 "interactive part" 和 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')
});
我在想是否有一个有效的解决方案可以让远程终端从 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) built-in 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 节点库不工作。它的构建是为了识别提示(例如)
所以我的下一个想法是,使用 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
命令。
但我找不到办法做到这一点。考虑之后,我注意到……这只是一个错误代码,没有别的,是从终止的进程返回的。所以它必须是一个 child_process 获得完整 stdin/stdout/stderr 的东西......但是正确的方法是什么?
它可以与 Dropbear-Servers 一起使用吗?
解决方法是:
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();
});
如果您想要 "interactive part" 和 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')
});