コマンドがアクセスしているファイルを正確に知る方法はありますか?

コマンドがアクセスしているファイルを正確に知る方法はありますか?

私は、起動された特定のプロセスがどのファイルとリソースにアクセスしているかを知る必要があるソフトウェアに取り組んでいます。

私は、すべてのスクリプト、アプリケーション、デーモンがアクセスしているものを追跡するつもりはなく、ユーザーが提供する特定のプロセスだけを追跡するつもりです。

Python (または他の言語) でこれを行う方法はありますか? 自分で調べてみるつもりですが、この種のことについて知っていて、もう少し説明できる知識豊富なユーザーがいるかもしれないので、ここで質問しようと思いました。

答え1

追跡することができますシステムコールプログラムが作成するファイル。これは、プログラムがアクセスするファイルを調べるための一般的な方法です。これを行うツールはtruss多くのUnixシステムでは、dtrussOSXでは、straceLinux の場合。ここでは Linux の使用方法を説明します。他のシステムのマニュアルを確認してください。

最も単純な形式は

strace myprogram arg1 arg2

これは、によって行われたすべてのシステムコールのログを出力しますmyprogram。() ログをファイルに保存するには、オプション を使用します-o。サブプロセスによる呼び出しもログに記録するには、オプション を使用します-f。ログに記録するシステム コールを選択するには、オプション を使用します-e。 の引数として使用できるものの詳細については、マニュアルを参照してください。たとえば、次の呼び出しは-e、およびを除くファイル関連のシステム コール (開く、閉じる、ディレクトリの一覧表示など) をログに記録します。readwrite

strace -e'file,!read,!write' -o /tmp/myprogram.log -f myprogram arg1 arg2

答え2

によるとこの郵便受けPythonでは、psutilモジュール。Pythonに限定されていない場合は、lsofそしてストレースこの目的で最も一般的に使用される 2 つのコマンド ライン ユーティリティです。

答え3

これを行う唯一の完全に信頼できる方法は、システム コールをトレースすることです。プログラムstrace(@gowenfawr によって言及されています) はこれを正しく実行し、システム コールの観点から実装されていますptrace(2)。ただし、このコールを正しく使用するのは難しいことに注意してくださいptrace。直接使用できない場合はstrace -e open、2 番目の方法を検討してください。

openほとんどのプロセスでは、代わりに を介してCライブラリ関数の呼び出しを傍受することができますLD_PRELOAD些細なただし、悪意のある C プログラムがこれを回避することはできません。ただし、プログラムがシステム コールを実行しないことを信頼できる場合は、プログラムによる実装よりも実装が簡単ですptrace

Python などの高級言語で記述されていることが分かっているプロセスの場合、代わりに高レベルのopen呼び出しをインターセプトすることもできますが、言語がそのようなインターセプトをサポートするように設計されていない限り (Python はそうではありません)、これは C レベルの呼び出しをインターセプトするよりも難しい可能性があります。

最後に、上記の段落はすべて、ファイルが で開かれることを前提としています。これは常に当てはまるわけではなく、 、、補助データ、および親から継承されたファイル記述子openもあります。openatopen64recvmsg

関連情報