如何使用节点ssh2启动用户交互式ssh会话?

时间:2018-08-16 22:16:23

标签: node.js ssh

我一直在尝试找到一种使节点脚本自动为我打开ssh连接的方法。我不希望它运行任何命令,只需打开连接并让我开始输入即可。

我在连接方法上发现了这个问题:SSH client for Node.js

到目前为止,我发现的每一种方式都主要集中在打开ssh连接和运行带有node的命令上,但是我不想运行任何命令,只能输入我自己输入的命令。

我要使用的软件包是ssh2 https://github.com/mscdex/ssh2#installation

它可以很好地连接,但是我找不到用于将process.stdio轻松连接到它的方法的示例。我可以想象这样做的方法很复杂,但是似乎必须有一些非常简单的方法。

我已经阅读了有关“交互式shell会话”的部分,但似乎有点用词不当,因为它实际上只是运行ls -l然后退出。根本没有任何互动。

https://github.com/mscdex/ssh2#start-an-interactive-shell-session

使用此工具启动正常,基本,普通的tty ssh会话的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我最终解决了这个问题。奇怪的是,出现了任何问题(在检查ssh2的源代码时)似乎设置为完全按照我的想法执行。无论如何,这段代码对我有用:

const {host, password, port, username} = sshCreds;
return new Promise((resolve) => {
    var conn = new Client();
    conn.on('ready', function() {
        console.log('Client :: ready');
        conn.shell(function(err, stream) {
            if (err) throw err;

            const stdinListener = (data) => {
                skipNext = true;
                stream.stdin.write(data);
            };

            stream.on('close', function() {
                process.stdin.removeListener("data", stdinListener)
                conn.end();
                resolve();
            }).stderr.on('data', function(data) {
                resolve();
            });

            // skip next stops double printing of input
            let skipNext = false;
            stream.stdout.on("data", (data) => {
                if (skipNext) { return skipNext = false; }
                process.stdout.write(data);
            })

            process.stdin.on("data", stdinListener)
        });
    }).connect({
        host,
        port,
        username,
        password,
    });
})