首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止Python子进程在调用Linux passwd实用程序时打印标准输出?

问如何防止Python子进程在调用Linux passwd实用程序时打印标准输出?
EN

Stack Overflow用户
提问于 2016-04-15 07:21:34
回答 1查看 84关注 0票数 0

当我使用subprocess时,我通常可以捕获标准输出并随心所欲地显示它。例如,

代码语言:javascript
复制
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(),就会显示标准输出:

代码语言:javascript
复制
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管道。

EN

回答 1

Stack Overflow用户

发布于 2016-04-15 07:23:49

这只发生在passwd上,因为passwd直接与TTY通信,而不是通过标准输入或标准输出。这是一种安全措施,并且是直接提示用户输入密码的公认最佳实践。

如果你真的必须绕过这个安全措施,考虑使用unbuffer实用程序(随expect提供)来创建一个伪造的TTY:

代码语言:javascript
复制
p = subprocess.Popen(['unbuffer', 'passwd', 'foo'],
  stdin=subprocess.PIPE,
  stdout=subprocess.PIPE,
  stderr=subprocess.PIPE)
(stdout, stderr) = p.communicate('password\npassword\n')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36635714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档