如何在 python 中的子进程调用期间阻止 stdout 显示我的密码? [复制]

Posted

技术标签:

【中文标题】如何在 python 中的子进程调用期间阻止 stdout 显示我的密码? [复制]【英文标题】:How do I block stdout from showing my password during my subprocess call in python? [duplicate] 【发布时间】:2014-04-09 21:07:22 【问题描述】:

我想阻止在我运行 subprocess.call() 时变得可见的输出。 这是我想要停止的唯一输出,因为我需要显示之后运行的命令。

调用显示我已设置为系统变量的密码,该密码在正在执行的文件中隐藏为 %%mypassword%%(但是,它显示在命令行界面中)。

from subprocess import call
with open('//path/pwhold.txt','w') as pwhold:
        call(r"\\filetorun\%s.bat" % DB,stdout=pwhold)
os.unlink('//path/pwhold.txt')

这种工作方式,但文件在文件执行完成后才会被删除。

还有其他方法可以做到这一点吗?

【问题讨论】:

只需使用os.devnull 而不是'//path/pwhold.txt',如the page I've linked above 中所述。 【参考方案1】:

根据 Sebastion 的 cmets。 subprocess.call() 使用的接口需要一个实际的文件句柄才能在操作系统级别捕获输出。执行命令时尝试使用字符串或字符串缓冲区失败。

忽略:这不起作用: 将 STDOUT 重定向到字符串而不是文件。这样你的信息只会出现在内存中。请参阅this 问题。

TLDR 使用:

from cStringIO import StringIO
import sys

old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()

from io import TextIOWrapper, BytesIO

# setup the environment
old_stdout = sys.stdout
sys.stdout = TextIOWrapper(BytesIO(), sys.stdout.encoding)

【讨论】:

替换 sys.stdout 不会影响子进程。 OP 可以use os.devnull file instead。一般来说,如果你想redirect at C level, you need something like os.dup() on Unix(它可能适用于Windows,我没有尝试过) 你是对的。但是如果你说 mystdout = StringIO() 然后将调用修改为 call(r"\\filetorun\%s.bat" % DB,stdout=mystdout) 这种方法是否可行? 执行此操作后: mystdout = StringIO() 这不起作用: call(r"\\filepathxxx\temp\%s.bat" % DB,stdout=mystdout) 就是您所说的关于?你能告诉我这是如何实现的吗? -1:看来我还不够清楚。您的解决方案不起作用。要查看它,您可以尝试运行任何打印内容的子进程。 谢谢,其他帖子“如何在 Python 2.7 中隐藏子进程的输出”的 FNULL 解决方案有效。:FNULL=open(os.devnull,'w'); subprocess.call(r"file.bat",stdout=FNULL,stderr=subprocess.STDOUT); FNULL.close()

以上是关于如何在 python 中的子进程调用期间阻止 stdout 显示我的密码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中杀死使用 subprocess.call 调用的子进程? [复制]

带有管道的子进程调用[重复]

Python 2.7:调用 subprocess.popen 阻止文件访问

如何在 Python 中运行 Google Cloud Function 中的子进程

父进程全局变量如何复制到python多处理中的子进程

如何在python的子进程中执行一组语句?