当我使用subprocess时,我通常可以捕获标准输出并随心所欲地显示它。例如,
import subprocess
proc = subprocess.Popen(['./foo.py'], stdin=subprocess.Pipe, stdout=subprocess.Pipe)
# the standard out is not displayed unless I do something with the stdout var
stdout, stderr = proc.communicate()但是,如果我使用subprocess来调用Linux passwd实用程序,那么只要调用proc.communicate(),就会显示标准输出:
import subprocess
proc = subprocess.Popen(['passwd', 'foo'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
# standard out is displayed immediately
stdout, stderr = proc.communicate('password\npassword\n')
BAD PASSWORD: it is based on a dictionary word
Retype new password: 为什么这种情况只发生在passwd上?例如,在ls中就不会发生这种情况。从subprocess调用passwd时,我可以做些什么来防止打印标准输出
请注意,我希望实际捕获标准输出,并在以后对其执行某些操作,因此我不希望将stdout设置为devnull管道。
发布于 2016-04-15 07:23:49
这只发生在passwd上,因为passwd直接与TTY通信,而不是通过标准输入或标准输出。这是一种安全措施,并且是直接提示用户输入密码的公认最佳实践。
如果你真的必须绕过这个安全措施,考虑使用unbuffer实用程序(随expect提供)来创建一个伪造的TTY:
p = subprocess.Popen(['unbuffer', 'passwd', 'foo'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(stdout, stderr) = p.communicate('password\npassword\n')https://stackoverflow.com/questions/36635714
复制相似问题