Python批量pingIP地址
ping一批IP地址,读取第一条响应报文,网络可达则显示up,否则显示down。
import subprocess
import platform
import sys
def ping(ip, param):
# ping 1次
command = ['ping', param, '1', ip]
# 执行命令,成功则返回True,否则返回False
result = subprocess.run(command, capture_output=True, text=True)
# 执行结果中包含ttl则表示ping通
return 'ttl' in result.stdout.lower() + result.stderr.lower()
def start():
# 检查输入的参数个数是否=2(本身程序名加上IP列表),否则提示错误,并退出程序
if len(sys.argv) != 2:
print('Usage: python check_ping.py <ip_path>')
sys.exit(1)
# 第一个参数,IP地址列表文件
ip_path = sys.argv[1]
# 打开ip地址列表,如果文件不存在则抛出异常,并退出程序
try:
with open(ip_path, 'r') as ip_list:
# 读取所有行,放到列表里
ips = ip_list.readlines()
except FileNotFoundError:
print('Error: The file ' + ip_path + ' was not found.')
sys.exit(2)
# 根据操作系统类型选择命令参数
param = '-n' if platform.system().lower() == 'windows' else '-c'
# 统计计数
count = 0
up = 0
down = 0
for ip in ips:
# ip不为空
if ip:
count += 1
# 去掉末尾换行符或空格
ip = ip.strip()
# 调用ping
result = ping(ip, param)
# 根据返回值输出结果并计数
if result:
up += 1
print(f'{ip} is up')
else:
down += 1
print(f'{ip} is down')
# 输出统计值
print(f'\ncount = {count}, up = {up}, down = {down}\n')
if __name__ == '__main__':
start()
P.S.运行的时候输入IP地址列表文件路径作为参数。
Best regards, yunxi p deng 2024.10.07