在 Python 中禁用 subprocess.Popen 回显到命令提示符窗口标题
Posted
技术标签:
【中文标题】在 Python 中禁用 subprocess.Popen 回显到命令提示符窗口标题【英文标题】:Disable subprocess.Popen echo to command prompt window title in Python 【发布时间】:2020-06-10 22:48:27 【问题描述】:我正在尝试使用 Python 的 subprocess.Popen
构建一个模块,用于将 Python 绑定到命令行界面;就 CLI 绑定而言,几乎就在那里,但我真的希望能够掩盖一些“私人”论点。
CLI 使用帐户信息,我想从命令提示标题中隐藏帐户凭据。下面是我在 CLI 绑定类中使用 login
方法时出现的屏幕截图。
我知道我在这里使用纯文本作为密码 ('TAIL'
),但我想简单地展示正在发生的事情的用法。从图中可以看出,使用 subprocess.Popen 的完整命令“发送”显示在提示的标题中。
我最近发现有一种方法可以使用os
或ctypes
以编程方式更改标题,因此我可以有效地掩盖或掩盖我不想显示在命令提示符标题如下所示:
但是有没有更好的方法来禁用 subprocess.Popen
的“echo-to-title”(因为没有更好的名字)?
【问题讨论】:
Popen()
不应该创建 CMD 窗口,它应该只返回您使用它运行的程序的输出。
@Barmar ,没错,在我的情况下,它不是创建 CMD 窗口,而是在命令窗口中使用。我链接的第一张图片(因为我还不能直接附加)显示我正在直接从 CMD 加载的 Python 解释器中测试我的脚本。 Popen()
在 CMD 标题中显示命令。
ss64.com/nt/title.html
我一定没有说清楚,这是我找到的解决方法(使用os
或ctypes
),但我想知道Popen
是否有更直接的方法。
不,我对此表示怀疑。它对CMD一无所知。当标题配置为显示当前命令时,CMD 会自动监控进程以获取它。
【参考方案1】:
事实上,密码永远不应该作为命令行参数传递给可执行文件。
原因:
任何能够查看正在运行的进程及其参数的人都可以看到密码。
一种解决方案是,父进程。将密码放在环境变量中,被调用的程序从环境变量中获取参数。
所以调用者会是这样的:
import os
os.environ["ACRTAC_PASSWORD"] = "TAIL"
subprocess.Popen([...])
还有 acrtac.py
import os
password = os.environ["ACRTAC_PASSWORD"]
【讨论】:
谢谢@gelonida,但这无助于回答我的根本问题。你知道有什么方法可以让Popen()
掩盖 CMD 的标题吗?
正如我所说,在 cmd 窗口中隐藏关键密码很好,但并不安全。因为您仍然可以使用进程资源管理器或使用ps
在类似 unix 的系统上找到密码。因此,独立于您的问题,我建议更改代码,例如,它不会将机密信息作为命令行参数传递。但我明白,您不接受我的回答作为解决方案。你可能会尝试调用一些东西(我没有要测试的 windows 机器)Popen(["cmd.exe", "/title", "title", "/c", "python.exe", "param1", "param2", "param3"])
什么也可能起作用的是,如果调用 subprocess.Popen 的程序已经在 cmd 窗口中启动。在这种情况下,应该在已经存在的 cmd 窗口中调用子进程,据我所知,标题不会改变
进程环境是process parameters 中的一个字段,几乎可以像命令行一样轻松读取。由于 Windows API 没有记录字段偏移量,因此更加模糊。但是常见的免费工具,比如微软自己的 Process Explorer 很容易显示一个进程的环境。防止这种情况发生需要使用自定义安全描述符创建进程,该描述符拒绝标准用户打开具有PROCESS_VM_READ
访问权限的句柄。
嗨,erik,Windows 上的情况可能与 linux 上的不同。据我所知,只有进程所有者可以看到环境,而任何用户都可以看到正在运行的进程及其参数。以上是关于在 Python 中禁用 subprocess.Popen 回显到命令提示符窗口标题的主要内容,如果未能解决你的问题,请参考以下文章
python 在Python中禁用Internet。使用py.test钩子。 (禁用socket.socket。)GREAT用于单元测试。