指定された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>/fd
のinode
フィールドと一致させる必要があります/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