You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于subprocess的Python进程终止问题:testssl.sh完成后进程仍运行

解决testssl.sh执行完成后Python进程持续运行的问题

问题背景

开发基于Web的SSL扫描器,后端通过Python的subprocess模块在WSL Ubuntu环境中执行testssl.sh脚本。当前存在的问题是:testssl.sh完成扫描后,Python进程仍持续运行;使用固定超时的process.wait(timeout=...)方法时,要么因超时设置过长提前抛出异常(服务器配置简单时),要么因超时不足导致扫描中断(服务器配置复杂时)。

问题根源

当前代码启动了交互式Ubuntu shell进程,在shell中输入命令执行testssl.sh。即使testssl.sh执行完成,交互式shell仍会等待用户输入,导致Python的Popen进程无法自动终止。

解决方案

直接通过wsl.exe执行单次命令,而非启动交互式shell。将切换目录和执行testssl.sh的逻辑合并为一条bash命令,命令执行完成后进程会自动退出,Python可正确感知执行结束。

修改后的代码

import subprocess

# 获取目标主机名
hostname = input("Enter the Hostname to test: ")

# 构造WSL环境下的完整执行命令:切换到脚本目录并执行testssl.sh
wsl_command = (
    f"cd /mnt/e/WSL/Ubuntu_2004/testssl.sh-3.1dev && "
    f"./testssl.sh --htmlfile ../reports/scans --openssl-timeout 5 {hostname}"
)

# 调用wsl.exe直接执行命令,无需交互式shell
process = subprocess.Popen(
    ["wsl.exe", "-e", "bash", "-c", wsl_command],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    text=True  # 文本模式处理输出,简化编码解码操作
)

# 等待命令执行完成,同时捕获输出和错误信息
stdout, stderr = process.communicate()

# 按需处理输出内容
if stdout:
    print("扫描结果输出:\n", stdout)
if stderr:
    print("错误信息:\n", stderr)

关键说明

  1. 避免交互式shell:使用wsl.exe -e bash -c "命令"直接执行单次命令,命令完成后bash进程自动退出,Python的Popen进程也会随之终止。
  2. 合并命令逻辑:用&&连接cd和testssl.sh命令,确保只有切换目录成功后才执行扫描脚本。
  3. 灵活等待执行:communicate()方法会等待进程执行完成,无需设置固定超时,完美适配不同复杂度的服务器扫描需求。如果不需要捕获输出,也可以直接使用process.wait()。

内容的提问来源于stack exchange,提问作者PeaBee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:13:18