最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

實例探究Python以并發(fā)方式編寫高性能端口掃描器的方法

 更新時間:2016年06月14日 16:27:57   作者:mattkang  
端口掃描器就是向一批端口上發(fā)送請求來檢測端口是否打開的程序,這里我們以實例探究Python以并發(fā)方式編寫高性能端口掃描器的方法

關(guān)于端口掃描器
端口掃描工具(Port Scanner)指用于探測服務(wù)器或主機開放端口情況的工具。常被計算機管理員用于確認安全策略,同時被攻擊者用于識別目標主機上的可運作的網(wǎng)絡(luò)服務(wù)。

端口掃描定義是客戶端向一定范圍的服務(wù)器端口發(fā)送對應(yīng)請求,以此確認可使用的端口。雖然其本身并不是惡意的網(wǎng)絡(luò)活動,但也是網(wǎng)絡(luò)攻擊者探測目標主機服務(wù),以利用該服務(wù)的已知漏洞的重要手段。端口掃描的主要用途仍然只是確認遠程機器某個服務(wù)的可用性。

掃描多個主機以獲取特定的某個端口被稱為端口清掃(Portsweep),以此獲取特定的服務(wù)。例如,基于SQL服務(wù)的計算機蠕蟲就會清掃大量主機的同一端口以在 1433 端口上建立TCP連接。

Python實現(xiàn)

端口掃描器原理很簡單,無非就是操作socket,能connect就認定這個端口開放著。

import socket 
def scan(port): 
  s = socket.socket() 
  if s.connect_ex(('localhost', port)) == 0: 
    print port, 'open' 
  s.close() 
if __name__ == '__main__': 
  map(scan,range(1,65536)) 

這樣一個最簡單的端口掃描器出來了。
等等喂,半天都沒反應(yīng),那是因為socket是阻塞的,每次連接要等很久才超時。
我們自己給它加上的超時。

s.settimeout(0.1)

再跑一遍,感覺快多了。

多線程版本

import socket 
import threading 
def scan(port): 
  s = socket.socket() 
  s.settimeout(0.1) 
  if s.connect_ex(('localhost', port)) == 0: 
    print port, 'open' 
  s.close() 
 
if __name__ == '__main__': 
  threads = [threading.Thread(target=scan, args=(i,)) for i in xrange(1,65536)] 
  map(lambda x:x.start(),threads) 

運行一下,哇,好快,快到拋出錯誤了。thread.error: can't start new thread。
想一下,這個進程開啟了65535個線程,有兩種可能,一種是超過最大線程數(shù)了,一種是超過最大socket句柄數(shù)了。在linux可以通過ulimit來修改。
如果不修改最大限制,怎么用多線程不報錯呢?
加個queue,變成生產(chǎn)者-消費者模式,開固定線程。

多線程+隊列版本

import socket 
import threading 
from Queue import Queue 
def scan(port): 
  s = socket.socket() 
  s.settimeout(0.1) 
  if s.connect_ex(('localhost', port)) == 0: 
    print port, 'open' 
  s.close() 
 
def worker(): 
  while not q.empty(): 
    port = q.get() 
    try: 
      scan(port) 
    finally: 
      q.task_done() 
 
if __name__ == '__main__': 
  q = Queue() 
  map(q.put,xrange(1,65535)) 
  threads = [threading.Thread(target=worker) for i in xrange(500)] 
  map(lambda x:x.start(),threads) 
  q.join() 

這里開500個線程,不停的從隊列取任務(wù)來做。

multiprocessing+隊列版本
總不能開65535個進程吧?還是用生產(chǎn)者消費者模式

import multiprocessing 
def scan(port): 
  s = socket.socket() 
  s.settimeout(0.1) 
  if s.connect_ex(('localhost', port)) == 0: 
    print port, 'open' 
  s.close() 
 
def worker(q): 
  while not q.empty(): 
    port = q.get() 
    try: 
      scan(port) 
    finally: 
      q.task_done() 
 
if __name__ == '__main__': 
  q = multiprocessing.JoinableQueue() 
  map(q.put,xrange(1,65535)) 
  jobs = [multiprocessing.Process(target=worker, args=(q,)) for i in xrange(100)] 
  map(lambda x:x.start(),jobs) 

注意這里把隊列作為一個參數(shù)傳入到worker中去,因為是process safe的queue,不然會報錯。
還有用的是JoinableQueue(),顧名思義就是可以join()的。

gevent的spawn版本

from gevent import monkey; monkey.patch_all(); 
import gevent 
import socket 
... 
if __name__ == '__main__': 
  threads = [gevent.spawn(scan, i) for i in xrange(1,65536)] 
  gevent.joinall(threads) 

注意monkey patch必須在被patch的東西之前import,不然會Exception KeyError.比如不能先import threading,再monkey patch.

gevent的Pool版本

from gevent import monkey; monkey.patch_all(); 
import socket 
from gevent.pool import Pool 
... 
if __name__ == '__main__': 
  pool = Pool(500) 
  pool.map(scan,xrange(1,65536)) 
  pool.join() 

concurrent.futures版本

import socket 
from Queue import Queue 
from concurrent.futures import ThreadPoolExecutor 
... 
if __name__ == '__main__': 
  q = Queue() 
  map(q.put,xrange(1,65536)) 
  with ThreadPoolExecutor(max_workers=500) as executor: 
    for i in range(500): 
      executor.submit(worker,q) 

相關(guān)文章

  • python批量修改xml文件中的信息

    python批量修改xml文件中的信息

    大家好,本篇文章主要講的是python批量修改xml文件中的信息,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下的相關(guān)資料
    2022-01-01
  • Python2和Python3中urllib庫中urlencode的使用注意事項

    Python2和Python3中urllib庫中urlencode的使用注意事項

    這篇文章主要介紹了Python2和Python3中urllib庫中urlencode的使用注意事項,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • Python使用內(nèi)存緩存實例分享

    Python使用內(nèi)存緩存實例分享

    Python中的內(nèi)存緩存是一種將計算結(jié)果存儲在內(nèi)存中,以便在后續(xù)調(diào)用時快速獲取結(jié)果的技術(shù)。通過使用裝飾器和字典等數(shù)據(jù)結(jié)構(gòu),可以輕松實現(xiàn)內(nèi)存緩存功能,提高程序的執(zhí)行效率。
    2023-09-09
  • Python urls.py的三種配置寫法實例詳解

    Python urls.py的三種配置寫法實例詳解

    這篇文章主要介紹了Python urls.py的三種配置寫法實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 基于python解析XML文件并將數(shù)據(jù)存儲到MongoDB的代碼示例

    基于python解析XML文件并將數(shù)據(jù)存儲到MongoDB的代碼示例

    在軟件開發(fā)中,我們經(jīng)常需要處理各種格式的數(shù)據(jù),XML 是一種常用的數(shù)據(jù)交換格式,它可以存儲和傳輸結(jié)構(gòu)化數(shù)據(jù),很多網(wǎng)站會提供 XML 格式的數(shù)據(jù)接口,以便其他系統(tǒng)可以方便地獲取數(shù)據(jù),本文介紹了基于python解析XML文件并將數(shù)據(jù)存儲到MongoDB的代碼示例,需要的朋友可以參考下
    2024-06-06
  • 利用Python編寫簡易的錄制屏幕小工具

    利用Python編寫簡易的錄制屏幕小工具

    這篇文章主要為大家詳細介紹了如何利用Python語言編寫一個簡易的錄制屏幕小工具,文中的示例代碼講解詳細,感興趣的小伙伴可以動手嘗試一下
    2022-08-08
  • python圖片由RGB空間轉(zhuǎn)成LAB空間的實現(xiàn)方式

    python圖片由RGB空間轉(zhuǎn)成LAB空間的實現(xiàn)方式

    這篇文章主要介紹了python圖片由RGB空間轉(zhuǎn)成LAB空間的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Python自然語言處理之切分算法詳解

    Python自然語言處理之切分算法詳解

    這篇文章主要介紹了Python自然語言處理之切分算法詳解,文中有非常詳細的代碼示例,對正在學(xué)習python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • python判斷變量是否是None的三種寫法總結(jié)

    python判斷變量是否是None的三種寫法總結(jié)

    代碼中經(jīng)常會有變量是否為None的判斷,這篇文章給大家總結(jié)了三種判斷變量是否是none的寫法,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 使用python對泰坦尼克號幸存者進行數(shù)據(jù)分析與預(yù)測

    使用python對泰坦尼克號幸存者進行數(shù)據(jù)分析與預(yù)測

    這篇文章主要介紹了使用python對泰坦尼克號幸存者進行數(shù)據(jù)分析與預(yù)測,應(yīng)用機器學(xué)習的工具來預(yù)測哪些乘客在悲劇中幸存下來
    2023-03-03

最新評論

沙坪坝区| 望江县| 乌兰浩特市| 米泉市| 镇沅| 塘沽区| 东城区| 邛崃市| 龙州县| 瓮安县| 巩义市| 陆丰市| 沁阳市| 定南县| 保亭| 陕西省| 潮州市| 尚义县| 黄平县| 慈溪市| 宜良县| 息烽县| 奈曼旗| 梓潼县| 达拉特旗| 桐庐县| 阳山县| 龙口市| 阿勒泰市| 长葛市| 治县。| 横山县| 宝坻区| 屯昌县| 东莞市| 文昌市| 灵璧县| 遂昌县| 太仆寺旗| 特克斯县| 辽源市|