【问题标题】:Asynchronously executed command captures REPL input异步执行的命令捕获 REPL 输入
【发布时间】:2017-09-11 12:46:51
【问题描述】:

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

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

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

所以我将它粘贴到 REPL 中,按 enter 并立即返回,因为该过程是异步运行的。到目前为止一切正常。

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

【问题讨论】:

  • 你能再解释一下你的问题吗?
  • 我扩展了答案,如果还不清楚,请告诉我。
  • 不只是希望您输入密码吗?
  • 正如 Tasos 所说,它可能只是要求输入密码。没有看到[sudo] password for xxx: 提示符吗?
  • 文档是正确的,STDIN 是 stream,但 sudo 不从 STDIN 读取。请参阅serverfault.com/questions/731886/… 了解更多信息。

标签: julia stdin sudo


【解决方案1】:

您对open 工作原理的理解是正确的。正如您在 cmets 中阐明的那样,您的问题是关于为什么 sudo 在终端中要求输入密码而不是从 stream 读取密码。 Bobhttps://serverfault.com/a/731943 很好地解释了这一点。引用答案的相关部分:

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

sudo 能够使用-S 标志从标准输入读取。如果您想通过脚本自己编写密码,可以使用它:

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

【讨论】:

    猜你喜欢
    • 2014-06-24
    • 1970-01-01
    • 2013-03-22
    • 2020-07-04
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2012-04-10
    相关资源
    最近更新 更多