确定上次在Linux中修改文件的UID?

时间:2009-03-18 03:24:29

标签: c linux inode

我正在编写一个程序,它将监视选择文件和目录以进行更改。一些文件是世界可写的,一些是所有者,一些是组。

我需要做的是能够找出最后一个修改(而不仅仅是访问)文件的人。不知怎的,我认为这很简单,因为我们知道文件的inode ..但是我似乎无法找到任何获得此方法的方法。我认为有一种实用的方法可以将任何给定的inode与最后访问它的uid相关联。

我认为我已经挤压谷歌所有它会给我这个话题。

感谢任何帮助。我正在用C语言编写程序。

修改

我需要能够在修改文件的任何程序的PID很久之后才能执行此操作。

4 个答案:

答案 0 :(得分:5)

如果您使用的是2.6内核,则可以利用内核的auditd守护程序。 Check this URL out。它可能会给你一些关于如何完成你想要的东西的提示。我确信你可以在C中使用一个API。

答案 1 :(得分:2)

据我所知,这些信息不是由任何常见的文件系统存储的,但您应该能够挂钩inotify并保留审核跟踪哪些进程触及哪些文件。

答案 2 :(得分:2)

好的,使用普通文件系统的旧标准Linux,你将无法做到这一点。该信息不会存储在任何地方(有关 存储的内容,请参阅man lstat。)

正如@pablo建议的那样,可以在启用安全审核时执行此操作。他指出的链接是一个良好的开端,但它的主旨是:

  • 启用审计守护程序,从而启用内核审计
  • 您配置规则文件以捕获您想要的内容
  • 您在审核文件中搜索所需的事件。

这里的困难在于,如果您开始审核所有文件的所有文件操作,审计将会变得很大。

那么您想要填充的实际需求是什么?

答案 3 :(得分:-4)

非常基本,但它有效: 你可以轻松地编写一个可以完成你想要的小程序 此示例检索文件或目录或链接的UID, 只是尝试找到你想要的属性。

编译:

gcc -x c my-prog.c -o my-prog

然后:

./my-prog /etc

可以像这样获得许多其他信息

它不健壮。但无论如何,我知道如何使用它,  并在bash shell中进行检查: - )

[ -x /etc ] && my-prog /etc

源代码:

# retrieve the uid of a file
# source code: my-prog.c
#
#include <stdio.h> 
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char **argv) {
  struct stat buffer;
  int status;
  char *fname;
  fname=argv[1];
  status = stat(fname, &buffer);
  printf("%i",buffer.st_uid);
  return 0;
}