92

Pythonを使用して、リモートシステムではなくLinux ubuntuで特定のポートが開いているか閉じているかを知るにはどうすればよいですか? これらの開いているポートをPythonで一覧表示するにはどうすればよいですか?

  • Netstat: netstat の出力を Python と統合する方法はありますか?
4

13 に答える 13

22

ローカル マシンだけに関心がある場合は、psutil パッケージを利用できます。次のいずれかを実行できます。

  1. 特定の pid で使用されるすべてのポートを確認します。

    proc = psutil.Process(pid)
    print proc.connections()
    
  2. ローカル マシンで使用されているすべてのポートを確認します。

    print psutil.net_connections()
    

Windowsでも動作します。

https://github.com/giampaolo/psutil

于 2015-03-26T19:39:04.367 に答える
5

高速なマルチスレッド ポート スキャナーを次に示します。

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)

ライブデモ

于 2019-04-13T07:17:37.927 に答える
3

Netstat ツールは、/proc/net/tcp などの一部の /proc ファイルを単純に解析し、それを他のファイルの内容と結合します。ええ、それはプラットフォーム固有のものですが、Linux のみのソリューションの場合はそのまま使用できます。Linux カーネルのドキュメントでは、これらのファイルについて詳しく説明しているので、読み方を見つけることができます。

「ポート」はシリアルポート (/dev/ttyS* およびアナログ)、パラレルポートなども意味する可能性があるため、質問があいまいすぎることに注意してください。これはネットワークポートである別の回答からの理解を再利用しましたが、質問をより正確に定式化するようお願いします。

于 2013-12-22T07:53:59.710 に答える
3

この投稿で複数の解決策を見つけました。ただし、ポートが開かれていない場合にハングする問題や時間がかかる解決策がいくつかあります。以下の解決策は私にとってはうまくいきました:

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")
于 2020-08-10T11:22:05.650 に答える