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 ポート スキャンなど、他のタイプのポート スキャンの場合は、異なるプロトコルとフィールドを使用する必要があります。