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

Python快速端口扫描器异常处理失效、结果写文件问题求助

问题根因与修复方案

核心问题定位

  • 错误处理逻辑不触发
    1. 主机地址解析代码socket.gethostbyname(remoteServer)写在所有异常捕获逻辑外层,输入无效地址时这行直接抛出原生socket.gaierror,完全不会进入后续scan函数内的错误处理分支。
    2. 原有异常处理写在子线程执行的scan函数中,子线程内抛出的异常、调用的sys.exit()仅会终止当前子线程,无法终止主线程运行,达不到报错即退出的效果。
    3. scan函数内冗余重复执行域名解析,且错误引用全局变量remoteServer,和传入的函数参数逻辑冲突。
    4. 端口扫描范围存在逻辑偏差:遍历range(1,1025)时提交任务传入port+1,实际扫描范围为2~1026端口,漏掉1端口、多扫1026端口。
  • 扫描结果无法写入文件
    1. 代码未定义容器收集扫描到的开放端口,末尾写文件时仅写入for循环结束后残留的port变量固定值1024,和实际扫描结果无关。
    2. 写入逻辑未关联扫描过程输出,仅写入单个无意义数字,不符合保存扫描报告的预期。

修复后完整代码

#!/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 08:57:19