Python はポートが開いているかどうかを確認します (7 つの方法)

sock.connect_ex

ソケット モジュールの connect_ex を使用して、ポートが開いているかどうかを確認します。戻り値が 0の場合、接続は成功し、ポートが開いています。それ以外の場合、ポートは閉じられています。

import socket

def check_port(ip, port):  
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    sock.settimeout(5)  
  
    try:  
        result = sock.connect_ex((ip, port))  
        if result == 0:  
            return True
        else:  
            return False
    except Exception as e:  
        print(f"错误: {
      
      str(e)}")  
    finally:  
        sock.close()
        
host = 'localhost'
port = 80
if check_port(host, port):
    print(f'The port {
      
      port} on {
      
      host} is open.')
else:
    print(f'The port {
      
      port} on {
      
      host} is closed.')

靴下接続

ソケット モジュールの connect を使用して、ポートが開いているかどうかを確認します。例外が発生しなければ、接続は成功し、ポートは開いています。そうでない場合は、ポートは閉じられています。

import socket

def check_port(host, port):
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(1)
        sock.connect((host, port))
        sock.close()
        return True
    except:
        return False
    finally:  
        sock.close()

Telnetコマンド

telnet コマンドを呼び出して、ポートが開いているかどうかを確認します。
telnet コマンドの使用: ほとんどのオペレーティング システムでは、telnet コマンドを使用してポートが開いているかどうかをテストできます。コマンドラインに「telnet <IP アドレス> <ポート>」と入力できます。ポートが開いていれば、Telnet は正常に接続し、情報を返します。それ以外の場合は、エラー メッセージが返されます。

import os  
  
def check_port(ip, port):  
    result = os.system(f"telnet {
      
      ip} {
      
      port} > /dev/null 2>&1")  
    if result == 0:  
        print(f"端口 {
      
      port} 是开放的")  
    else:  
        print(f"端口 {
      
      port} 是关闭的")

NCコマンド

nc コマンド (netcat とも呼ばれる) を使用する: nc コマンドは、ポートが開いているかどうかをテストするために使用できる強力なツールです。コマンド ラインに「nc -zv <IP アドレス> <ポート>」と入力すると、ポートが開いていれば、nc は正常に接続し、情報を返します。それ以外の場合は、エラー メッセージが返されます。

import os  
  
def check_port(ip, port):  
    result = os.system(f"nc -zv {
      
      ip} {
      
      port} > /dev/null 2>&1")  
    if result == 0:  
        print(f"端口 {
      
      port} 是开放的")  
    else:  
        print(f"端口 {
      
      port} 是关闭的")

pingコマンド

ping コマンドを使用する: ping コマンドを使用すると、ネットワーク接続がスムーズかどうかをテストしたり、ポートが開いているかどうかを確認したりできます。コマンド ラインに「ping <IP アドレス> -n <ポート>」と入力します。ポートが開いている場合、ping は何らかの情報を返します。それ以外の場合は、エラー メッセージが返されます。

import os  
  
def check_port(ip, port):  
    result = os.system(f"ping {
      
      ip} -n {
      
      port} > /dev/null 2>&1")  
    if result == 0:  
        print(f"端口 {
      
      port} 是开放的")  
    else:  
        print(f"端口 {
      
      port} 是关闭的")

注: ターゲット サーバーがping を無効にしている場合、それを特定できません。

リクエストは http ポートをチェックします

リクエスト ライブラリは、GET、POST、PUT、DELETE などのあらゆる種類の HTTP リクエストの送信に使用できる Python 用の HTTP ライブラリです。Cookie、セッション、リダイレクトなどを処理するために使用することもできます。

ポートが開いているかどうかを確認するには、通常、リクエスト ライブラリを使用して HTTP リクエストをポートに送信し、正常に接続できるかどうかを確認します。簡単な例を次に示します。

import requests  
  
def check_port(ip, port):  
    try:  
        response = requests.get(f"http://{
      
      ip}:{
      
      port}")  
        if response.status_code == 200:  
            print(f"端口 {
      
      port} 是开放的")  
        else:  
            print(f"端口 {
      
      port} 是关闭的")  
    except requests.exceptions.ConnectionError:  
        print(f"端口 {
      
      port} 是关闭的")

上記のコードでは、requests.get メソッドを使用して、指定された IP アドレスとポートに GET リクエストを送信します。リクエストが成功し、返されたステータス コードが 200 の場合、ポートが開いていることを意味します。例外が発生した場合はrequests.exceptions.ConnectionError、ポートが閉じられていることを意味します。リクエスト チェック ポート メソッドは、HTTP ポートと HTTPS ポートでのみ使用できます。

スカピー

Scapy は、ネットワーク パケットの作成、解析、送信、受信、解析を行うための強力な Python ライブラリです。Scapy を使用してポートが開いているかどうかを確認します。

from scapy.all import *  
  
def check_port(ip, port):  
    # 构造一个ICMP数据包,并发送到目标IP地址和端口  
    packet = IP(dst=ip) / ICMP() / Raw(load=str(port))  
    # 发送数据包并获取响应  
    response = sr1(packet, timeout=1)  
    # 检查响应是否为ICMP错误类型  
    if response is None or response.type != ICMP.DEST_UNREACH:  
        print(f"端口 {
      
      port} 是开放的")  
    else:  
        print(f"端口 {
      
      port} 是关闭的")  
  
# 测试函数  
check_port('127.0.0.1', 80)

Scapy を使用して ICMP パケットを構築し、宛先ポートをペイロードとして含めました。次に、そのパケットを送信し、応答を待ちます。応答が ICMP エラー タイプ (宛先に到達不能) の場合、ポートが閉じられていることを意味します。それ以外の場合、ポートは開いています。この方法は、ICMP ポート スキャンの場合にのみ機能します。TCP ポート スキャンや UDP ポート スキャンなど、他のタイプのポート スキャンの場合は、異なるプロトコルとフィールドを使用する必要があります。

おすすめ

転載: blog.csdn.net/lilongsy/article/details/132145421