「/ proc」を読んで、プロセスがポートを開いたかどうかを確認します


13

特定のPIDを持つプロセスが外部コマンドを使用せずにポートを開いたかどうかを知る必要があります。次に、/procファイルシステムを使用する必要があります。/proc/$PID/net/tcpたとえば、ファイルを読み取って、プロセスによって開かれたTCPポートに関する情報を取得できます。ただし、マルチスレッドプロセスでは、/proc/$PID/task/$TIDディレクトリにはnet/tcpファイルも含まれます。私の質問は:

すべてのスレッドnet/tcpファイルを調べる必要がありますか、それともスレッドによって開かれたポートがプロセスnet/tcpファイルに書き込まれますか?

回答:


23

たとえば、/ proc / $ PID / net / tcpファイルを読み取って、プロセスによって開かれたTCPポートに関する情報を取得できます。

そのファイルは、プロセスによって開かれたtcpポートのリストではありません。これは、現在のネットワーク名前空間で開いているすべてのTCPポートのリストであり、同じネットワーク名前空間で実行されているプロセスの場合はの内容と同じです/proc/net/tcp

プロセスによって開かれたポートを見つけるには/proc/<pid>/fd、からソケット記述子のリストを取得し、それらの記述子をのinodeフィールドと照合する必要があります/proc/net/tcp


回答ありがとうございます。プロセスがマルチスレッド化されている場合、fd各スレッドのすべてのディレクトリを調べる必要がありますか?または、/proc/pid/fdディレクトリはディレクトリを「継承」し/proc/pid/task/tid/fdますか?
rmonjo 2015

わかりませんが、テストするのは簡単なことのようです。
larsk、2015

7
@rmonjoスレッドはファイルを開くことができず、プロセスのみが開くことができます。fdスレッドのディレクトリだけ繰り返されるfdプロセスのディレクトリを。
Gilles「SO-邪悪なことをやめ

0

お願いします

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進数)と同じです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.