首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解析child_process.spawn stdio的process.stdin/process.stdout

如何解析child_process.spawn stdio的process.stdin/process.stdout
EN

Stack Overflow用户
提问于 2017-12-14 17:09:21
回答 1查看 422关注 0票数 2

我尝试在节点脚本中包装命令,并解析stdin/out流以添加/替换字符串。

它用于自动插入ssh/sudo密码--例如,我不想使用expect,因为它太死板了。就像触发iTerm2的方向性,但终端不可知论。

如果你知道这个工具,或者你有更好的想法,欢迎你=D!

我试试看:

代码语言:javascript
复制
#!/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.stdinprocess.stdout

我也试过这个:

代码语言:javascript
复制
#!/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标志的情况下不能工作。

我也试过这个:

代码语言:javascript
复制
#!/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模块来做我想做的事情,但是这段代码不起作用,只有一个输入两个工作。

我想有第一个代码块的行为,没有警告消息与vissh伟大,但可以编辑流作为第二个块代码。

谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

发布于 2017-12-27 15:08:42

我尝试在节点脚本中包装命令,并解析stdin/out流以添加/替换字符串。

据我所知,下面是处理管道的方法

代码语言:javascript
复制
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(data) {

  process.stdout.write(data);

});

我希望这能帮到你

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47818744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档