我在不同的地方安装了分散的文件和目录的程序。我必须手动删除这些文件和目录。我知道您可以删除用户创建的文件和目录,如下所示:
# find /home -user student -exec rm -rf {} \;
有没有办法通过指定要删除其文件和目录的程序的名称来对程序执行相同的操作?
答案1
正如汉斯·马丁·莫斯纳在回答中所说,没有存储任何信息来标识哪个程序创建或修改了特定文件或目录。
但是,您可以使用find
程序来查找内容可能创建或修改。您可以通过首先创建一个“时间戳文件”然后运行该程序来完成此操作。运行后,find
可能会要求根据与时间戳文件相关的时间戳来定位所有已修改的文件。
创建时间戳文件:
touch stamp
运行程序。
运行
find
以查找修改时间比时间戳文件更新的内容:find / -newer stamp
或者,如果您知道哪个用户应该拥有这些文件,
find / -user someuser -newer stamp
find
请注意,除非您可以将顶级搜索路径缩小/
到可能发生修改的特定子目录,否则该命令可能需要相当长的时间才能运行。另请注意,上述find
命令生成的任何路径名您运行的特定程序可能没有触及。自文件创建以来,任意数量的其他程序可能一直在运行stamp
,并且也可能创建或更改了文件。
答案2
如果您在运行程序之前知道,那么您可以将程序 set-gid 标记到一个特殊组。
也许您可以执行此操作并再次运行它,以查看它们放置的位置。
答案3
如果您可以让程序再次写入文件tracefile
也许可以帮助您:
tracefile -ue bash -c 'seq 10 | xargs -n1 touch'
https://gitlab.com/ole.tange/tangetools/-/tree/master/tracefile
答案4
如果您事先知道您想要关注程序执行的操作,例如内核接口或可以记录审计跟踪(或者可能sysdig
,但这会很慢,并且需要对要跟踪的程序进行完美的包装,并且希望没有运行过...)。您还需要考虑当其他程序在相关程序下创建输出时会发生什么:是否还必须跟踪任何子进程所做的事情?SystemTap
strace
sudo
perl -e 'qx(echo subshell-io > foo)'
对每个程序接触的每个文件(以及其他元数据,例如用户和组、父进程 pid 等)进行审计跟踪当然是可能的。然而,这可能是昂贵的设置、生成和维护成本。它可能需要某种过滤记录的方法来排除(一些,但可能不是全部)/tmp
目录写入,可能将多个写入passwd.tmp
/rename("passwd.tmp","passwd")
调用汇总到一个逻辑操作中,以及如何处理您感兴趣的程序修改的情况比如说/etc/passwd
(在许多其他可能的共享操作系统文件中)您可能不想在程序后清理时盲目删除...或者您如何处理程序使用 dbus 的委托 I/O,然后使用其他一些进程由于您的程序,dbus 上的一些随机非 I/O 消息确实会在其他地方生成 I/O...