我正在用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键,然后执行下一行。
答案 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
中读取了密码。
该怎么办?
使用伪终端。简单的重定向和在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)