import ping3
import ipaddress
from concurrent.futures import ThreadPoolExecutor
from datetime import datetime
def ping_ip(ip):
try:
if ping3.ping(str(ip), timeout=1):
return ip
except Exception as e:
print(f"Error pinging {ip}: {e}")
def main():
try:
now = datetime.now().strftime("%Y%m%d_%H%M%S")
success_filename = f"ping_successes_{now}.txt"
fail_filename = f"ping_fails_{now}.txt"
with open("ip_ranges.txt", "r") as ip_ranges_file:
ip_ranges = [line.strip() for line in ip_ranges_file if line.strip()]
success_ips = []
with ThreadPoolExecutor(max_workers=10) as executor:
futures = []
for ip_range in ip_ranges:
if "/" in ip_range: # 检查是否是CIDR表示法
# 如果是CIDR表示法,则直接处理IPv4Network
for ip in ipaddress.IPv4Network(ip_range):
futures.append(executor.submit(ping_ip, ip))
else:
# 否则,处理单个IPv4地址
futures.append(executor.submit(ping_ip, ipaddress.IPv4Address(ip_range)))
for future in futures:
result = future.result()
if result is not None:
success_ips.append(result)
# 将成功的 IP 地址写入文件
with open(success_filename, "w") as success_file:
for ip in success_ips:
success_file.write(str(ip) + "\n")
print(f"Ping scan complete. Successful pings written to {success_filename}, fails written to {fail_filename}")
except FileNotFoundError:
print("Error: ip_ranges.txt file not found.")
except Exception as e:
print(f"An error occurred: {e}")
if __name__ == "__main__":
main()