溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用python怎么實現一個多線程端口掃描功能

發布時間:2021-01-22 16:36:41 來源:億速云 閱讀:290 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關利用python怎么實現一個多線程端口掃描功能,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

需求:掃描目標網站開放哪些端口號,將所有開放的端口號輸出。

分析:使用socket連接,如果連接成功,認為端口開放,如果連接失敗,認為端口關閉(有可能端口開放但連接失敗,這里簡單認為端口不開放)

使用到的庫:socket, threading

過程:

先定義一個函數,對給定的(ip, port)進行掃描,看其是否能連接成功。

def tcpPortScan(ip, port, openPort):
 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 創建套接字
 sock.settimeout(0.1)   # 設置延時時間
 try:
  result = sock.connect_ex((ip, port))
  if result == 0:    # 如果連接成功,返回值為0
   openPort.append(port) # 如果端口開放,就把端口port賦給openPort
 except:
  pass
 sock.close()     # 關閉套接字

當需要掃描目標地址的多個端口時,循環使用上述函數的話,掃描速度會極其慢,因為考慮使用多線程。

再定義一個函數,實現多線程掃描。

def threadingPortScan(host, portList, openPorts = []):
 
 hostIP = socket.gethostbyname(host) # 獲取域名對應的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  # 返回值為該域名下開放的端口列表

完整代碼如下:

# -*- coding:utf-8 -*-
'''
使用多線程,檢測一個目標地址的端口開放情況,目標地址由用戶輸入,端口暫時定義為0~1024,
檢測TCP連接是否成功,如果連接成功,則端口開放,不成功則端口關閉
'''
 
import socket
import threading
 
def main():
 host = input('please input domain:')
 portList = range(0, 1025)
 openPorts = threadingPortScan(host, portList)
 print(host,'open ports:', openPorts)
 
# 對給定的(ip, port)進行TCP連接掃描
def tcpPortScan(ip, port, openPort):
 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 創建套接字
 sock.settimeout(0.1)   # 設置延時時間
 try:
  result = sock.connect_ex((ip, port))
  if result == 0:
   openPort.append(port) # 如果端口開放,就把端口port賦給openPort
 except:
  pass
 sock.close()     # 關閉套接字
 
 
def threadingPortScan(host, portList, openPorts = []):
 
 hostIP = socket.gethostbyname(host) # 獲取域名對應的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  # 返回值為該域名下開放的端口列表
 
if __name__ == '__main__':
 main()

使用www.qq.com做一個測試,測試結果如下:

>>>please input domain: www.qq.com
www.qq.com open ports: [80, 843]

上述就是小編為大家分享的利用python怎么實現一個多線程端口掃描功能了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女