You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动