本篇补充上篇的《python制作扫描器》,修改为多线程实现
optparse是Python中的一个命令行参数解析模块,可以方便地处理命令行参数,提供了很多有用的功能,例如:
1、支持长参数和短参数;
2、支持参数的默认值和描述信息;
3、支持参数的互斥和必须出现;
4、支持自定义参数类型和合法值范围等。
5、使用optparse模块可以快速地编写命令行工具,并且用户可以通过-help或--help选项获取帮助信息。
而多线程是Python中常用的一种并发编程方式,能够提高程序的运行效率。通过使用多线程,可以在程序中同时运行多个任务,充分利用CPU资源。
Python中内置的threading模块提供了多线程编程的支持,可以通过创建Thread对象来创建和启动线程,通过使用锁机制来避免多个线程同时访问共享资源导致的数据竞争和错误。
多线程可以用于网络编程、数据处理、并发读写等场景,可以大大提高程序的效率和性能。
以下是端口扫描器用**optparse模块和多线程的结合**
实例
#! /usr/bin/python
# -*-coding: UTF-8 -*-
import socket
from optparse import OptionParser
from threading import Thread
#判断端口是否开放
def is_open(ip,port):
s = socket.socket
try:
s.connect(ip,port)
return True
except:
return False
pass
#默认扫描函数
def scan(ip,port):
if is_open(ip,port):
print("%s的主机 %s 端口 open"%(ip,port))
else:
print("%s的主机 %s 端口 close"%(ip,port))
pass
# #范围扫描函数
# def rscan(ip,s,e):
# for x in range(int(s),int(e)):
# if is_open(ip,x):
# print("%s的主机 %s 端口 open"%(ip,x))
# else:
# print("%s的主机 %s 端口 close" % (ip, x))
# pass
def main():
usage = "python test2.py -i <target> -p <port> 或者 -i <target> -p all 或者-i <target> -p defaultt "#帮助
parser = OptionParser(usage=usage)#添加usage方法,python -h 就会出现上面的帮助
parser.add_option("-p","--port",type="string",dest="port",help="your target port here")
parser.add_option("-i","--ip",type="string",dest="ipaddress",help="your target ip here")
(option,args) = parser.parse_args()
ip = option.ipaddress
port = option.port
defaultport = ['135','139','445','1433','3306','3389','6379','7001']
if ',' in port:#xxxx -i 127.0.0.1 -p 81,82
port = port.split(',')
p1 = []
for x in port:
p1.append(int(x))
port1 = p1
# scan(ip,p1)
for i in port1:
i = int(i)
t1 = Thread(target=scan,args=(ip,i))
t1.start()
elif '-' in port:#xxxx -i 127.0.0.1 -p 81-90
port = port.split('-')
s = port[0]
e = port[1]
# rscan(ip,s,e)
for i in range(int(s),int(e)):
i = int(i)
t2 = Thread(target=scan,args=(ip,i,))
t2.start()
elif 'all' in port:#xxx -i 127.0.0.1 -p all
for i in range(65535):
i = int(i)
t3 = Thread(target=scan,args=(ip,i,))
t3.start()
# rscan(ip,1,65535)
elif 'default' in port:#xxx -i 127.0.0.1 -p default
for i in defaultport:
i = int(i)
t4 = Thread(target=scan,args=(ip,i,))
t4.start()
#scan(ip,defaultport)
pass
if __name__=='__main__':
main()
运行后测试结果为:
python test2.py -h
python test2.py -i 127.0.0.1 -p 81,82
python test2.py -i 127.0.0.1 -p 81-85
python test2.py -i 127.0.0.1 -p all
python test2.py -i 127.0.0.1 -p default