lsof -i結果でコマンドのフルパスを見つける方法

lsof -i結果でコマンドのフルパスを見つける方法

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

$PIDPID番号はどこにありますか?

したがって、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、、、sortuniq出力からヘッダー行をスキップし、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

おすすめ記事