如何用Socket扫描IP列表?列表转字符串及代理端口扫描求助
问题与解决方案
一、IP列表读取问题
你当前读取targetlist.txt的代码仅读取第一行,且字符串拼接逻辑错误,无法正确获取所有目标IP。targetlist.txt内容为每行一个IP:
192.168.0.1 55.34.23.53
错误代码分析
fp = open("targetlist.txt", "r") val = fp.readline().split() # readline()仅读取第一行,split()在此场景无意义 print("GETTING BOUNTY: ", "HOSTNAME", val) str1 = val # 直接将列表赋值给字符串变量,后续拼接会报错 for ele in val: str1 += ele # 列表与字符串拼接触发类型错误 hack = val # hack为列表,但后续socket操作需要单个IP字符串
正确读取方式
通过列表推导式读取所有非空IP行:
# 读取targetlist.txt所有IP,自动去除空行和换行符 with open("targetlist.txt", "r") as fp: target_ips = [line.strip() for line in fp if line.strip()]
二、代理配置与端口扫描问题
当前代码存在两个核心问题:
- 代理格式错误:
proxies字典的http值为列表元组,不符合requests的参数要求; - socket原生不支持HTTP代理:你用requests测试代理,但socket的
connect_ex是直接发起TCP连接,不会走HTTP代理。要让socket通过代理扫描,需使用SOCKS代理或HTTP隧道工具。
错误代理配置分析
with open('proxyf.txt', 'r') as f: proxy = f.read().splitlines() proxies = { 'http': (proxy,) # 格式错误,应为单个代理字符串,如"http://ip:port" }
修正方案(使用SOCKS代理+socket)
如果你的代理是SOCKS类型,先安装pysocks库:
pip install pysocks
以下是整合IP列表读取、代理配置的完整修正代码:
完整修正代码
import socket import sys import socks from datetime import datetime from colorama import init, Fore, Style import subprocess init(autoreset=True) subprocess.call('clear', shell=True) print(Style.BRIGHT + Fore.YELLOW + "START AT:", datetime.now()) print("=============COREXITAL PORT SCANNER=============") print("") # 读取目标IP列表 with open("targetlist.txt", "r") as fp: target_ips = [line.strip() for line in fp if line.strip()] # 读取代理列表 with open('proxyf.txt', 'r') as f: proxies = [line.strip() for line in f if line.strip()] def scan_with_proxy(target_ip, proxy_addr): """使用指定代理扫描单个IP的端口""" try: # 解析代理IP和端口 proxy_host, proxy_port = proxy_addr.split(':') proxy_port = int(proxy_port) # 配置SOCKS代理,将socket流量转发到代理 socks.set_default_proxy(socks.SOCKS5, proxy_host, proxy_port) socket.socket = socks.socksocket print(f"Scanning IP {target_ip} via proxy {proxy_addr}") t1 = datetime.now() print(f"Start time: {t1}") print("LOADING...\n") for port in range(1, 100): hacking = socket.socket(socket.AF_INET, socket.SOCK_STREAM) hacking.settimeout(5) # 缩短超时时间,提升扫描效率 result = hacking.connect_ex((target_ip, port)) if result == 0: print(f"PORT: {port} {Style.BRIGHT + Fore.GREEN}OPEN") else: print(f"PORT: {port} {Style.BRIGHT + Fore.RED}CLOSED") hacking.close() print(f"Current time: {datetime.now()}\n") print(f"Scan completed for {target_ip}\n") except KeyboardInterrupt: print("Canceled") sys.exit() except socket.gaierror: print(f"Hostname {target_ip} could not be resolved.") except socket.error as e: print(f"Socket error: {e}") except ValueError: print(f"Invalid proxy format: {proxy_addr}, should be ip:port") # 遍历所有目标IP,使用第一个代理扫描(可修改为轮询/随机代理) for ip in target_ips: if proxies: scan_with_proxy(ip, proxies[0]) else: print("No proxies found in proxyf.txt") sys.exit() print("") print(Style.BRIGHT + Fore.YELLOW + "END OF REPORT") print("2023 - Corexital")
关键修改说明
- IP列表读取:通过列表推导式获取所有有效IP,避免空行和格式问题;
- 代理配置:使用
pysocks将socket流量转发到SOCKS代理,适配代理扫描需求; - 扫描逻辑:封装扫描函数,支持遍历多个目标IP,优化超时时间提升效率;
- 错误处理:新增代理格式错误捕获,完善异常提示信息。
注意事项
- 若代理为HTTP类型,需使用
requests的CONNECT隧道或httptunnel库实现转发,socket原生不支持HTTP代理; - 批量扫描建议添加代理轮换逻辑,避免单个代理被封禁;
- 未经授权扫描他人IP可能违反法律法规,请仅在合法授权范围内使用。
内容的提问来源于stack exchange,提问作者Don Schulz
相关产品推荐
相关产品推荐

