Python多线程反向监听器多连接及自动执行命令问题求助
Python反向监听器多客户端支持与自动化执行修复方案
一、现有代码核心问题修复
你当前代码无法接收连接的直接原因是主流程顺序错误,同时存在以下可直接修复的问题:
- 语法错误:第13行
queue = Queue)缺左括号,修正为queue = Queue() - 主流程阻塞:
main()函数中先执行了start_luka()的死循环,永远无法执行到accept_connections()监听连接的逻辑,自然不会有连接建立提示 - 多线程未启用:你预先定义了2线程的参数,但没有实际启动线程分别处理连接监听和交互命令两个并发任务
- 核心函数缺失:
get_target()、send_target_commands()两个核心功能函数未定义,选择客户端、发送命令的逻辑无法运行
二、多客户端并发支持实现
用你预留的2线程配置,分别分配两个任务:
- 线程1:持续运行
accept_connections(),接收新客户端连接并存入列表 - 线程2:持续运行
start_luka(),处理用户输入的交互命令
实现线程调度的示例代码:
def create_workers(): for _ in range(NUMBER_OF_THREADS): t = threading.Thread(target=work) t.daemon = True t.start() def work(): while True: x = queue.get() if x == 1: socket_create() socket_bind() accept_connections() if x == 2: start_luka() queue.task_done() def create_jobs(): for x in JOB_NUMBER: queue.put(x) queue.join()
修改main()函数为:
def main(): create_workers() create_jobs()
三、新连接自动执行命令与落盘实现
在accept_connections()函数中,新连接建立后直接触发自动执行逻辑即可,示例修改:
# 接受连接的函数修改 def accept_connections(): for c in all_connections: c.close() del all_connections[:] del all_addresses[:] # 预定义要自动执行的命令 AUTO_CMD = ["ls", "pwd", "ip a"] while 1: try: conn, address = s.accept() conn.setblocking(1) all_connections.append(conn) all_addresses.append(address) print("\nConnection has been established: " + address[0]) # 自动执行命令逻辑 log_file_name = f"{address[0]}_{int(time.time())}.log" with open(log_file_name, "a", encoding="utf-8") as f: f.write(f"=== 客户端 {address[0]}:{address[1]} 执行记录 ===\n") for cmd in AUTO_CMD: conn.send(str.encode(cmd)) resp = str(conn.recv(20480), "utf-8") f.write(f"\n--- 命令 {cmd} 执行结果 ---\n") f.write(resp) print(f"客户端 {address[0]} 自动命令执行完成,日志已存入 {log_file_name}") except Exception as e: print(f"Error accepting connections: {str(e)}")
四、补充缺失的核心功能函数
添加get_target()和send_target_commands()函数即可实现手动选择客户端执行命令的功能:
def get_target(cmd): try: target = int(cmd.split(' ')[1]) conn = all_connections[target] print(f"已连接到客户端 {all_addresses[target][0]}") return conn except: print("客户端编号无效") return None def send_target_commands(conn): while True: try: cmd = input() if cmd == 'quit': break if len(str.encode(cmd)) > 0: conn.send(str.encode(cmd)) client_response = str(conn.recv(20480), "utf-8") print(client_response, end="") except: print("命令发送失败,连接已断开") break
内容的提问来源于stack exchange,提问作者Bahar lila
相关产品推荐
相关产品推荐

