我正在使用node.js,我正在尝试在Web浏览器中嵌入一个控制台,以便在远程服务器中工作。 Web应用程序执行连接,因此用户无需执行ssh username@host
,只需键入命令。
我尝试过node.js'ssh2
模块和其他使用ssh2的模块。但我遇到了同样的问题。每次使用exec()
以编程方式执行命令时,都会重新启动ssh会话。我会用一个例子来解释它。
> ls
返回主目录的内容,主目录中的一个目录为mydir
> cd mydir
> ls
再次返回我的主目录的内容,因为在执行命令后,ssh会话被关闭/重新启动。
任何可以完成这项工作的node.js库?甚至是与javascript不同的其他技术库?
编辑:使用node.js'模块ssh-exec
澄清的其他示例
服务器必须使用ssh在其他机器上执行一些命令。服务器中的函数包含以下代码
var c = exec.connection('username@host.com'); // It takes the ssh key from the default location
exec('cd mydir', c).pipe(process.stdout);
exec('ls -lh', c).pipe(process.stdout);
正如您所看到的,我没有在第一个exec
之后结束连接,但我获得的输出是主目录的内容而不是mydir目录的内容,因为ssh会话在每个{{{ 1}}。
答案 0 :(得分:1)
node.js的ssh2模块的维护者提供了解决方案。
使用方法shell()
代替方法exec()
。
方法shell()
与我们正在连接的服务器创建交互式会话。
方法shell()
提供了一个流作为其回调的参数(如方法exec()
)。
与使用exec()
时一样,stream.on('data', function(data, extended) {...});
可用于获取命令的输出。但是,在这种情况下,要为与您连接的机器提供命令(输入),您需要使用stream.write(yourcommand+'\n');
PS。随意编辑以提高答案的准确性。
答案 1 :(得分:0)
我必须猜一下,但你做的事情是child = exec('ssh username@host ls')
?
您可以执行类似
的操作child = exec('ssh username@host');
预先在浏览器的“循环”中
child.stdin.write('ls\n');
完成后,只需关闭stdin
:
child.stdin.end()
也完成了子进程。
答案 2 :(得分:0)
我知道这个链接已经过时了,但我认为如果他们正在寻找解决方案,这可能会有所帮助。
使用方法shell()而不是方法exec()。
作品。这是另一个解决方案。使用绝对文件路径,即
conn.exec("mkdir -p /home/user/Direc/{one,two,three}/", function(err, stream) {
if (err) throw err;
stream.on('data', function(data) {
console.log('STDOUT: ' + data);
}).stderr.on('data', function(data) {
console.log('STDERR: ' + data);
});
});
conn.exec("ls -la /home/user/", function(err, stream) {
if (err) throw err;
stream.on('close', function(code, signal) {
console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
conn.end();
}).on('data', function(data) {
console.log('STDOUT: ' + data);
}).stderr.on('data', function(data) {
console.log('STDERR: ' + data);
});
});