如何在 Windows 中检查正在运行的 shell?

Posted

技术标签:

【中文标题】如何在 Windows 中检查正在运行的 shell?【英文标题】:How to check for a running shell in windows? 【发布时间】:2021-10-01 13:38:43 【问题描述】:

我尝试在 python 中编写一个程序,当像 cmd 这样的 shell 被打开时通知我。

到目前为止,我在 python 中做了以下工作。 检查新的启动进程,获取进程的名称并检查其名称是否为 cmd.exe。 如果我自己手动启动 cmd 进程,这将有效。

但事实证明,如果我从 python 的子进程库中使用 subprocess.getoutput(command) 打开一个 shell,prosesses 中没有列出 shell,我也无法在 taskmanager 中看到它。 所以我假设它是运行 pythonscripts 进程的子进程?

我的下一个想法是列出一个进程正在使用的所有模块并检查模块中的 cmd.exe。 事实证明,带有 subprocess.getoutput(command) 的 pythonscript 没有在模块中使用 cmd.exe。奇怪。

所以现在我不确定如何检测外壳,或者我是否走在正确的道路上。 也许我需要找到 pythonprocess 的子进程?或者是否有可能在不调用 cmd.exe 的情况下获得 shell,老实说,我对此不太了解。 也许最好检查进程使用的方法中的某些 dll 吗?

我也尝试查看 subprocess.py 库,但我很难理解,它似乎至少通过 cmd 作为 subprocess.getoutput() 方法的参数。

有人可以帮忙吗?

谢谢。

更新:

我用这段代码来检测进程:

import wmi

c = wmi.WMI()
process_watcher = c.Win32_Process.watch_for("creation")
while True:
    new_process = process_watcher()
    print(new_process.Caption, new_process.ProcessId)
    if new_process.Caption =="cmd.exe":
        pid = new_process.ProcessID
        break

但是如果我运行这段代码

import subprocess
output = subprocess.getoutput("ipconfig")
print(output)

检测到的唯一进程是pythonw.exe

但如果我跑了

import subprocess
while True:
    output = subprocess.getoutput("ipconfig")
    print(output)

有时它会找到 cmd.exe。

所以我假设 wmi 需要很长时间才能检测到该过程。所以cmd已经关闭,找不到了。

任何想法如何更好地做到这一点?

【问题讨论】:

@user3763507:cmd 被打开是什么意思? @user1934428 我想我的意思是 cmd 的执行。抱歉,如果不使用正确的术语。如果你能教我更多,我会很高兴。 @user3762507 :所以您想知道,您的系统上是否正在运行cmd. exe?任务管理器或进程资源管理器不正是这样做的吗? Here 是一个解决方案。它在 Powershell 中,但您可以从 Python 程序中执行 powershell 脚本。 【参考方案1】:

我不知道解决方案的实用版本。但是如果您愿意,可以使用 pyautogui。您可以使用 pyautogui 编写一个程序,当它在任务栏找到 cmd 徽标时通知您。示例:

import pyautogui
cmdlogo = pyautogui.locateOnScreen('get screenshot of cmd logo and write file name here example:'cmd.png'')
While True:
    if cmdlogo:
        print('write here what yo want to say when it finds cmd')
    else:
        pyautogui.sleep(5)

【讨论】:

感谢您的回答。我猜通常 GUI 不会出现。我正在寻找不同的解决方案。

以上是关于如何在 Windows 中检查正在运行的 shell?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查我正在运行哪个版本的 WSL2?

如何检查 Kafka Server 是不是正在运行?

如何验证 Windows 服务是不是正在运行

如何使用 Windows 批处理文件检查端口 8086 是不是正在侦听

检查正在运行的进程是 32 位还是 64 位

如何检查程序是不是在 Windows 上的 Ubuntu 上的 Bash 中运行,而不仅仅是普通的 Ubuntu?