我正在開發一款軟體,它要求我知道任何特定啟動的進程正在存取哪些檔案和資源。
我不打算嘗試追蹤每個腳本、應用程式和守護程式正在訪問的內容,而只是追蹤用戶提供的某個進程。
有沒有辦法用Python(或任何其他語言)來做到這一點?我自己要做一些研究,我只是想我會在這裡問,以防有知識淵博的用戶了解這類事情並可以提供更多解釋。
答案1
您可以追蹤系統調用一個程式製作的。這是找出它訪問的文件的常用方法。執行此操作的工具稱為truss
在許多 Unix 系統中,dtruss
在 OSX 上,strace
在 Linux 上。我將在這裡描述 Linux 的用法;檢查其他系統上的手冊。
最簡單的形式是
strace myprogram arg1 arg2
這將列印由 進行的所有系統呼叫的日誌myprogram
。 (例子.) 若要將日誌保存在檔案中,請使用選項-o
。若要同時記錄子程序發出的調用,請使用選項-f
。若要選擇記錄哪些系統調用,請使用選項-e
。有關可以用作 的參數的詳細信息,請參閱手冊-e
。例如,以下呼叫記錄檔案相關的系統呼叫(開啟和關閉、目錄清單等),除了read
和write
。
strace -e'file,!read,!write' -o /tmp/myprogram.log -f myprogram arg1 arg2
答案2
答案3
唯一完全可靠的方法是追蹤系統呼叫。該strace
程式(由@gowenfawr 提到)正確地執行了此操作,並且是根據ptrace(2)
系統呼叫來實現的。但請注意,該ptrace
調用很難正確使用;如果不能strace -e open
直接使用,可以考慮第二種方式:
open
對於大多數進程,您可以透過攔截對 C 庫函數的呼叫LD_PRELOAD
。這是瑣碎的然而,對於敵對的 C 程序來說,可以避免這種情況;但如果您相信程式本身不會執行系統調用,那麼它的實作比程式設計更簡單ptrace
。
對於您知道是用高級語言(例如 python)編寫的進程,您可以攔截高級open
調用,但這可能比攔截 C 級調用更困難,除非語言設計為支援這樣的攔截(python 不是)。
最後 - 以上所有段落均假設文件是用open
.這並不總是正確的,還有openat
、open64
、recvmsg
輔助資料以及從父級繼承的檔案描述符。