我已经使用Node.js构建了一个GUI,允许用户运行为CLI设计的自定义二进制文件。这些二进制文件使用child_process
模块生成。用户可以写入stdin
并从这些子进程的stdout
中读取。
然而,当二进制文件使用sudo
命令时,密码提示绕过stdout
并且前往(伪)终端设备,因此我无法以编程方式捕获它并要求用户带有精美GUI通知的密码。我知道,-S
参数允许sudo
期望标准输入的密码,但我无法控制用户运行的脚本。
我发现代表进程的stdin
或stdout
的流对象可能具有isTTY
属性,表明此进程在TTY上下文中运行。我试图将TTY
模块创建的流传递给stdio
方法的child_process.spawn
参数而没有任何运气。
我尝试使用实际解决问题的pty.js
项目(https://github.com/chjj/pty.js/),但出于某些原因,我不能依赖第三方库。我试图找出pty.js
将sudo
提示重定向到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权限。