Python socket端口扫描报socket_family未定义错误解决方案
报错产生原因
报错核心原因是你把教程里的语法占位示例当成了可执行代码运行:
- 第3行的
socket_family、socket_type是socket.socket()构造函数的参数说明占位符,不是Python内置变量,也没有在你的代码里定义,直接调用必然触发NameError - 你把零散的API学习笔记片段和实际功能代码拼在了同一个脚本文件中,笔记里的无前缀调用
gethostbyname("host")同样是示例代码,直接运行也会报错 - 原代码还存在其他兼容性问题:使用了Python2专属的
raw_input()、仅支持Linux的clear清屏命令、未设置socket连接超时导致扫描速度极慢,也没有实现要求的结果文件写入、异常持久化、耗时统计落盘的功能。
修复方案
- 删除脚本开头所有零散的API示例笔记代码,仅保留需要的导入语句
- 做跨平台兼容处理:替换
raw_input()为Python3通用的input(),根据操作系统自动选择清屏命令 - 给socket连接设置合理超时(建议0.3~0.5秒),大幅提升扫描效率
- 新增结果文件写入逻辑:文件头部写入扫描开始时间,扫描过程中识别到的开放端口、触发的各类异常实时写入文件,扫描结束后在文件尾部写入结束时间和总耗时
- 调整异常捕获逻辑,触发异常时先将错误信息写入结果文件再退出,避免异常信息丢失。
符合全部功能要求的完整代码
import socket import sys import os import platform from datetime import datetime # 跨平台清屏 if platform.system() == "Windows": os.system("cls") else: os.system("clear") RESULT_FILE = "port_scan_result.txt" # 按要求提示用户输入目标主机 remote_host = input("Enter a host to scan: ") # 初始化时间与结果变量 scan_start = datetime.now() scan_end = None total_cost = None error_msg = [] try: # 解析主机名 remote_ip = socket.gethostbyname(remote_host) print("-" * 60) print(f"开始扫描主机: {remote_host} ({remote_ip}),端口范围1-1025") print("-" * 60) # 写入扫描开始信息到结果文件 with open(RESULT_FILE, "w", encoding="utf-8") as f: f.write(f"=== 端口扫描开始时间: {scan_start.strftime('%Y-%m-%d %H:%M:%S')} ===\n") f.write(f"扫描目标: {remote_host} ({remote_ip})\n") f.write(f"扫描端口范围: 1-1025\n\n") # 遍历扫描端口 for port in range(1, 1025): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(0.5) # 设置超时避免长时间卡顿 connect_res = sock.connect_ex((remote_ip, port)) if connect_res == 0: print(f"端口 {port}: 开放") # 实时写入开放端口到文件 with open(RESULT_FILE, "a", encoding="utf-8") as f: f.write(f"开放端口: {port}\n") sock.close() except KeyboardInterrupt: error_msg.append("用户手动中断扫描(Ctrl+C)") except socket.gaierror: error_msg.append("主机名解析失败,请检查输入的主机地址是否正确") except socket.error: error_msg.append("主机不可达或网络连接异常") except Exception as e: error_msg.append(f"未知异常: {str(e)}") finally: scan_end = datetime.now() total_cost = scan_end - scan_start # 写入结束信息到结果文件 with open(RESULT_FILE, "a", encoding="utf-8") as f: f.write("\n") if error_msg: for err in error_msg: f.write(f"扫描异常: {err}\n") f.write(f"\n=== 端口扫描结束时间: {scan_end.strftime('%Y-%m-%d %H:%M:%S')} ===\n") f.write(f"扫描总耗时: {total_cost}\n") # 控制台输出最终结果 print("-" * 60) if error_msg: for err in error_msg: print(f"扫描异常: {err}") print(f"扫描完成,总耗时: {total_cost}") print(f"扫描结果已写入文件: {os.path.abspath(RESULT_FILE)}")
代码说明
- 运行后会严格按照要求提示
Enter a host to scan,接收用户输入的主机名 - 自动遍历1~1025所有TCP端口,设置0.5秒超时平衡扫描速度和准确率
- 所有开放端口会实时写入结果文件,触发的主机不可达、解析失败、手动中断等异常都会写入同一个结果文件
- 结果文件头部记录扫描开始时间、目标信息,尾部记录结束时间和总耗时,控制台也会同步打印总耗时
- 兼容Windows、Linux、macOS多系统运行,适配Python3环境。
注意:端口扫描行为可能触发目标主机的安全告警,请仅在获得授权的前提下对目标主机进行扫描。
内容的提问来源于stack exchange,提问作者Uday
相关产品推荐
相关产品推荐

