SSH与node.js的持久会话(ssh persistent sessions with node

2019-09-29 15:05发布

我与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

Answer 1:

的node.js' SSH2模块的维护者提供的解决方案。

使用的方法shell()代替方法exec()

该方法shell()创建了我们连接服务器的交互式会话。 该方法shell()提供了一个流作为其回调的参数(如该方法exec()

当使用像exec() stream.on('data', function(data, extended) {...}); 可以用来获得命令的输出。 然而,在这种情况下,为了提供命令(输入)到您与所连接的机器,则需要使用stream.write(yourcommand+'\n');

PS。 随意编辑,以提高回答的准确度。



Answer 2:

我已经猜出了一点,但你做的东西像child = exec('ssh username@host ls')

你可以这样做

child = exec('ssh username@host');

前期,并在浏览器中的“循环”

child.stdin.write('ls\n');

完成后,只需关闭stdin

child.stdin.end()

这也完成了子进程。



Answer 3:

我知道这个链接是旧的,但我想这可能会帮助别人,如果他们正在寻找一个解决方案。 该

使用的方法壳()代替的方法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);
    });
});


文章来源: ssh persistent sessions with node.js