プロセス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