Pythonを使用して、リモートシステムではなくLinux ubuntuで特定のポートが開いているか閉じているかを知るにはどうすればよいですか? これらの開いているポートをPythonで一覧表示するにはどうすればよいですか?
- Netstat: netstat の出力を Python と統合する方法はありますか?
ローカル マシンだけに関心がある場合は、psutil パッケージを利用できます。次のいずれかを実行できます。
特定の pid で使用されるすべてのポートを確認します。
proc = psutil.Process(pid)
print proc.connections()
ローカル マシンで使用されているすべてのポートを確認します。
print psutil.net_connections()
Windowsでも動作します。
高速なマルチスレッド ポート スキャナーを次に示します。
from time import sleep
import socket, ipaddress, threading
max_threads = 50
final = {}
def check_port(ip, port):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP
#sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
socket.setdefaulttimeout(2.0) # seconds (float)
result = sock.connect_ex((ip,port))
if result == 0:
# print ("Port is open")
final[ip] = "OPEN"
else:
# print ("Port is closed/filtered")
final[ip] = "CLOSED"
sock.close()
except:
pass
port = 80
for ip in ipaddress.IPv4Network('192.168.1.0/24'):
threading.Thread(target=check_port, args=[str(ip), port]).start()
#sleep(0.1)
# limit the number of threads.
while threading.active_count() > max_threads :
sleep(1)
print(final)
Netstat ツールは、/proc/net/tcp などの一部の /proc ファイルを単純に解析し、それを他のファイルの内容と結合します。ええ、それはプラットフォーム固有のものですが、Linux のみのソリューションの場合はそのまま使用できます。Linux カーネルのドキュメントでは、これらのファイルについて詳しく説明しているので、読み方を見つけることができます。
「ポート」はシリアルポート (/dev/ttyS* およびアナログ)、パラレルポートなども意味する可能性があるため、質問があいまいすぎることに注意してください。これはネットワークポートである別の回答からの理解を再利用しましたが、質問をより正確に定式化するようお願いします。
この投稿で複数の解決策を見つけました。ただし、ポートが開かれていない場合にハングする問題や時間がかかる解決策がいくつかあります。以下の解決策は私にとってはうまくいきました:
import socket
def port_check(HOST):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2) #Timeout in case of port not open
try:
s.connect((HOST, 22)) #Port ,Here 22 is port
return True
except:
return False
port_check("127.0.1.1")