TCP / UDPを介してリッスンするローカルIPアドレスとポートのリストを取得します。

TCP / UDPを介してリッスンするローカルIPアドレスとポートのリストを取得します。

プロセスID(ソケットを使用)が与えられたら、ソケットエンドポイントでIPを取得したいと思います。

たとえば、新しいSSHセッションが作成されると、セッションごとにsshd悪魔プロセスが分岐します。セッションのIPエンドポイントを取得したいです。

このロジックが機能することがわかりました。
1. すべての TCP ソケットをリストします ("cat /proc/net/tcp")。
2. 入力プロセスのすべてのファイル記述子をリストし、"socket" を grep します。 "ls -la /proc/PID /fd | grep ソケット
"

出力#1:

root@L137B-DV3:/home/ilan# cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
...
  18: 519A0A0A:E0D1 3C890A0A:C006 01 00000000:00000000 00:00000000 00000000     0        0 10494 1 ffff88003c44f640 20 4 30 10 -1
  19: 519A0A0A:9930 3C890A0A:C004 01 00000000:00000000 00:00000000 00000000     0        0 10496 1 ffff88003c44ee80 20 4 32 10 -1
  20: 519A0A0A:01BD 59890A0A:C1FA 01 00000000:00000000 02:0004F47D 00000000     0        0 76451 2 ffff88003b39d740 21 4 30 10 -1

出力#2

root@L137B-DV3:/home/ilan# ls -la /proc/4038/fd/ | grep socket
lrwx------ 1 root root 64 Jun  4 13:40 30 -> socket:[6347]
lrwx------ 1 root root 64 Jun  4 13:40 32 -> socket:[76483]
lrwx------ 1 root root 64 Jun  4 13:40 35 -> socket:[6357]
lrwx------ 1 root root 64 Jun  4 13:40 36 -> socket:[76451]
lrwx------ 1 root root 64 Jun  4 13:40 6 -> socket:[76453]

inode 76451はマージの結果であり、ソケットIPアドレスはlocalhost:519A0A0Aおよびリモート:59890A0Aです。

私の質問は次のとおりです。
1. 「cat /proc/net/tcp」は可能ですか?特定プロセス? cat /proc/PID/net/tcpを試しましたが、cat /proc/net/tcpと同じ結果が返されました。
2. IPを検索するより効率的な方法はありますか?

ベストアンサー1

PID用に開かれたファイルを一覧表示できます。lsof:

lsof -p <PID>

ただし、SSHプロセスでは、コマンド名のフィルタリングを使用する方が良いかもしれません。

# filters on both ssh and sshd command (client/server)
lsof -i -na -c /sshd?/ -sTCP:ESTABLISHED

もちろん、次の2つを組み合わせてください。

lsof -p <PID> -i -na -sTCP:ESTABLISHED

おすすめ記事