首页 > 解决方案 > 如何使用 node ssh2 启动用户交互式 ssh 会话?

问题描述

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

我在连接方式上发现了这个问题:Node.js 的 SSH 客户端

到目前为止,我发现的每一种方法都主要集中在打开 ssh 连接和使用节点运行命令,但我不希望运行任何命令,但我自己键入的命令除外。

我尝试使用的包是 ssh2 https://github.com/mscdex/ssh2#installation

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

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

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

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

标签: node.jsssh

解决方案


我最终解决了这个问题。很奇怪,出现的任何问题(在检查 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,
    });
})

推荐阅读