与node.js的ssh持久会话

时间:2014-01-30 10:24:02

标签: javascript node.js shell ssh

我正在使用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}}。

3 个答案:

答案 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);
    });
});