程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> python實現 多線程ping掃描網段中的在線主機

python實現 多線程ping掃描網段中的在線主機

編輯:Python

近日因為施工單位進度太慢,導致工期超出預估。領導對此比較重視,讓我有空就要看一下完成的進度並匯報。我首先想到的是使用ping命令,但是手工ping了幾個,然後就干不下去了(太累了)。這個必須要自動化進行,而我選擇使用python來實現。

我寫了一個腳本:使用while循環,依次ping網絡中的每個節點,並將結果保存到文件中(代碼如下)。但是此方法耗時太久!

a=1 #定義a=1

while a<255: #當a<255時 循環執行

b='192.168.1.'+str(a) #b代表ip地址

ret = os.system('ping '+b+' -n 1 ') #每個ip只ping一次

if ret:

os.system('echo '+b+'>>d:\\res2.txt') #如果執行結果不為0, 將ip 放入文件res2.txt

else:

os.system('echo '+b+'>>d:\\res.txt') #否則放入res.txt

a=a+1


為了節約我雖然不能稱之為寶貴的時間,我將此段代碼進行了改造:
1、采用多線程,先是用了3個線程,最後使用了5個線程
2、不在將結果寫入文件,只在標准輸出上顯示
3、使用linux系統

#!/usr/bin/env python

#coding:utf-8

import os

import time

import threading #引入

class pings(threading.Thread): #定義線程主體部分

def __init__(self,num,interval):

threading.Thread.__init__(self)

self.nums=num #起始數

self.inter=interval #步長

self.thread_stop=False #線程是否停止

self.ns=0 #單線程計數

 

def run(self):

start=self.nums

while start<254 and not self.thread_stop:

ret=os.system('ping -c 1 -W 1 192.168.1.%d >/dev/null' % start)

if not ret:

print 'ping 192.168.1.%d ok' % start

self.ns +=1

start+=self.inter

print '線程%d結束, ' % self.nums ,

print '此線程共獲得 %d 個在線數據' % self.ns

def stop(self):

self.thread_stop=True

def pingt():

thread1=pings(1,5)

thread2=pings(2,5)

thread3=pings(3,5)

thread4=pings(4,5)

thread5=pings(5,5)

thread1.start()

thread2.start()

thread3.start()

thread4.start()

thread5.start()

time.sleep(55)

thread1.stop()

thread2.stop()

thread3.stop()

thread4.stop()

thread5.stop()

if __name__=='__main__':

pingt()
如下是我對公網上的地址段202.102.201.0/24 進行ping測試的結果,總共得到了29個在線的ip地址。
執行結果.jpg

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved