如何向等待用户输入的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
相关产品推荐
相关产品推荐

