node.js - 如何解析child_process.spawn stdio的process.stdin/process.stdout

标签 node.js

我尝试在 Node 脚本中包含命令并解析标准输入/输出流以添加/替换字符串。

例如,它用于自动插入 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.stdinprocess.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: Warning: Output is not to a terminal

如果我使用注释代码管道 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 模块来做我想做的事情,但这段代码不起作用,只有一个输入在两个作品上。

我希望具有第一个 block 代码的行为,vi 没有警告消息,ssh 很好,但可以将流编辑为第二个 block 代码。

感谢您的帮助!

最佳答案

I try wrap command in node script and parse stdin/out stream for add/replace string.

据我了解,以下是处理管道的方法

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(data) {

  process.stdout.write(data);

});

希望这有帮助

关于node.js - 如何解析child_process.spawn stdio的process.stdin/process.stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47818744/

相关文章:

mysql - ENOENT 与nodejs mysql 和sequelize

node.js - Ajax GET 请求 : x-access-token header not recieved in backend

php - 在 Node.js 中使用 PHP session (存储在 mySql 中)

node.js - 找不到jade-bootstrap安装文件

javascript - 快速返回错误而不退出响应

node.js - 使用 async/await 在 AWS lambda 上未处理的 promise 拒绝

javascript - 仅返回对象的第一个元素

javascript - Uncaught Error : Configuration must contain `projectId` ( when using environment variable )

node.js - NodeJS Twitter api 搜索超过 100 条推文

node.js - 使用 http-auth 进行身份验证时从 socket.io 获取用户对象