python實(shí)現(xiàn)多線程端口掃描
一個(gè)簡(jiǎn)易的TCP端口掃描器,使用python3實(shí)現(xiàn)。
需求:掃描目標(biāo)網(wǎng)站開(kāi)放哪些端口號(hào),將所有開(kāi)放的端口號(hào)輸出。
分析:使用socket連接,如果連接成功,認(rèn)為端口開(kāi)放,如果連接失敗,認(rèn)為端口關(guān)閉(有可能端口開(kāi)放但連接失敗,這里簡(jiǎn)單認(rèn)為端口不開(kāi)放)
使用到的庫(kù):socket, threading
過(guò)程:
先定義一個(gè)函數(shù),對(duì)給定的(ip, port)進(jìn)行掃描,看其是否能連接成功。
def tcpPortScan(ip, port, openPort): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 創(chuàng)建套接字 sock.settimeout(0.1) # 設(shè)置延時(shí)時(shí)間 try: result = sock.connect_ex((ip, port)) if result == 0: # 如果連接成功,返回值為0 openPort.append(port) # 如果端口開(kāi)放,就把端口port賦給openPort except: pass sock.close() # 關(guān)閉套接字
當(dāng)需要掃描目標(biāo)地址的多個(gè)端口時(shí),循環(huán)使用上述函數(shù)的話,掃描速度會(huì)極其慢,因?yàn)榭紤]使用多線程。
再定義一個(gè)函數(shù),實(shí)現(xiàn)多線程掃描。
def threadingPortScan(host, portList, openPorts = []): hostIP = socket.gethostbyname(host) # 獲取域名對(duì)應(yīng)的IP地址 nloops = range(len(portList)) threads = [] for i in nloops: t = threading.Thread(target=tcpPortScan, args=(hostIP, portList[i], openPorts)) threads.append(t) for i in nloops: threads[i].start() for i in nloops: threads[i].join() return openPorts # 返回值為該域名下開(kāi)放的端口列表
完整代碼如下:
# -*- coding:utf-8 -*- ''' 使用多線程,檢測(cè)一個(gè)目標(biāo)地址的端口開(kāi)放情況,目標(biāo)地址由用戶輸入,端口暫時(shí)定義為0~1024, 檢測(cè)TCP連接是否成功,如果連接成功,則端口開(kāi)放,不成功則端口關(guān)閉 ''' import socket import threading def main(): host = input('please input domain:') portList = range(0, 1025) openPorts = threadingPortScan(host, portList) print(host,'open ports:', openPorts) # 對(duì)給定的(ip, port)進(jìn)行TCP連接掃描 def tcpPortScan(ip, port, openPort): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 創(chuàng)建套接字 sock.settimeout(0.1) # 設(shè)置延時(shí)時(shí)間 try: result = sock.connect_ex((ip, port)) if result == 0: openPort.append(port) # 如果端口開(kāi)放,就把端口port賦給openPort except: pass sock.close() # 關(guān)閉套接字 def threadingPortScan(host, portList, openPorts = []): hostIP = socket.gethostbyname(host) # 獲取域名對(duì)應(yīng)的IP地址 nloops = range(len(portList)) threads = [] for i in nloops: t = threading.Thread(target=tcpPortScan, args=(hostIP, portList[i], openPorts)) threads.append(t) for i in nloops: threads[i].start() for i in nloops: threads[i].join() return openPorts # 返回值為該域名下開(kāi)放的端口列表 if __name__ == '__main__': main()
使用www.qq.com做一個(gè)測(cè)試,測(cè)試結(jié)果如下:
>>>please input domain: www.qq.com www.qq.com open ports: [80, 843]
總結(jié):這個(gè)小程序僅適用于新手練習(xí),不適合真正應(yīng)用。該簡(jiǎn)易端口掃描器僅能掃描出一部分端口,有些端口可能因?yàn)榉阑饓r截導(dǎo)致掃描失敗。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python進(jìn)行數(shù)據(jù)可視化實(shí)現(xiàn)引人注目的視覺(jué)效果
這篇文章主要介紹了使用Python進(jìn)行數(shù)據(jù)可視化實(shí)現(xiàn)引人注目的視覺(jué)效果,您將了解基本的數(shù)據(jù)可視化概念,以及如何創(chuàng)建各種引人注目的圖表和圖形,從而更好地理解和呈現(xiàn)數(shù)據(jù)2023-04-04django項(xiàng)目環(huán)境搭建及在虛擬機(jī)本地創(chuàng)建django項(xiàng)目的教程
這篇文章主要介紹了django項(xiàng)目環(huán)境搭建及在虛擬機(jī)本地創(chuàng)建django項(xiàng)目的教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08詳解tensorflow訓(xùn)練自己的數(shù)據(jù)集實(shí)現(xiàn)CNN圖像分類
本篇文章了tensorflow訓(xùn)練自己的數(shù)據(jù)集實(shí)現(xiàn)CNN圖像分類,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Python+eval函數(shù)實(shí)現(xiàn)動(dòng)態(tài)地計(jì)算數(shù)學(xué)表達(dá)式詳解
Python的 eval() 允許從基于字符串或基于編譯代碼的輸入中計(jì)算任意Python表達(dá)式。當(dāng)從字符串或編譯后的代碼對(duì)象的任何輸入中動(dòng)態(tài)計(jì)算Python表達(dá)式時(shí),此函數(shù)非常方便。本文將利用eval實(shí)現(xiàn)動(dòng)態(tài)地計(jì)算數(shù)學(xué)表達(dá)式,需要的可以參考一下2022-09-09Python3顯示當(dāng)前時(shí)間、計(jì)算時(shí)間差及時(shí)間加減法示例代碼
這篇文章主要給大家介紹了關(guān)于Python3顯示當(dāng)前時(shí)間、計(jì)算時(shí)間差及時(shí)間加減法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python3具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09在windows下使用python進(jìn)行串口通訊的方法
今天小編就為大家分享一篇在windows下使用python進(jìn)行串口通訊的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07用python登錄帶弱圖片驗(yàn)證碼的網(wǎng)站
這篇文章主要介紹了用python登錄帶弱圖片驗(yàn)證碼的網(wǎng)站方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03python flask中動(dòng)態(tài)URL規(guī)則詳解
今天小編就為大家分享一篇python flask中動(dòng)態(tài)URL規(guī)則詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Spring Cloud Feign高級(jí)應(yīng)用實(shí)例詳解
這篇文章主要介紹了Spring Cloud Feign高級(jí)應(yīng)用實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12