Python IP可达性检测脚本解析
目录
-
脚本概述
-
代码解析
-
导入模块
-
核心函数check_ip
-
主程序逻辑
-
-
使用说明
-
脚本优化建议
-
完整代码
脚本概述
这是一个使用Python编写的IP地址可达性检测脚本,主要功能是批量检测192.168.124.1到192.168.125.254范围内所有IP地址的可达性,并将可达的IP地址保存到文件中。脚本采用了多线程技术,可以同时检测多个IP地址,大大提高了检测效率。
代码解析
导入模块
import pythonping
import os
from concurrent.futures import ThreadPoolExecutor, as_completed
-
pythonping: 用于发送ICMP ping请求的Python库
-
os: 提供操作系统相关功能,这里用于文件操作
-
ThreadPoolExecutor: 实现线程池功能
-
as_completed: 用于获取已完成的任务
核心函数check_ip
def check_ip(ip):try:response = pythonping.ping(ip, count=2, timeout=1, verbose=False)return ip if response.success(option=1) else Noneexcept:return None
函数功能解析:
-
使用pythonping向指定IP发送2个ping包,超时时间为1秒
-
如果ping成功,返回IP地址
-
如果ping失败或发生异常,返回None
-
verbose=False参数关闭了ping的详细输出
主程序逻辑
if os.path.exists('reachable_ip.txt'):os.remove('reachable_ip.txt')ip_list = [f'192.168.{ip3}.{ip4}' for ip3 in range(124,126) for ip4 in range(1,255)]
with ThreadPoolExecutor(max_workers=50) as executor, \open('reachable_ip.txt', 'a') as ip_file:futures = {executor.submit(check_ip, ip): ip for ip in ip_list}for future in as_completed(futures):ip = futures[future]result = future.result()if result:print(f'{ip} is reachable')ip_file.write(f'{ip}\n')else:print(f'{ip} is not reachable')
执行流程:
-
如果存在reachable_ip.txt文件则删除
-
生成IP地址列表:192.168.124.1到192.168.125.254
-
创建最大50个线程的线程池
-
为每个IP提交一个检测任务到线程池
-
使用as_completed获取已完成的任务
-
将可达的IP地址写入reachable_ip.txt文件
-
打印每个IP的检测结果
使用说明
-
安装依赖库:
pip install pythonping
-
运行脚本:
python ip_checker.py
-
查看结果:
-
控制台会输出每个IP的检测结果
-
可达的IP会保存在reachable_ip.txt文件中
-
完整代码
import pythonping
import os
from concurrent.futures import ThreadPoolExecutor, as_completed
def check_ip(ip):try:response = pythonping.ping(ip, count=2, timeout=1, verbose=False)return ip if response.success(option=1) else Noneexcept:return None
if os.path.exists('reachable_ip.txt'):os.remove('reachable_ip.txt')ip_list = [f'192.168.{ip3}.{ip4}' for ip3 in range(124,126) for ip4 in range(1,255)]
with ThreadPoolExecutor(max_workers=50) as executor, \open('reachable_ip.txt', 'a') as ip_file:futures = {executor.submit(check_ip, ip): ip for ip in ip_list}for future in as_completed(futures):ip = futures[future]result = future.result()if result:print(f'{ip} is reachable')ip_file.write(f'{ip}\n')else:print(f'{ip} is not reachable')