Python實現(xiàn)批量檢測ip地址連通性
實現(xiàn)代碼
#########################################################################
# File Name: check_ip_test.py
# Author: eight
# Mail: 18847097110@163.com
# Created Time: Thu 11 Apr 2024 08:52:45 AM CST
#########################################################################
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import ipaddress
import subprocess
import re
import json
# 處理單個IP 的ping請求
def ping_ip(ip):
try:
output = subprocess.check_output(['ping', '-c', '1', ip], stderr=subprocess.STDOUT, universal_newlines=True, timeout=2)
return output
except (subprocess.CalledProcessError, subprocess.TimeoutExpired):
return False
# 處理網(wǎng)段的請求
def scan_network(ip_network):
result_list = []
for ip in ipaddress.IPv4Network(ip_network, strict=False):
ip_str = str(ip)
result = ping_ip(ip_str)
print(f"Begin Ping {ip_str}...")
time_value = ping_test_match(ip_str)
if result:
#print(f"{ip_str} Network communication is normal.")
if time_value:
result_list.append({'ip': ip_str, 'connection': True, 'time': f"{time_value} ms"})
else:
result_list.append({'ip': ip_str, 'connection': True, 'time': '0ms'})
else:
#print(f"{ip_str} Network communication is not normal.")
result_list.append({'ip': ip_str, 'connection': False})
return result_list
# 測試的請求及正則匹配time時間
def ping_test_match(ip):
try:
ipaddress.IPv4Address(ip)
#print("The entered address is valid. The connectivity check starts")
ping_output = ping_ip(ip)
if ping_output:
#return "yes"
time_match = re.search(r"time=([\d.]+) ms", ping_output)
if time_match:
time_value = float(time_match.group(1))
return time_value
else:
return None
else:
return None
except ipaddress.AddressValueError:
#print("The entered address is invalid")
return None
# 如果是單個IP,執(zhí)行第一條,因為利用此方法檢測ip是否是合法的,輸入網(wǎng)段則視為不合法,所以輸入網(wǎng)段會用except
if __name__ == "__main__":
ip = sys.argv[1]
try:
ipaddress.IPv4Address(ip)
print(ping_test_match(ip))
except ipaddress.AddressValueError:
result_list = scan_network(ip)
#print(json.dumps(result_list))
for item in result_list:
if "time" not in item:
item["time"] = "0ms"
print(json.dumps(result_list)) 代碼詳解
模塊解釋:
- sys: 模塊,用于訪問命令行參數(shù)等系統(tǒng)功能。
- ipaddress: 模塊,用于處理 IP 地址和網(wǎng)絡(luò)。
- subprocess: 模塊,用于執(zhí)行外部命令。
- re:模塊,用于正則表達式匹配。
- json: 模塊,用于 JSON 數(shù)據(jù)展示
代碼解釋:
ping_ip函數(shù)
1.接收一個 IP 地址作為參數(shù),執(zhí)行 ping 測試,使用 subprocess.check_output 函數(shù)來運行 ping 命令,然后返回命令的輸出。
2.如果 ping 命令執(zhí)行失敗(例如,由于超時或返回非零退出代碼),則會捕獲 subprocess.CalledProcessError 或 subprocess.TimeoutExpired 異常,并返回 False
scan_network函數(shù)
1.scan_network 函數(shù)接收一個 IP 網(wǎng)段作為參數(shù),然后遍歷該網(wǎng)段中的所有 IP 地址。
2.對于每個 IP 地址,調(diào)用 ping_ip 函數(shù)執(zhí)行 ping 測試,調(diào)用ping_test_match函數(shù)獲取time時間。
3.將結(jié)果存儲在 result 中。
4.最后,根據(jù) ping 測試的結(jié)果和 ping 時間,它向 result_list 中添加一個字典,該字典包含 IP 地址、連接狀態(tài)和 ping 時間
ping_test_match函數(shù)
1.調(diào)用 ping_ip 函數(shù)的結(jié)果
2.利用正則匹配 time字段
if __name__ == "__main__":
1.獲取傳參
2.如果是單個 IPv4 地址,則執(zhí)行單個 IP 地址的 ping 測試,并打印結(jié)果。
3.如果無法轉(zhuǎn)換為 IPv4 地址,則將輸入視為 IP 網(wǎng)段,并執(zhí)行ping測試,將結(jié)果以 JSON 格式打印
效果
執(zhí)行命令必須傳參,否則會報錯

執(zhí)行某個網(wǎng)段的測試

到此這篇關(guān)于Python實現(xiàn)批量檢測ip地址連通性的文章就介紹到這了,更多相關(guān)Python檢測ip連通性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?Socket無限發(fā)送接收數(shù)據(jù)方式
這篇文章主要介紹了python?Socket無限發(fā)送接收數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
一文帶你掌握Pyecharts地理數(shù)據(jù)可視化的方法
這篇文章主要介紹了一文帶你掌握Pyecharts地理數(shù)據(jù)可視化的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
Python結(jié)合turtle簡單開發(fā)一個煙花小工具
這篇文章主要為大家詳細介紹了Python如何利用turtle模塊實現(xiàn)的簡單的煙花效果展示小工具,文章的示例代碼講解詳細,感興趣的小伙伴可以了解下2025-12-12
用python + openpyxl處理excel2007文檔思路以及心得
最近要幫做RA的老姐寫個合并excel工作表的腳本……源數(shù)據(jù)是4000+個excel 工作表,分布在9個xlsm文件里,文件內(nèi)容是中英文混雜的一些數(shù)據(jù),需要從每張表中提取需要的部分,分門別類合并到多個大的表里。2014-07-07

