需要帮助弄清楚这一点。
我试图通过子进程生成调用外部应用程序,并且在调用该应用程序后,它要求输入密码。然后,我得到一个致命错误,子进程退出。我已经尝试了几种不同的组合来放置child.stdin.write('somepassword \ n'),但是我遇到了同样的错误。我认为这与孩子没有被应用程序视为终端有关。
示例代码:
const { spawn } = require('child_process');
const child = spawn('./some-app',[arguments],{shell:true});
// process.stdin.pipe(child.stdin)
child.stdin.write('testpw\n'); // has no effect
child.stdout.on('data', (data) => {
console.log(`child stdout:\n${data}`);
//child.stdin.write('testpw\n'); // no effect here either
});
child.stdin.end();
child.stderr.on('data', (data) => {
console.error(`child stderr:\n${data}`);
});
child.on('exit', function (code, signal) {
console.log('child process exited with ' +
`code ${code} and signal ${signal}`);
});
Terminal Output
> node spawn.js
child stdout:
Enter password: Fatal error:
Unix.Unix_error(Unix.ENOTTY, "tcgetattr", "")
child process exited with code 1 and signal null
该错误使我相信child_process看到的环境不是tty,而是在寻找如何让孩子看到的环境,这将我送入了一个深深的unix兔子洞,并且与节点相关不突出答案。我正在Ubuntu 16.04和nodejs V10.15上运行它
编辑 如果我为child.stdin更改了stdio流,则该过程不再具有致命错误,而是现在就坐下来等待用户的键盘输入。但是对process.stdin.write()的写入将显示在屏幕上,但是除非我亲自在键盘上键入,否则孩子不会响应。
const { spawn } = require('child_process');
const child = spawn('./some-app',
[arguments],
{
shell:true,
stdio:['inherit','pipe','pipe']
});
child.stdout.on('data', (data) => {
console.log(`child stdout:\n${data}`);
process.stdin.write('testpw\n'); // displays but not handled by the
// process
});
child.stderr.on('data', (data) => {
console.error(`child stderr:\n${data}`);
});
child.on('exit', function (code, signal) {
console.log('child process exited with ' +
`code ${code} and signal ${signal}`);
});
Terminal Output
> node spawn.js
child stdout:
Enter password:
testpw <-- process sits here waiting for real keyboard input