Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将sudo密码提示传递给Node.js中生成的进程的stdout_Javascript_Node.js_Command Line Interface_Sudo_Pty - Fatal编程技术网

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

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

我用Node.js构建了一个GUI,允许用户运行为CLI设计的自定义二进制文件。这些二进制文件是通过
子进程
模块生成的。用户能够写入这些子进程的
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界面。好的。我不太清楚我的坏环境。