【问题标题】:Print password prompt using Python's subprocess使用 Python 的子进程打印密码提示
【发布时间】:2016-04-10 23:46:48
【问题描述】:

如果我使用subprocess 从 Python 运行终端命令,如何打印密码提示?

我有一个 Python 脚本,它要求用户通过 Kerberos 进行身份验证。我的程序基本上是这样的:

import subprocess

def kinit():
  kinit = "kinit -f"
  prompt = subprocess.check_output(kinit, shell=True)
  print prompt   ## echoes "Password for username@domain.com" AFTER pw input

if __name__=="__main__":
  kinit()
  doOtherStuff()

从终端启动此脚本时,程序等待密码输入(可以通过命令行输入),但它只显示“username@domain.com的密码”用户输入密码后提示。

您知道如何在 Python 脚本等待用户输入密码之前显示“username@domain.com 的密码”吗?

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

    这是一个互动的事情,所以你不应该打电话给check_output。这通常用于子进程,这些子进程会做一些事情然后终止(不需要键盘输入)。

    您可以通过创建Popen 实例来做您想做的事情,然后使用Popen.communicate 与之交互。但是将输入发送到进程标准输入并正确地从标准输出中读取行而不会出现死锁或缓冲并发症可能会很棘手。

    还有一个更好的方法:pexpect 非常适合。我建议在这里放弃subprocess,转而使用pexpect

    【讨论】:

    • 这是正确的答案。试图让它与子流程一起工作只会导致很大的挫败感
    • 感谢您解释 (1) 为什么 check_output 不太理想,以及 (2) Popenpexpect 是更理想的解决方案。我会尝试这些,看看它们是如何工作的。
    • 你说的很对,完全有可能,只是难度更大
    【解决方案2】:

    事实证明你做不到。 subprocess 不会在进程中间返回输出,并且在您输入用户输入之前该进程不会完成。

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 2014-10-01
      • 2021-05-15
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      相关资源
      最近更新 更多