Python端口扫描器仅检测到80端口开放的问题排查求助
Hey,我看了你的端口扫描器代码,找到了几个导致你只能扫到80端口的关键问题,咱们一步步来解决:
问题排查与修复方案
1. 扫描的端口范围太窄
你的代码里只扫了1到99的端口:
for port in range(1, 100):
像testphp.vulnweb.com这类测试站点,常见的开放端口比如443(HTTPS)、8080等都不在这个范围内。你可以扩大扫描范围,或者直接指定一批常见端口来提升效率:
# 方案一:扫描前1000个端口 for port in range(1, 1001): # 方案二:只扫常见端口(更高效) common_ports = [21, 22, 23, 80, 443, 8080, 3306, 3389] for port in common_ports:
2. 超时时间设置得太短
你给套接字设置的超时是0.5秒:
sock.settimeout(0.5)
很多服务器对陌生连接的响应速度会慢于这个时间,尤其是非Web端口,超时后会被你的except: pass直接跳过,导致明明开放的端口被误判为关闭。建议把超时调整到1.5-2秒,平衡扫描速度和准确性:
sock.settimeout(1.5)
3. 异常处理太宽泛,掩盖了关键问题
你用了except: pass来捕获所有异常,这会把超时、连接被拒绝之外的错误全部掩盖,甚至可能隐藏代码本身的bug。建议明确捕获具体异常类型,这样既能跳过真正关闭的端口,又能在出现其他问题时及时发现:
def scan_port(ipaddress, port): try: sock = socket.socket() sock.settimeout(1.5) sock.connect((ipaddress, port)) try: banner = get_banner(sock) # 把字节流解码成字符串,去掉多余换行符 print(f'[+] Open port {port} : {banner.decode().strip()}') except: print(f'[+] Open Port {port}') sock.close() # 别忘了关闭套接字,避免资源泄漏 except ConnectionRefusedError: pass # 端口确实关闭,无需处理 except socket.timeout: pass # 连接超时,可能是端口过滤或响应慢 except Exception as e: # 其他异常打印出来,方便排查问题 print(f'[-] Error on port {port}: {str(e)}')
4. 额外优化:处理字节流编码
get_banner返回的是字节数据,直接打印会出现乱码,上面的代码里加了banner.decode().strip(),把它转成可读的字符串,体验会更好。
测试验证
修改完这些后,再去扫描testphp.vulnweb.com,应该能检测到443等其他开放端口了。
内容的提问来源于stack exchange,提问作者footos
相关产品推荐
相关产品推荐

