Node.js如何使用child_process.exec显示标准输入(stdin)输入

9
我有一个使用child_process.exec调用npm adduser的node.js脚本。通常情况下,如果我在控制台中输入npm adduser,则会得到以下内容:
用户名:[stdin提示]
密码:[stdin提示]
等等。
如果我使用node.js执行此代码,则不会打印任何内容,并且它只会停留在空提示处,直到我ctrl-C退出为止。
如何获得通常的行为?我基本上只想执行bash并让它自己完成...

直接从Node调用adduser不可能吗?如果不行,有方法可以将stdin发送到该进程中。我从未尝试过,但它已经记录在案了。 - adeneo
是的,我可以直接从Node.js中完成它。 - Eli
2个回答

7
所以,不要使用exec,它是用于在不进行任何复杂的stdio交互的情况下运行程序的。相反,使用child_process.spawn,它将为您提供对npm进程的stdio的访问,并且您可以在子进程的stdin文件上调用child.stdin.write(username + "\n")(密码也是类似的)。这可能足以使事情继续进行,但有时在程序期望用户交互输入时,以编程方式模拟可能会很棘手(因此存在诸如expect之类的东西)。
我认为npm(通过“read”npm模块)正在读取没有回显的标准输入流,如果是这样,那么这应该起作用。然而,如果它直接从tty设备中读取,则写入标准输入流将无法正常工作。

6
具体来说,我做了这件事:require("child_process").spawnSync("sh", ["-c", "npm adduser"], {stdio: "inherit", stdin: "inherit"}); - Eli

0
const {spawnSync} = require('child_process');

spawnSync('sh', ['-c', 'npm adduser'], {stdio: 'inherit', stdin: 'inherit'});

你的回答可以通过添加更多关于代码功能和如何帮助提问者的信息来改进。 - Tyler2P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接