node.js - 如何使用 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 会话的正确方法是什么?
解决方案
我最终解决了这个问题。很奇怪,出现的任何问题(在检查 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,
});
})
推荐阅读
- angular - 在用户连接之前我不知道的呼叫端点
- sql - 如何在 Hive 中最后一次出现单词后提取字符串
- ios - 获取带有经纬度的城市和国家名称(iOS)
- ios - 如何在 Swift 中隐藏继承的方法
- java - 使用 Hibernate 检索元素列表
- .net - 如何在 Visual Studio 2017 中从 .Net Core 控制台应用程序项目创建 EXE 输出?
- input - 为什么 Xcode10.1 的控制台不能显示我的输入?
- java - 在浏览器上进行身份验证并发出 POST 请求
- c# - AvalonDock 中的 ActiveX 控件 (XMetal XMax) 生成错误消息
- scala - 使用 withColumns 创建派生列时的“空”列