同样的问题困扰了我一个星期。我必须通过子进程安全地提交来自用户输入的密码,因为我试图避免引入命令注入漏洞。这是我在同事的帮助下解决问题的方法。
import subprocess
command = ['command', 'option1', '--password']
subprocess.Popen(command, stdin=subprocess.PIPE).wait(timeout=60)
.wait(timeout=int) 是最重要的组件,因为它允许用户向标准输入提供输入。否则,超时默认为 0,使用户没有时间输入输入,从而导致 None 或 null 字符串。让我永远弄清楚这一点。
对于您知道必须多次执行此操作的重复用例,您可以覆盖 popen 函数并将其用作私有方法,同一程序员告诉我,如果您预计其他人会感兴趣,这是最佳实践在以后维护代码时,您不希望他们弄乱它。
def _popen(cmd):
proc_h = subprocess.Popen(cmd, stdin=subprocess.PIPE)
proc_h.wait(timeout=60)
return proc_h.poll() == os.EX_OK
如果要提示用户输入,则删除 stdout=subprocess.PIPE 很重要。否则,该过程似乎会挂起 60 秒,并且用户不会得到提示,也不会意识到他们应该提供密码。标准输出自然会转到 shell 窗口并允许用户将输入传递给 popen()。
另外,只是为了解释为什么您返回 proc_h.poll() == os.EX_OK,如果命令成功,它会返回 0。这只是 c 风格的最佳实践,当您想要在函数失败的情况下返回系统错误代码时,同时考虑到返回 0 将被解释器视为“假”的事实。