有什么方法可以准确判断命令正在访问哪些文件?

有什么方法可以准确判断命令正在访问哪些文件?

我正在开发一款软件,它要求我知道任何特定启动的进程正在访问哪些文件和资源。

我不打算尝试跟踪每个脚本、应用程序和守护程序正在访问的内容,而只是跟踪用户提供的某个进程。

有没有办法用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辅助数据以及从父级继承的文件描述符。

相关内容