WEB开发网
开发学院软件开发Python 多线程Ping网段 阅读

多线程Ping网段

 2012-05-20 07:46:14 来源:WEB开发网   
核心提示: 通过修改本站一个多线程PING的代码,来实现PING网段 使用方法: fping 192.168.1.1-254import sysimport subprocessfrom threading import Threadfrom Queue import Queueif sys.hexversion < 0x

 通过修改本站一个多线程PING的代码,来实现PING网段
使用方法:
fping 192.168.1.1-254

import sys
import subprocess
from threading import Thread
from Queue import Queue

if sys.hexversion < 0x02040000:
        print >> sys.stderr, 'Your python version is too old (%s)' % \
                                                        (sys.version.split()[0])
        print >> sys.stderr, 'You need at least Python 2.4'
        sys.exit(1)
  
class CreateThread(Thread):
	def __init__(self, func, args, name=""):
		Thread.__init__(self)
		self.__name = name
		self.__func = func
		self.__args = args

	def run(self):
		apply(self.__func, self.__args)

class FPing(object):
	def __init__(self, network, tnum):
	        self.network = network
	        self.tnum = tnum

	def ip_process(self, network):
		start = network.split('-')[0].split('.')[3]
		end = network.split('-')[1]
		ip = network.split('-')[0].split('.')[ : 3]
		ip_3 = '.'.join(ip)
		return (start, end, ip_3)
	
	def check_grama(self, network):
		check = network.find('-')
		if check == -1:
			self.usage()
			sys.exit(1)
			
	def usage(self):
		print '''Usage: python fping.py ip-num
		example:
		python fping 192.168.1.1-255'''
	
	def ping_scan(self, num, iq, oq):
		while True:
			try:
				ip = iq.get()
				print "[*]Thread %s: Pinging %s" % (num, ip)
				ret = subprocess.call("ping -c 1 -w 3 %s" % ip, shell = True,
							stdout = open('/dev/null','w'), stderr = subprocess.STDOUT)
				if ret == 0:
					print "[*]%s: is alive." % ip
					oq.put(ip)
				else:
					print "[*]%s: did not respond" % ip
				iq.task_done()
			except Exception:
				print "Threading Exception !"
				sys.exit(1)

	def active(self):
		worker_num = self.tnum
		in_q = Queue()
		out_q = Queue()

		start, end, ip3 = self.ip_process(self.network)

		for ip1 in xrange(int(start), int(end) + 1):
			ip = ip3 + '.' + str(ip1)
			in_q.put(ip)

		for i in xrange(worker_num):
			worker = CreateThread(self.ping_scan, (i, in_q, out_q), self.ping_scan.__name__)
			worker.setDaemon(True)
			worker.start()
			
		print "[*]Main Thread Waiting."
		in_q.join()
		out_q.join()
		print "[*]Done!"

if __name__ == '__main__':
	thread_worker_num = 10
	fping = FPing(sys.argv[1], thread_worker_num)
	if len(sys.argv) != 2:
		fping.usage()
		sys.exit(1)
	fping.active()

    

Tags:线程 Ping 网段

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接