Python快速端口扫描器异常处理失效、结果写文件问题求助
问题根因与修复方案
核心问题定位
- 错误处理逻辑不触发
- 主机地址解析代码
socket.gethostbyname(remoteServer)写在所有异常捕获逻辑外层,输入无效地址时这行直接抛出原生socket.gaierror,完全不会进入后续scan函数内的错误处理分支。 - 原有异常处理写在子线程执行的scan函数中,子线程内抛出的异常、调用的
sys.exit()仅会终止当前子线程,无法终止主线程运行,达不到报错即退出的效果。 - scan函数内冗余重复执行域名解析,且错误引用全局变量
remoteServer,和传入的函数参数逻辑冲突。 - 端口扫描范围存在逻辑偏差:遍历
range(1,1025)时提交任务传入port+1,实际扫描范围为2~1026端口,漏掉1端口、多扫1026端口。
- 主机地址解析代码
- 扫描结果无法写入文件
- 代码未定义容器收集扫描到的开放端口,末尾写文件时仅写入for循环结束后残留的
port变量固定值1024,和实际扫描结果无关。 - 写入逻辑未关联扫描过程输出,仅写入单个无意义数字,不符合保存扫描报告的预期。
- 代码未定义容器收集扫描到的开放端口,末尾写文件时仅写入for循环结束后残留的
修复后完整代码
#!/usr/bin/env python import socket import concurrent.futures import subprocess import sys from datetime import datetime # 清屏 subprocess.call('clear', shell=True) # 输入主机地址并提前做解析校验,外层直接捕获解析错误 remoteServer = input("Enter a remote host to scan: ") try: remoteServerIP = socket.gethostbyname(remoteServer) except socket.gaierror: print('Hostname could not be resolved. Exiting') sys.exit() except socket.error: print("Host is not available") sys.exit() # 打印扫描横幅 print("-" * 60) print("Please wait, scanning remote host", remoteServerIP) print("-" * 60) # 记录扫描开始时间 t1 = datetime.now() open_ports = [] def scan(port): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(1) try: result = sock.connect_ex((remoteServerIP, port)) if result == 0: print(f"Port {port}: Open") sock.close() return port except KeyboardInterrupt: print("You pressed Ctrl+C") sys.exit() except socket.error: pass return None # 修正端口扫描范围,移除多余的port+1,同时收集开放端口结果 with concurrent.futures.ThreadPoolExecutor(max_workers=75) as executor: futures = [executor.submit(scan, port) for port in range(1, 1025)] for future in concurrent.futures.as_completed(futures): res = future.result() if res is not None: open_ports.append(res) # 记录扫描结束时间,计算耗时 t2 = datetime.now() total = t2 - t1 print('Scanning Completed in: ', total) # 写入完整扫描报告到文件 with open('Hostreport.txt', 'a', encoding='utf-8') as f: f.write(f"===== Scan Report for {remoteServerIP} =====\n") f.write(f"Scan start time: {t1}\n") for port in sorted(open_ports): f.write(f"Port {port}: Open\n") f.write(f"Total scan time: {total}\n") f.write("="*50 + "\n\n")
修复点说明
- 将主机地址解析逻辑移到主线程最前端,直接包裹在异常捕获块中,输入无效地址时会第一时间触发错误提示并退出,不会抛出原生报错
- 移除scan函数内冗余的域名解析逻辑,子线程仅负责端口探测,避免子线程异常无法传递到主线程的问题
- 新增
open_ports列表统一收集所有探测到的开放端口 - 修正端口遍历逻辑,扫描范围准确覆盖1~1024知名端口段
- 重写文件写入逻辑,将扫描目标、时间、开放端口列表、总耗时完整写入Hostreport.txt,符合报告输出预期
- 优化文件操作写法,使用
with上下文管理器自动处理文件关闭,避免文件句柄泄漏
内容的提问来源于stack exchange,提问作者Uday
相关产品推荐
相关产品推荐

