我正在开发一款软件,它要求我知道任何特定启动的进程正在访问哪些文件和资源。
我不打算尝试跟踪每个脚本、应用程序和守护程序正在访问的内容,而只是跟踪用户提供的某个进程。
有没有办法用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
辅助数据以及从父级继承的文件描述符。