我与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会话每个复位后exec
。
的node.js' SSH2模块的维护者提供的解决方案。
使用的方法shell()
代替方法exec()
该方法shell()
创建了我们连接服务器的交互式会话。 该方法shell()
提供了一个流作为其回调的参数(如该方法exec()
当使用像exec()
stream.on('data', function(data, extended) {...});
可以用来获得命令的输出。 然而,在这种情况下,为了提供命令(输入)到您与所连接的机器,则需要使用stream.write(yourcommand+'\n');
PS。 随意编辑,以提高回答的准确度。
我已经猜出了一点,但你做的东西像child = exec('ssh username@host ls')
你可以这样做
child = exec('ssh username@host');
前期,并在浏览器中的“循环”
child.stdin.write('ls\n');
完成后,只需关闭stdin
:
child.stdin.end()
这也完成了子进程。
我知道这个链接是旧的,但我想这可能会帮助别人,如果他们正在寻找一个解决方案。 该
使用的方法壳()代替的方法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);
});
});