lsof
素晴らしいユーティリティです。今すぐ使い始めました。
lsof -i | grep smtp
=> 次のような結果が出ます。
httpd.pl 212548 global 3u IPv4 893092369 0t0 TCP server07.host...blah...
上記の例は、httpd.pl
スパムを送信するPerlスクリプトです。
コマンドのフルパスをどのように知ることができますか?つまり、上記の結果から、フルパスを知りたいです。httpd.pl
ホームディレクトリから検索しようとしましたが、ファイルはhttpd.pl
存在しません。また、私はそれを試しましたが、lsof -p PID
そのパスも提供しません。
このファイルのフルパスを取得する方法はありますか?
注:この問題は共有ホスティング環境で一般的です。したがって、共有ホスティングやWebサーバー管理者にとって非常に便利です。
ベストアンサー1
lsof -i:$PORT
まず、grepを介してインターネットアドレスが与えられた$ PORT番号(またはサービス名)を使用するファイルのリストを選択する必要はありません。
lsof -i:smtp
あなたの場合はそれで十分です。
コマンド名が既にわかっている場合は、lsof -c $COMMAND
$ COMMANDというコマンドを実行したプロセスのファイルのリストを選択してください。例:
lsof -c httpd.pl
3番目の概念:プロセスのPIDがわかっている場合は、次のコマンドを使用して完全なコマンドパスを取得できます。
ps -p $PID -o command
$PID
PID番号はどこにありますか?
したがって、lsofの結果からコマンドのフルパスを見つけるには、次のように使用できます。
ps -p $(lsof -i:$PORT |awk 'NR>1 {print $2}' |sort -n |uniq) -o comm
または
ps -p $(lsof -c $COMMAND |awk 'NR>1 {print $2}' |sort -n |uniq) -o comm
注1:awk
、、、sort
はuniq
出力からヘッダー行をスキップし、PID番号でリストを集計するために必要です。
注2:$ PORTを使用する宛先ポートが複数のプロセス(httpsなど)で使用されている場合は、各行を個別に解析する必要があります。
for PID in $(lsof -i:$PORT |awk 'NR>1 {print $2}' |sort -n |uniq); do
ps -p $PID -o comm
done