基於python編寫一個簡單的多執行緒埠掃描指令碼

最美安聯發表於2020-10-28

基於python編寫一個簡單的多執行緒埠掃描指令碼

程式碼如下:

import threading
import queue
import socket
import optparse
import sys
#建立埠掃描類
class PortScaner(threading.Thread):
#需要傳入埠佇列,目標ip,探測超時資訊
    def __init__(self,portqueue,ip,timeout=3):
        threading.Thread.__init__(self)
        self._portqueue = portqueue
        self._ip = ip
        self._timeout = timeout
    def run(self):
        while True:
        #判斷埠列表是否為空
            if self._portqueue.empty():
             break
            port = self._portqueue.get(timeout=0.5)
            try:
                #建立socket物件為sock,並設定其套接字家族和型別
                '''socket.socket ( family ,type ,proto)
                family: 套接字家族可以使 AF_UNIX 或者 AF_INET
                type: 套接字型別,可以根據是面向連線的 SOCK_STREAM 還是非連線的 SOCK_DGRAM
                protocol: 一般不填,預設為 0
                '''
                sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                #sock.settimeout(timeout):設定套接字操作的超時期,timeout是一個浮點數,單位是秒。值為None表示沒有超時期。一般,超時期應該在剛建立套接字時設定,因為它們可能用於連線的操作(如connect())
                sock.settimeout(self._timeout)
                #sock.connect_ex() :主動初始化TCP伺服器連線;一般address的格式為元組(hostname,port),如果連線出錯,返回出錯碼。
                result_code = sock.connect_ex((self._ip, port))
                #若埠開發,返回0
                if result_code == 0:
                    sys.stdout.write("[%d]open \n" % port)
            except Exception as e:
                print(e)
            finally:
                sock.close()
#定義命令標準函式
def get_information():
    #建立命令解析模組
    parser = optparse.OptionParser()
    # ip 引數 -i
    parser.add_option('-i', '--ip', dest='targetip', default='127.0.0.1', type='string', help='target IP')
    # 埠引數 -p
    parser.add_option('-p', '--port', dest='port', default='80', type='string', help='scan_port')
    # 執行緒引數 -t
    parser.add_option('-t', '--thread', dest='threadNum', default='100', type='int', help='thread number')
    (options, args) = parser.parse_args()
    StartScan(options.targetip, options.port, options.threadNum)
#定義掃描函式
def StartScan(targetip,port,threadNum):
#埠列表
    portList = []
    portNumb = port
#判斷單埠還是範圍埠
    '''
    eg:192.168.1.1-100
    用split函式通過"-"將ip段劃分為192.168.1.1和100,再將192.168.1.1進行分割,取出最後一位數字與100組成int型數字範圍
    for迴圈遍歷
    '''
    if '-' in port:
            for i in range(int(port.split('-')[0]),int(port.split('-')[1])+1):
                portList.append(i)
    else:
        portList.append(int(port))
    #目標ip地址
    ip = targetip
    #執行緒列表
    threads = []
    #執行緒數量
    threadNumber = threadNum
    #埠佇列
    portQueue = queue.Queue()
    #生成埠,加入埠佇列
    for port in portList:
        portQueue.put(port)
    for t in range(threadNumber):
        threads.append(PortScaner(portQueue,ip,timeout =3))
    #啟動執行緒
    for thread in threads:
        thread.start()
    #阻塞執行緒
    for thread in threads:
        thread.join()
#主函式
if __name__ =='__main__':
    get_information()


測試:
在這裡插入圖片描述

在這裡插入圖片描述

相關文章