一、原理: 主要涉及的系統命令:ping -n 1 -w 1 IP地址 -n 為ping的次數,在linux下為-c;-w為等待超時時間; 利用Python多線程縮短時間,提升運行效率。 二、其它說明 DEV_NULL = open(os.devnull, 'w') 是在Python中實現的黑洞,類 ...
一、原理:
主要涉及的系統命令:ping -n 1 -w 1 IP地址
-n 為ping的次數,在linux下為-c;-w為等待超時時間;
利用Python多線程縮短時間,提升運行效率。
二、其它說明
DEV_NULL = open(os.devnull, 'w') 是在Python中實現的黑洞,類似linux的/dev/null, 將subprocess.call的標準輸出和標準錯誤重定向到黑洞,只接受返回狀態碼,不在終端顯示執行結果。
三、運行環境
Python版本:≥ 3.10
可操作平臺:Linux、Windows(mac沒有試過)
使用方法:命令行下執行 python netping.py 192.168.1 (只接受掩碼24的網段)
netping.py代碼如下:
import os
import sys
import platform
import threading
import subprocess
PLANT = platform.system()
DEV_NULL = open(os.devnull, 'w')
PING_RESULT = []
match PLANT:
case 'Windows':
PING_ARGS = ['ping', '-n', '1', '-w', '1']
case _:
PING_ARGS = ['ping', '-c', '1', '-w', '1']
def single_ping(subnet, host):
ip_addr = f'{subnet}{host}'
status_code = subprocess.call(
args=PING_ARGS + [ip_addr],
stdout=DEV_NULL,
stderr=DEV_NULL
)
if status_code == 0:
PING_RESULT.append(host)
def group_ping(sub):
ping_threads = []
for i in range(1, 255):
t = threading.Thread(target=single_ping, args=[sub, i])
t.start()
ping_threads.append(t)
for pt in ping_threads:
pt.join()
def show_result(sub):
new_result = sorted(PING_RESULT)
for i in new_result:
print(f'{sub}{i}')
print(f'\nPing: {len(new_result)} Pong.')
def main(sub):
group_ping(sub)
show_result(sub)
DEV_NULL.close()
if __name__ == '__main__':
subnet = sys.argv[1]
if subnet[-1] == '.':
main(subnet)
else:
main(f'{subnet}.')
如果您有改善或指正意見,歡迎交流,可在評論區回覆,或者發送郵件至<[email protected]>!!