プロセスに開いているポートがあるかどうかを確認するには、「/proc」を読んでください。

プロセスに開いているポートがあるかどうかを確認するには、「/proc」を読んでください。

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

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

答え1

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

このファイルは以下によって生成されませんでした。プロセス。同じネットワーク名前空間で実行されているプロセスに対して現在ネットワーク名前空間で開いているすべてのTCPポートのリスト。まったく同じコンテンツ/proc/net/tcp

プロセスで開かれたポートを見つけるには、ソケット記述子のリストを取得し、その記述子を/proc/<pid>/fdinodeフィールドと一致させる必要があります/proc/net/tcp

答え2

お願いします

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

local_address出力の2番目の列()にはポートが16進数で表示されます。プログラミング電卓を使用して、16進コードを10進数に変換します。

たとえば、port:01BB(16進数)はHTTPSデフォルトポートである443(10進数)と同じです。

答え3

メモに/proc/net/tcp置き換えられました。NETLINK_SOCK_DIAGこれは基本的に同じデータをバイナリ形式で提供し、実装者によると、/proc/...フォルダから読み取るよりも高速で安全です。

ライブラリ(基本ライブラリ)があり、libmnl機能は複数の言語で利用できます(C / C ++にはこれらのライブラリに直接アクセスでき、GoとPythonには拡張機能があり、Perlにも、もちろん他の多くの機能もあります)。

どの言語を使っているのかを公開していなかったので、現在ではもっと申し上げることが難しいです。 StackoverflowにCの実装例があります。https://stackoverflow.com/questions/68425240/can-the-netlink-sock-diag-interface-be-used-to-listen-for-listen-and-close

答え4

以下は、ソケット記述子のinodeを検索し、このソケットが開いている実行中のプロセスのPIDを表示するサンプルスクリプトです。

port=9090;
hex_port=$(python -c 'print(hex('$port')[2:])');
inode=$(cat /proc/net/tcp | grep ":$hex_port" | awk '{print $10}');
for i in $(ps axo pid); do  
   ls -l /proc/$i/fd 2> /dev/null | grep -q ":\[$inode\]" &&  echo $i;
done

関連情報