在subprocess.call之后,Python3写入控制台

时间:2018-06-28 08:23:21

标签: python bash subprocess stdin

我正在用Python3编写一个脚本,该脚本进行subprocess.call,并且该调用要求用户输入密码。 我希望脚本调用子进程,然后自动写入密码,但是到目前为止,我还没有成功。 如果有帮助,我正在Linux机器上执行它。

我尝试过使用Popen和Pipe

p = Popen("Command that when executed requires me to input a password", shell=True, stdin=PIPE) p.stdin.write(PASSWORD.encode("UTF-8"))

这会导致错误,指出无法读取密码(这意味着至少完成了该过程)

,以及正常的子流程。

subprocess.call(COMMAND) sys.stdin.write(PASSWORD)

在这种情况下,它一直等到我按ENTER键,然后执行下一行。

2 个答案:

答案 0 :(得分:0)

尝试:

p1 = subprocess.Popen(['echo','PASSWORD'], stdout=PIPE)
subprocess.Popen("Command that when executed requires me to input a password", stdin=p1.stdout)
p1.stdout.close()

首先,您将某些东西回显到管道中,用作第二个子进程的输入

答案 1 :(得分:0)

以交互方式询问密码时,不应从文件中读取密码,而只能从终端读取密码。

在Unix / Linux上,要求输入密码的程序实际上是从/dev/tty而非标准输入中读取的,这很常见。一种简单的确认方法是:

echo password | path/to/command_asking_for_password

如果阻止等待密码,则很可能是从/dev/tty中读取了密码。

该怎么办?

  • 阅读文档。某些程序具有特殊选项,可以直接将密码作为命令行参数传递,或强制从stdin中读取
  • 使用伪终端。简单的重定向和在Linux / Unix领域之外的不可移植性要稍微复杂一些,但是pty的从属部分被程序视为其真正的/dev/tty

    import pty
    import os
    import subprocess
    ...
    master, slave = pty.openpty()
    p = Popen("Command that when executed requires me to input a password", shell=True, stdin=slave)
    os.write(master, PASSWORD.encode("UTF-8"))
    ...
    p.wait()
    os.close(master)
    os.close(slave)