我在node脚本中尝试wrap命令并解析stdin / out流以添加/替换字符串。
这是自动插入ssh / sudo密码,例如,我不想使用expect
,因为它太僵硬了。就像iTerm2的触发功能一样,但终端不可知。
如果你知道这个工具或者你有更好的想法,欢迎你= D!
我试试这个:
#!/usr/bin/env node
const child_process = require('child_process');
const command = ['vi', ['index.js']];
let spawned_process = child_process.spawn(...command, {
env: process.env,
shell: '/bin/bash',
stdio: [process.stdin, process.stdout, process.stderr]
});
这项工作非常顺利,但我找不到process.stdin
和process.stdout
的访问权限。
我也试过这个:
#!/usr/bin/env node
const child_process = require('child_process');
const command = ['vi', ['index.js']];
let spawned_process = child_process.spawn(...command, {
env: process.env,
shell: '/bin/bash',
stdio: [process.stdin, 'pipe', 'pipe']
});
// process.stdin.setRawMode(true);
// process.stdin.pipe(spawned_process.stdin);
spawned_process.stdout.pipe(process.stdout);
spawned_process.stderr.pipe(process.stderr);
spawned_process.on('exit', function (code) {
process.exit(code);
});
这也很好用event-stream
模块,我可以解析和修改流。
但我有这样的信息:
Vim:警告:输出不是终端
如果我使用注释代码管道process.stdin
,我输入相同的消息,ssh
命令在没有-tt
标志的情况下不起作用。
我也试过这个:
#!/usr/bin/env node
const child_process = require('child_process');
const fs = require('fs');
const tty = require('tty');
const command = ['vi', ['index.js']];
// find in `ttys` module code
let ttyFd = fs.openSync('/dev/tty', 'w');
let stdout = new tty.WriteStream(ttyFd);
stdout._type = 'tty';
if (stdout._handle && stdout._handle.unref) {
stdout._handle.unref();
}
if (stdout._refreshSize) {
process.on('SIGWINCH', function() {
stdout._refreshSize();
})
}
stdout.pipe(process.stdout);
var spawned_process= child_process.spawn(...command, {
env: process.env,
shell: '/bin/bash',
stdio: [process.stdin, stdout, process.stderr]
});
在这里我也可以使用event-stream
模块来做我想要的但是这段代码不起作用,只有两个输入有效。
我希望得到第一个块代码的行为,没有vi
的警告消息,ssh
很好,但可以将流编辑为第二个块代码。
感谢您的帮助!
答案 0 :(得分:0)
我在node脚本中尝试wrap命令并解析stdin / out流以添加/替换字符串。
据我所知,以下是处理管道的方法
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(data) {
process.stdout.write(data);
});
我希望这会有所帮助