Python 2.7 Socket端口扫描脚本遇socket.error如何继续扫描?
解决端口扫描脚本遇socket.error退出的问题
嘿,这个问题我之前写扫描脚本时也碰到过!核心原因就是你的脚本没有对socket操作可能抛出的异常做捕获处理——一旦触发socket.error(比如目标拒绝连接、超时、网络不通之类的),Python就会直接终止整个程序,自然没法继续扫后面的端口和IP了。
解决办法很简单,用try-except语句把每个端口的扫描逻辑包裹起来,捕获对应的异常,处理完让程序接着跑就行。给你修改后的代码示例,我还加了一些实用的细节:
import socket import time print "+" * 40 starting_time = time.time() print " Scanning started at %s" % (time.strftime("%I:%M:%S %p")) print "+" * 40 # 替换成你自己的IP和端口列表 target_ips = ["192.168.1.1", "127.0.0.1", "8.8.8.8"] target_ports = [21, 22, 80, 443, 3389] for ip in target_ips: print "\n=== Scanning IP: %s ===" % ip for port in target_ports: try: # 创建TCP socket对象 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置2秒超时,避免卡在无响应的端口上 sock.settimeout(2) # 尝试连接端口,connect_ex返回0表示成功 connect_result = sock.connect_ex((ip, port)) if connect_result == 0: print "✅ Port %d is open" % port # 尝试获取Banner信息 try: # 发送简单请求(不同服务可能需要不同的请求头,这里用HTTP示例) sock.send("HEAD / HTTP/1.1\r\nHost: %s\r\n\r\n" % ip) banner = sock.recv(1024).strip() print " Banner: %s" % banner except socket.error: print " ❌ Failed to retrieve banner for port %d" % port sock.close() except socket.error as e: # 捕获所有socket相关异常,打印错误后继续下一个端口 print "❌ Error scanning port %d on %s: %s" % (port, ip, str(e)) continue ending_time = time.time() print "\n=== Scanning finished in %.2f seconds ===" % (ending_time - starting_time)
几个关键的修改点:
- 用
try-except socket.error包裹了每个端口的扫描逻辑,不管是连接失败还是数据收发出错,都会捕获异常,打印错误后用continue继续扫下一个端口 - 给socket设置了
settimeout(2),避免因为某个端口长时间无响应导致脚本卡住 - 嵌套了一层try-except专门处理Banner获取的异常——毕竟有些开放端口可能不会响应你的请求,单独处理不会影响端口状态的判断
- 优化了输出格式,让结果更易读
这样修改后,哪怕某个端口或IP触发socket错误,脚本也会继续执行剩下的扫描任务啦!
内容的提问来源于stack exchange,提问作者jusk pikanet




