這期內容當中小編將會給大家帶來有關如何用python寫個端口掃描器及各種并發嘗試,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創新互聯公司從2013年開始,先為前鋒等服務建站,前鋒等地企業,進行企業商務咨詢服務。為前鋒企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。端口掃描器原理很簡單,無非就是操作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))
這樣一個最簡單的端口掃描器出來了。
等等喂,半天都沒反應,那是因為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個線程,有兩種可能,一種是超過較大線程數了,一種是超過較大socket句柄數了。在linux可以通過ulimit來修改。
如果不修改較大限制,怎么用多線程不報錯呢?
加個queue,變成生產者-消費者模式,開固定線程。
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個線程,不停的從隊列取任務來做。
總不能開65535個進程吧?還是用生產者消費者模式
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)
注意這里把隊列作為一個參數傳入到worker中去,因為是process safe的queue,不然會報錯。
還有用的是JoinableQueue(),顧名思義就是可以join()的。
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.
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()
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)
上述就是小編為大家分享的如何用python寫個端口掃描器及各種并發嘗試了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創新互聯行業資訊頻道。
標題名稱:如何用python寫個端口掃描器及各種并發嘗試-創新互聯
分享URL:http://vcdvsql.cn/article12/cdiegc.html
成都網站建設公司_創新互聯,為您提供靜態網站、網站內鏈、商城網站、網站建設、品牌網站制作、網站改版
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯