web-dev-qa-db-ja.com

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

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

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

13
rmonjo

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

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

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

23
larsks

お願いします

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

0
PHZ.fi-Pharazon