有什麼方法可以準確判斷命令正在存取哪些文件?

有什麼方法可以準確判斷命令正在存取哪些文件?

我正在開發一款軟體,它要求我知道任何特定啟動的進程正在存取哪些檔案和資源。

我不打算嘗試追蹤每個腳本、應用程式和守護程式正在訪問的內容,而只是追蹤用戶提供的某個進程。

有沒有辦法用Python(或任何其他語言)來做到這一點?我自己要做一些研究,我只是想我會在這裡問,以防有知識淵博的用戶了解這類事情並可以提供更多解釋。

答案1

您可以追蹤系統調用一個程式製作的。這是找出它訪問的文件的常用方法。執行此操作的工具稱為truss在許多 Unix 系統中,dtruss在 OSX 上,strace在 Linux 上。我將在這裡描述 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 中使用普蘇蒂爾模組。如果你不限於Python,那麼拉索夫斯特雷斯是最常用於此目的的兩個命令列實用程式。

答案3

唯一完全可靠的方法是追蹤系統呼叫。該strace程式(由@gowenfawr 提到)正確地執行了此操作,並且是根據ptrace(2)系統呼叫來實現的。但請注意,該ptrace調用很難正確使用;如果不能strace -e open直接使用,可以考慮第二種方式:

open對於大多數進程,您可以透過攔截對 C 庫函數的呼叫LD_PRELOAD。這是瑣碎的然而,對於敵對的 C 程序來說,可以避免這種情況;但如果您相信程式本身不會執行系統調用,那麼它的實作比程式設計更簡單ptrace

對於您知道是用高級語言(例如 python)編寫的進程,您可以攔截高級open調用,但這可能比攔截 C 級調用更困難,除非語言設計為支援這樣的攔截(python 不是)。

最後 - 以上所有段落均假設文件是用open.這並不總是正確的,還有openatopen64recvmsg輔助資料以及從父級繼承的檔案描述符。

相關內容