如何实时监控某个进程打开的文件?

如何实时监控某个进程打开的文件?

我知道我可以使用查看进程的打开文件lsof 在那一刻在我的 Linux 机器上。然而,进程可以如此快速地打开、更改和关闭文件,以至于在使用标准 shell 脚本(例如 )监视它时我将无法看到它,watch如中所述“监控Linux上打开的进程文件(实时)”

因此,我想我正在寻找一种简单的方法来审核流程并查看它在一段时间内做了什么。如果还可以查看它(尝试)建立哪些网络连接并在流程有时间运行而不启动审核之前启动审核,那就太好了。

理想情况下,我想这样做:

sh $ audit-lsof /path/to/executable
4530.848254 OPEN  read  /etc/myconfig
4530.848260 OPEN  write /var/log/mylog.log
4540.345986 OPEN  read  /home/gert/.ssh/id_rsa          <-- suspicious
4540.650345 OPEN  socket TCP ::1:34895 -> 1.2.3.4:80    |
[...]
4541.023485 CLOSE       /home/gert/.ssh/id_rsa          <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80    |   this when polling

是否可以使用strace一些标志来不看到每个系统调用?

答案1

运行它

strace -e trace=open,openat,close,read,write,connect,accept your-command-here

可能就足够了。

-o如果进程可以打印到 stderr,则需要使用该选项将 strace 的输出放置在控制台以外的位置。如果您的进程分叉,您还需要-f-ff

哦,你可能-t也想要,所以你可以看到什么时候电话发生了。


请注意,您可能需要根据您的流程执行的操作调整函数调用列表 -getdents例如,我需要添加,以获得更好的示例,使用ls

$ strace -t -e trace=open,openat,close,read,getdents,write,connect,accept ls >/dev/null
...
09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3
09:34:48 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@V\0\0\0\0\0\0"..., 832) = 832
09:34:48 close(3)                       = 0
...
09:34:48 open("/proc/filesystems", O_RDONLY) = 3
09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366
09:34:48 read(3, "", 1024)              = 0
09:34:48 close(3)                       = 0
09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
09:34:48 getdents(3, /* 5 entries */, 32768) = 144
09:34:48 getdents(3, /* 0 entries */, 32768) = 0
09:34:48 close(3)                       = 0
09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21
09:34:48 close(1)                       = 0
09:34:48 close(2)                       = 0

相关内容