特定のPIDを持つプロセスが外部コマンドを使用せずにポートを開いたかどうかを知る必要があります。次に、/proc
ファイルシステムを使用する必要があります。たとえば、/proc/$PID/net/tcp
ファイルを読み取って、プロセスによって開かれたTCPポートに関する情報を取得できます。ただし、マルチスレッドプロセスでは、/proc/$PID/task/$TID
ディレクトリにnet/tcp
ファイル。私の質問は:
すべてのスレッドnet/tcp
ファイルを調べる必要がありますか、それともスレッドによって開かれたポートがプロセスnet/tcp
ファイルに書き込まれますか?.
たとえば、/ proc/$ PID/net/tcpファイルを読み取って、プロセスによって開かれたTCPポートに関する情報を取得できます。
そのファイルはprocessによって開かれたtcpポートのリストではありません。これは、現在のネットワーク名前空間で開いているすべてのTCPポートのリストであり、同じネットワーク名前空間で実行されているプロセスの場合は同一から/proc/net/tcp
の内容になります。
プロセスによって開かれたポートを見つけるには、/proc/<pid>/fd
からソケット記述子のリストを取得し、それらの記述子を/proc/net/tcp
のinode
フィールドと照合する必要があります。
お願いします
cat /proc/$PID/net/tcp
そして、あなたはこのような出力を得るでしょう
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 2891985097 1 0000000000000000 100 0 0 10 0
出力の2番目の列(local_address)は、ポートを16進数で示しています。 16進コードを10進数に変換するには、プログラミング計算機を使用してください。
たとえば、ここでは、ポート:01BB(16進数)は、HTTPSのデフォルトポートである433(10進数)と同じです。