Python如何向netcat连接的Docker外部程序自动输入多组交互参数
解决方案
问题根因
你现有的代码存在两个核心错误:
subprocess.call是阻塞调用,会等待ncat进程完全退出后才会执行下一行代码,ncat连接未断开的情况下会一直卡在第一步- 第二行的
subprocess.call("5A")是把5A作为独立的系统命令执行,并不是给前一个启动的ncat进程传递输入,逻辑完全不匹配
推荐方案:使用pwntools库实现
你做的是安全方向的作业,pwntools是专门为这类交互场景设计的第三方库,不需要自己处理复杂的进程/网络通信逻辑,上手成本极低:
- 先安装库:
pip install pwntools - 示例代码如下:
from pwn import * # 建立到本地4444端口的连接 io = remote("127.0.0.1", 4444) # 发送Task-ID,sendline会自动在末尾加换行模拟手动输入回车 io.sendline(b"5A") # 发送学生证号 io.sendline(b"12x4x32") # 后续自定义交互逻辑示例: # 接收容器返回的内容:print(io.recvline().decode()) # 发送自定义参数:io.sendline(b"你需要传入的内容") # 需要手动调试时可以开启交互模式:io.interactive()
备选方案:使用标准库subprocess实现
如果不想安装第三方库,用标准库的subprocess也可以实现,需要注意处理缓冲区和换行逻辑:
import subprocess # 启动ncat进程,绑定标准输入输出流 proc = subprocess.Popen( ["ncat", "127.0.0.1", "4444"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) # 接收Task-ID输入提示(可选,用于判断当前输入阶段) print(proc.stdout.readline()) # 发送Task-ID,末尾加换行模拟回车,flush强制刷新缓冲区确保内容发出 proc.stdin.write("5A\n") proc.stdin.flush() # 接收学生证号输入提示 print(proc.stdout.readline()) # 发送学生证号 proc.stdin.write("12x4x32\n") proc.stdin.flush() # 后续自定义交互逻辑示例: # 接收容器返回:resp = proc.stdout.readline() # 发送自定义内容:proc.stdin.write("自定义内容\n"); proc.stdin.flush()
内容的提问来源于stack exchange,提问作者fancyStuff90
相关产品推荐
相关产品推荐

