Javascript 将sudo密码提示传递给Node.js中生成的进程的stdout
我用Node.js构建了一个GUI,允许用户运行为CLI设计的自定义二进制文件。这些二进制文件是通过Javascript 将sudo密码提示传递给Node.js中生成的进程的stdout,javascript,node.js,command-line-interface,sudo,pty,Javascript,Node.js,Command Line Interface,Sudo,Pty,我用Node.js构建了一个GUI,允许用户运行为CLI设计的自定义二进制文件。这些二进制文件是通过子进程模块生成的。用户能够写入这些子进程的stdin并从stdout读取 然而,当一个二进制文件使用sudo命令时,密码提示会绕过stdout,指向(伪)终端设备,因此我无法通过编程捕获它,并通过奇特的GUI通知向用户请求密码。我知道,-S参数允许sudo从标准输入中获取密码,但我无法控制用户运行的脚本 我发现表示进程的stdin或stdout的流对象可能具有isTTY属性,该属性指示此进程在TT
子进程
模块生成的。用户能够写入这些子进程的stdin
并从stdout
读取
然而,当一个二进制文件使用sudo
命令时,密码提示会绕过stdout
,指向(伪)终端设备,因此我无法通过编程捕获它,并通过奇特的GUI通知向用户请求密码。我知道,-S
参数允许sudo
从标准输入中获取密码,但我无法控制用户运行的脚本
我发现表示进程的stdin
或stdout
的流对象可能具有isTTY
属性,该属性指示此进程在TTY上下文中运行。我尝试将使用TTY
模块创建的流传递给child\u进程的stdio
参数。没有任何运气的情况下,spawn
方法
我尝试使用pty.js
project()来解决这个问题,但由于某些原因,我不能依赖第三方库。我试图找出pty.js
将sudo
提示重定向到stdin
的方法,他们似乎使用自定义C代码来模拟pty()。我关心的是一个源文件中的一条注释,它指出“对于vanilla节点,不可能产生一个包含stdin和stdout fd的be isatty的子进程”。这是真的吗
现在,我使用一种变通方法,要求用户将权限提升到我的GUI进程,这样它就可以生成可能使用sudo的子进程,但我对这种方法不满意。根据manual(),有一种方法可以通过设置SUDO\u ASKPASS
环境变量来指定帮助程序来处理密码提示,但我找不到此类应用程序的示例
因此,我想知道是否有一种常见的做法可以克服我的问题,或者我应该放弃,继续初步获取根权限。将
sudo
的passwd提示符传递到其派生进程的问题是stdout
是当sudo
提示输入passwd时,我相信子shell(对应于其cmd行参数)还没有生成。我很了解你吗?如果我可以建议:当调用sudo
时,如果在Bourne-like shell中,do:sudo cmd--1>sudo stdout.log
。然后查询sudo stdout.log
对你来说足够好吗?如果这样,你可以制作更复杂的w/时间戳,也许需要PID,但是就我所知,没有为子进程生成子shell,因为没有顶级shell可供派生。该程序基于,作为GUI应用程序运行(更确切地说,作为Mac OS的.app包),并且用户不应该从命令行运行它。所以,没有可用的shell界面。好的。我不太清楚我的坏环境。