是否有可能找出创建给定文件的程序或脚本?


35

我的主目录中突然出现了三个文件,分别是“ client_state.xml”,“ lockfile”和“ time_stats_log”。最后两个为空。我想知道他们如何到达那里。这不是第一次,而是最后一次是几周前。我删除了文件,但没有损坏或抱怨。在报道的时候我还无法想起我在做什么stat $filename。我有什么办法可以找出它们的来源?

或者,是否可以监视主目录(但不监视子目录)的文件创建?


因为我敢肯定有人会提到它,所以我没有声音。
狼,

Answers:


18

我不相信有一种方法可以确定哪个程序创建了文件。

对于您的替代问题:您可以使用查看是否要重新创建文件inotifyinotifywaitinotify子系统的命令行界面;您可以告诉它create在主目录中查找事件:

$ (sleep 5; touch ~/making-a-test-file) &
[1] 22526

$ inotifywait -e create ~/
Setting up watches.
Watches established.
/home/mmrozek/ CREATE making-a-test-file

您可能想使用-m(monitor)运行它,它告诉它在看到第一个事件后不要退出


我如何获得inotify?它尚未安装(内核2.6.34),也没有安装/dev/inotify
狼”,

1
@Wolf什么发行版?如果您构建自己的内核,则为CONFIG_INOTIFY_USERFilesystems-> Inotify support for userspace)。inotifywait可能在一个名为inotify-tools
Michael Mrozek的包裹中

@Michael,它是openSUSE 11.3。我从未构建过内核。仅仅使用Linux大约5个月了,这是一个令人生畏的概念。但我会四处寻找教程或其他内容。
Wolf

@Wolf好吧,如果您所拥有的内核没有随附的话
dogbane

2
@Michael实际上,经过更多的搜寻和研究之后,我添加了一个社区存储库,事实证明它包含该inotify-tools程序包,因此现在有了inotifywait(和inotifywatch)。我对其进行了测试,它似乎可以正常工作。
狼”,

22

您可以通过LoggedFS访问文件系统,观察文件系统上发生的所有事情。这是一个堆叠的文件系统,它记录目录树中的每次访问。

loggedfs -l /var/tmp/$USER-home-fs.log ~

但是,记录整个主目录可能会降低系统速度。您至少要编写带有严格过滤器的配置文件

如果您具有root用户访问权限,则在Linux上,您可以使用审核子系统记录大量内容,包括文件系统访问权限。确保auditd守护程序已启动,然后配置要使用的日志auditctl。每个记录的操作都记录在/var/log/audit/audit.log(在典型分布中)。要开始观看特定文件:

auditctl -w /path/to/file

或长格式

auditctl -a exit,always -F path=/path/to/file

如果将监视放在目录中(带有-w-F dir=),则还将以递归方式监视其中的文件及其子目录。


BSD还通过“安全事件审核”支持此功能。freebsd.org/doc/en_US.ISO8859-1/books/handbook/audit.html
Shawn J. Goff

4

您可能需要看一下auditd,该软件包使您可以进行安全审核,并获得许多有关谁更改了文件系统中内容的信息。


如果您有一台服务器可以为多个用户提供外壳程序访问权限,并且需要为单个操作提供一定级别的责任性,则可以使用命令历史记录来构建某些外壳程序(例如bash和tcsh)。我在< timkennedy.net/2010/12/07/… >上写了一篇有关登录shell的博客文章。Shell日志记录不能代替真正的审核系统,因为它不会记录由非交互式Shell(例如脚本或程序)运行的命令。要获得这种粒度,您确实需要一个好的审核解决方案。
蒂姆·肯尼迪

1
@TimKennedy-您的博客文章不再出现。
slm

1
抱歉。网站遭到黑客入侵,并关闭了一段时间。新页面位于timkennedy.net/2010/12/logging-shell-commands-to-syslog-on.html
Tim Kennedy

3

我知道这是一个老问题,但是我建议另一种方法,以防万一有人觉得有用。我最初将其发布为对这个问题的回答。

一种选择是使用sysdig:开源系统监视应用程序。使用它,您可以按名称监视文件上的活动。假设您想查看什么进程正在创建名为的文件/tmp/example.txt

# sysdig fd.name=/tmp/example.txt
567335 16:18:39.654437223 0 touch (5470) < openat fd=3(<f>/tmp/example.txt) dirfd=-100(AT_FDCWD) name=/tmp/example.txt flags=70(O_NONBLOCK|O_CREAT|O_WRONLY) mode=0666
567336 16:18:39.654438248 0 touch (5470) > dup fd=3(<f>/tmp/example.txt)
567337 16:18:39.654438592 0 touch (5470) < dup res=0(<f>/tmp/example.txt)
567338 16:18:39.654439629 0 touch (5470) > close fd=3(<f>/tmp/example.txt)
567339 16:18:39.654439764 0 touch (5470) < close res=0
567342 16:18:39.654441958 0 touch (5470) > close fd=0(<f>/tmp/example.txt)
567343 16:18:39.654442111 0 touch (5470) < close res=0

从该输出中,您可以看到名为touchpid 5470 的进程打开了该文件。

如果需要更多信息,可以在“捕获模式”下运行,在该模式下收集系统调用跟踪:

# sysdig -w /tmp/dumpfile.scap

然后等待文件创建,然后停止sysdig并运行:

# csysdig -r /tmp/dumpfile.scap

这样您就可以探索发生的一切。您可以按<F2>并选择Files,按<F4>来搜索文件名,然后按<F6>来“挖掘”(这将显示与上述命令类似的输出)。这样,您就可以使用相同的方法来查找有关实际创建文件的过程的信息。

有一个GUI版本的csysdig称为sysdig-inspect,如果您喝的更多。


还是一个不断运行lsof的繁忙循环,试图查看进程是否正在/何时将文件写入该文件... unix.stackexchange.com/a/13782/8337
rogerdpack

2

您还没有,inotify所以您可以编写一个脚本来循环检查文件:

#!/bin/sh

while [ true ]; do                     # Run for as long as nessesary
  if [ -f /path/to/file ]; then        # If fileexists
    echo "Found file"                  # Notify and stop monitoring
    exit 0
  fi
  sleep 5                             # Else wait 5 secs
done

2
这不会显示是由哪个程序创建的
OverCoder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.