本帖最后由 baileybaaifine 于 2023-5-19 18:06 编辑
网段扫描工具(ping网段中可以ping到的ip地址) py简单生成的工具
上面的代码实现了一个简单的IP地址段扫描工具。它的功能如下:- 用户通过输入一个IP地址段(例如:192.168.0.1/24),程序会将其转换为IP对象。
- 创建一个空的可达IP地址列表。
- 定义了一个ping函数,用于向指定的IP地址发送ping命令,并将结果添加到可达列表中。
- 使用并发编程的ThreadPoolExecutor创建一个进程池,最多同时执行50个ping进程。
- 遍历IP地址段中的所有IP地址,并将每个IP地址提交到进程池中执行ping函数。
- 等待所有ping任务完成。
- 停止计时,记录程序运行时间。
- 将可达IP地址列表按照IP地址的排序进行排序。
- 输出可达IP地址列表的表格形式,包括IP地址、延迟(ms)和TTL信息。
- 输出可达IP地址的数量以及程序的总运行时间。
- 提示用户是否继续查询,如果用户输入不是'y',则退出循环,结束程序。
- 如果用户输入的IP地址段不符合要求,会捕获ValueError异常并进行提示。
总体而言,这段代码用于扫描指定IP地址段中的所有IP地址,通过执行ping命令检测可达性,并输出可达IP地址的相关信息。下载地址看附件
上代码
import subprocess
import ipaddress
import time
import concurrent.futures
while True:
获取用户输入的IP地址段
ip_network_str = input("请输入要扫描的IP地址段(例如:192.168.0.1/24):").strip()
try:
# 将IP地址段转换为IP对象
ip_network = ipaddress.ip_network(ip_network_str)
# 创建一个列表来存储可达的IP地址及延迟和TTL信息
reachable_hosts = []
# 定义ping函数,用于ping指定的IP地址,并将结果添加到可达列表中
def ping(ip):
# 调用ping命令,并将结果输出到空设备上
ping_result = subprocess.Popen(['ping', '-n', '1', '-w', '500', ip],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 从输出中提取延迟和TTL信息
output = ping_result.stdout.read().decode('gbk')
delay = 'N/A'
ttl = 'N/A'
for line in output.split('\n'):
if 'TTL' in line:
ttl = line.split('TTL=')[1].split()[0]
if '用时' in line:
delay = line.split('用时')[1].split()[0]
# 如果ping成功,将IP地址及延迟和TTL信息添加到可达列表中
if 'TTL' in output:
reachable_hosts.append((ip, delay, ttl))
# 开始计时
start_time = time.time()
# 创建一个进程池,最多同时执行50个ping进程
with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor:
# 遍历IP地址段中的所有IP地址,并提交ping函数到进程池中执行
futures = [executor.submit(ping, str(ip)) for ip in ip_network]
# 等待所有ping任务完成
concurrent.futures.wait(futures)
# 停止计时
end_time = time.time()
# 按表格形式输出可达IP地址列表及延迟和TTL信息
reachable_hosts = sorted(reachable_hosts, key=lambda x: list(map(int, x[0].split('.'))))
print("可达的IP地址:")
print("{:<15}{:<15}{:<10}{}".format("IP地址", "延迟(ms)", "TTL", "状态"))
for host in reachable_hosts:
print("{:<15}{:<15}{:<10}{}".format(host[0], host[1], host[2], "可达"))
# 输出可达IP地址数量和程序运行时间
num_reachable_hosts = len(reachable_hosts)
elapsed_time = end_time - start_time
if elapsed_time < 60:
print("共发现 {} 个可达的IP地址,程序总共运行时间:{:.2f}秒".format(num_reachable_hosts, elapsed_time))
else:
print("共发现 {} 个可达的IP地址,程序总共运行时间:{:.2f}分钟".format(num_reachable_hosts, elapsed_time/60))
# 判断是否继续查询
user_input = input("是否继续查询(Y/N)?")
if user_input.lower() != 'y':
break
except ValueError:
print("输入的不是正确的IP地址段,请重新输入!")
|