portscaner 多线程、多协程并发端口扫描
生活随笔
收集整理的這篇文章主要介紹了
portscaner 多线程、多协程并发端口扫描
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
import socket,time,re,sys,os,threading import gevent from gevent import monkey monkey.patch_all()socket.setdefaulttimeout(2)#該方法用來處理用戶數(shù)據(jù)的port范圍,并計算范圍內(nèi)的port,將其添加到列表中,將列表返回 def handle_port(input_ports):try:pattern = re.compile('(^\d{1,5})-(\d{1,5}$)')match = pattern.match(input_ports)if match:start_port = int(match.group(1))end_port = int(match.group(2))if end_port <=65535 :if start_port < end_port:list =[]for i in range(start_port, end_port+1):list.append(i)return listelse:print("端口范圍輸入有誤")exit(0)else:print("端口格式輸入格式有誤。")exit(0)except Exception as err:print(err)exit(0)#該方法用來處理用戶數(shù)據(jù)的IP地址范圍,并計算范圍內(nèi)的IP地址,將其添加到列表中,將列表返回 def handle_ip(input_addrs):try:pattern = re.compile('(\d{1,3}\.\d{1,3}\.\d{1,3}\.)(\d{1,3})-(\d{1,3})') # 匹配標準點進制的IPmatch = pattern.match(input_addrs)if match:list = []for i in range(int(match.group(2)),int(match.group(3))+1):addr = match.group(1)+str(i)list.append(addr)return listelse:print("ip地址格式輸入有誤")exit(0)except Exception as err:print(err)exit(0)#調(diào)用socket方法進行tcp端口掃描,client.connect()方法的返回值如果為None,則說明端口開放,若無返回值,說明連接超時,就沒有返回值 def scaner(ip,port):try:client = socket.socket()res = client.connect((ip,port))if not res:open_port = []print(ip,":",port," is open")open_port.append((ip,port))return open_portexcept Exception as e:passfinally:client.close()#本方法對傳遞來的列表ports進行循環(huán),每次循環(huán)啟動一個協(xié)程,在協(xié)程內(nèi)部將port和addr進行配對,并調(diào)用scaner方法進行掃描 def coroutine_scan(addr,ports):list = []for port in ports:eve = gevent.spawn(scaner, addr, port)list.append(eve)gevent.joinall(list)#本方法對傳遞來的列表addrs進行循環(huán),每一次循環(huán)啟動一個進程,并將addrs循環(huán)出來的數(shù)據(jù)和ports列表傳遞給coroutine_scan方法 def thread_scan(addrs,ports):for addr in addrs:t = threading.Thread(target=coroutine_scan, args=(addr, ports))t.start()#本方法用來接收參數(shù),并調(diào)用handle_port,handle_ip對輸入的內(nèi)容進行處理,然后將返回的列表數(shù)據(jù)傳遞給thread_scan def main():input_addrs = input("輸入IP地址范圍:如'192.168.0.1-45'\n>>").strip()input_ports = input("輸入端口范圍:如'1000-1005'\n>>").strip()if len(input_addrs) and len(input_addrs)> 0:ports = handle_port(input_ports)addrs = handle_ip(input_addrs)print("開始掃描.......")thread_scan(addrs,ports)else:print("請輸入正確的IP地址范圍和端口。")main()if __name__ == "__main__":main()
?
轉(zhuǎn)載于:https://www.cnblogs.com/yyxianren/p/10694554.html
總結(jié)
以上是生活随笔為你收集整理的portscaner 多线程、多协程并发端口扫描的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。