近日因为施工单位进度太慢,导致工期超出预估。领导对此比较重视,让我有空就要看一下完成的进度并汇报。我首先想到的是使用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地址。