异步执行的命令捕获REPL输入

时间:2017-09-11 12:46:51

标签: julia stdin sudo

我在Julia REPL中运行这样的外部命令:

stream, process = open(`sudo cat file.txt`, "w", STDOUT)

命令sudo cat file.txt,在shell中标准执行时,要求输入密码然后打印文件。

所以我将它粘贴到REPL中,按回车键立即返回,因为该过程是异步运行的。到目前为止,一切都按预期运作。

但是当我开始在REPL中输入其他内容时,我输入的字符不会出现在屏幕上(sudo要求输入密码),因为异步过程(大概)是“窃取”我正在打字的文字。

1 个答案:

答案 0 :(得分:1)

您对open如何运作的理解是正确的。正如您在评论中澄清的那样,您的问题是sudo在终端中要求输入密码而不是从stream读取密码的原因。 Bobhttps://serverfault.com/a/731943处对此进行了详细解释。引用答案的相关部分:

  

实际上,典型的sudo调用根本不会从stdin读取密码。相反,sudo将直接访问控制终端(tty或pty,通过/ dev / tty特殊文件)并直接输出提示和读取字符。这可以在sudo源代码中的tgetpass.c文件中看到。

sudo能够使用-S标志从stdin读取。如果您想自己编写密码,可以使用此方法:

  

否则,如果您特别请求sudo从stdin读取,例如使用-S标志 - 它还会将提示写入stderr。这就是MadHatter的答案适用的情况。