項目中有監(jiān)控網(wǎng)卡的需求荒揣,但是一般的方法都需要指定某個網(wǎng)卡,然后返回網(wǎng)卡狀態(tài)焊刹,另外如何從所有網(wǎng)卡中過濾出物理網(wǎng)卡也是個問題系任。
Linux2.6 內(nèi)核中引入了 sysfs 文件系統(tǒng)。sysfs 文件系統(tǒng)整理的設(shè)備驅(qū)動的相關(guān)文件節(jié)點虐块,被視為 dev 文件系統(tǒng)的替代者俩滥。同時也擁有類似 proc 文件系統(tǒng)一樣查看系統(tǒng)相關(guān)信息的功能。最主要的作用是 sysfs 把連接在系統(tǒng)上的設(shè)備和總線組織成分級的文件贺奠,使其從用戶空間可以訪問或配置霜旧。
sysfs 被加載在 /sys/
目錄下,如 /sys/class/net
目錄下包含了所有網(wǎng)絡(luò)接口儡率,我們這里就是從該目錄獲取到所有網(wǎng)卡的列表挂据。
但是如何過濾掉虛擬網(wǎng)卡,只獲取到物理網(wǎng)卡的列表呢儿普?
這里我們又用到了 /sys/devices/virtual/net
目錄崎逃,這里又所有的虛擬網(wǎng)卡列表,這樣我們就有辦法獲取到物理網(wǎng)卡列表了眉孩。然后再使用 ethtool
命令獲取網(wǎng)卡狀態(tài)即可个绍。
import commands,sys
# get all virtual nic
return_code, output = commands.getstatusoutput("ls /sys/devices/virtual/net")
vnic_list = output.split('\n')
# get all nic, exclude the 'bonding_masters'
return_code, output = commands.getstatusoutput("ls /sys/class/net|grep -v 'bonding_masters'")
nic_list = output.split('\n')
# get all physical nic
#pnic_list = [p_nic for p_nic in nic_list if p_nic not in vnic_list]
pnic_list = list(set(nic_list) - set(vnic_list))
exit_code = 0
exit_list = []
# use ethtool to detect the pnic link status
for pnic in pnic_list:
return_code, output = commands.getstatusoutput("ethtool " + pnic + " |grep detected")
if "no" in output:
exit_list.append(pnic)
exit_code = 2
if exit_code == 0:
print("OK! all inteface is up.")
else:
print("CRITICAL: interface " + str(exit_list) + " is down")
sys.exit(exit_code)
如果覺得有用勒葱,歡迎關(guān)注我的微信,有問題可以直接交流:
參考: