You need to enable JavaScript to run this app. 如何向等待用户输入的sqlmapapi客户端线程传递预设输入
优惠活动
大模型
产品
解决方案
定价
更多

如何向等待用户输入的sqlmapapi客户端线程传递预设输入

问题核心原因

你当前代码用os.system启动sqlmapapi的服务端和客户端,拉起的子进程会直接把标准输入、输出绑定到运行脚本的物理终端上,Python主程序根本拿不到子进程的stdin操作句柄,自然没法把预设的?、后续的任务指令传递给等待输入的api>提示符。之前尝试把?塞到线程的args参数里没用,就是因为这个参数只是传给你自己写的client函数,根本触达不到sqlmapapi客户端进程本身的交互输入缓冲区。

可落地的实现方案

要实现交互式CLI进程的自动输入投喂,核心是替换掉os.system的启动方式,改用subprocess模块的Popen对象,直接拿到子进程的stdin句柄写入预设内容,不需要做额外的终端模拟。具体逻辑调整方向如下:

  • 服务端进程同样通过Popen拉起,不将输入输出绑定到当前终端,避免输出干扰自动化流程
  • 客户端进程启动后,待其完成初始化进入api>等待状态,直接把预定义的所有命令按顺序写入其stdin,配合换行符模拟人工敲回车的操作

可直接运行的参考代码:

import subprocess
import time
from threading import Thread

# 全局存储子进程句柄,方便后续状态管理
server_process = None
client_process = None

def host():
    global server_process
    # 以管道模式启动sqlmapapi服务端,不绑定当前终端
    server_process = subprocess.Popen(
        ["sqlmapapi", "-s", "-H", "0.0.0.0"],
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT,
        text=True
    )
    server_process.wait()

def client(auto_commands):
    """
    auto_commands: 要自动输入到客户端的命令列表,例如["?", "server.status", "exit"]
    """
    global client_process
    # 以管道模式启动sqlmapapi客户端
    client_process = subprocess.Popen(
        ["sqlmapapi", "-c", "-H", "127.0.0.1"],
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT,
        text=True
    )
    # 预留初始化缓冲时间,待客户端加载完成进入api>提示符状态
    time.sleep(3)
    # 按顺序写入预设命令
    for cmd in auto_commands:
        client_process.stdin.write(f"{cmd}\n")
        client_process.stdin.flush()  # 强制刷新缓冲区,确保命令送达
        time.sleep(1)  # 预留命令执行时间
    # 读取客户端执行输出,供后续自动化逻辑判断使用
    exec_output = client_process.stdout.read()
    print("客户端执行输出:", exec_output)
    client_process.wait()

def run():
    # 启动服务端线程
    host_thread = Thread(target=host)
    host_thread.start()
    time.sleep(5)  # 等待服务端完全启动
    # 定义要自动执行的命令列表,首条即为触发帮助的?命令
    preset_commands = ["?", "exit"]
    # 启动客户端线程
    client_thread = Thread(target=client, args=(preset_commands,))
    client_thread.start()
    client_thread.join()

if __name__ == "__main__":
    run()
关键实操注意点
  • 每次向子进程stdin写入内容后,必须调用flush()方法刷新缓冲区,否则写入的命令会卡在Python层的内存缓冲区,根本不会传递到sqlmapapi客户端的输入队列,最终还是会卡在等待输入的状态
  • 相邻两条命令之间预留1-2秒的等待间隔,避免命令发送速度过快,sqlmapapi没处理完上一条就把下一条指令错位解析,导致进程异常退出
  • 如果要做更稳定的自动化判断,不要硬等固定sleep时间,可以直接读取client_process.stdout的输出流,匹配到api>提示符出现的时机再发送对应命令,比固定等待更适配不同机器的性能差异
  • 原有的os.system接口天生不提供子进程的输入输出句柄,完全不适合这类交互式程序的自动化场景,必须替换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 19:54:06