将sudo密码提示传递给Node.js中生成进程的stdout

时间:2016-04-20 22:34:14

标签: javascript node.js command-line-interface sudo pty

我已经使用Node.js构建了一个GUI,允许用户运行为CLI设计的自定义二进制文件。这些二进制文件使用child_process模块生成。用户可以写入stdin并从这些子进程的stdout中读取。

然而,当二进制文件使用sudo命令时,密码提示绕过stdout并且前往(伪)终端设备,因此我无法以编程方式捕获它并要求用户带有精美GUI通知的密码。我知道,-S参数允许sudo期望标准输入的密码,但我无法控制用户运行的脚本。

我发现代表进程的stdinstdout的流对象可能具有isTTY属性,表明此进程在TTY上下文中运行。我试图将TTY模块创建的流传递给stdio方法的child_process.spawn参数而没有任何运气。

我尝试使用实际解决问题的pty.js项目(https://github.com/chjj/pty.js/),但出于某些原因,我不能依赖第三方库。我试图找出pty.jssudo提示重定向到stdin的方式,似乎他们使用自定义C代码来模拟PTY(https://github.com/chjj/pty.js/blob/master/src/unix/pty.cc)。我关注其中一个源文件中的注释,其中指出'< ...>对于vanilla节点,不可能产生一个具有stdin和stdout fd的子进程是isatty< ...> '。这是真的吗?

现在我使用一种解决方法,要求用户将权限提升到我的GUI流程,以便它可以生成可能使用sudo的子项,但我对这个hack不满意。根据手册(http://linux.die.net/man/8/sudo),有一种方法可以通过设置SUDO_ASKPASS环境变量来指定帮助程序来处理密码提示,但是我无法找到这样一个应用程序的示例。

所以我想知道是否有一个常见的做法来克服我的问题,或者我应该放弃并继续获得root权限。

0 个答案:

没有答案