【发布时间】:2014-09-11 13:43:34
【问题描述】:
我正在开发简单的 CLI,它的功能之一是将 ssh 运行到远程服务器。 这是我的意思的一个例子:
#!/usr/bin/env node
var spawn = require('child_process').spawn;
var readline = require('readline');
var iface =readline.createInterface({
input: process.stdin,
output: process.stdout
});
iface.setPrompt("host> ");
iface.on("line", function(line) {
if (line.trim() == "") {
return iface.prompt();
}
var host = line.split()[0];
iface.pause(); // PAUSING STDIN!
var proc = spawn('ssh', [ host, '-l', 'root', '-o', 'ConnectTimeout=4' ], { stdio: [0,1,2] });
proc.on("exit", function(code, signal) {
iface.prompt();
});
});
iface.prompt();
我使用 iface.pause() 使子进程能够以独占方式从 STDIN 读取,如果我删除此行,一些符号将被远程服务器捕获,另一些符号将被本地读取行捕获。
但是这个pause() 确实冻结了标准输入,所以如果 ssh 等待连接时间过长或试图向我询问密码,我无法发送任何字符,因为标准输入已暂停。我真的不知道成功连接后ssh如何处理(暂停?)标准输入,但它以某种方式工作。问题是“如何在交互式子进程工作时从 readline 中分离标准输入而不暂停它,并在子进程完成后将其附加回来?”
【问题讨论】:
标签: node.js stdin readline spawn child-process