Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 确定上次在Linux中修改文件的UID?_C_Linux_Inode - Fatal编程技术网

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

C 确定上次在Linux中修改文件的UID?,c,linux,inode,C,Linux,Inode,我正在写一个程序,将监测选择文件和目录的变化。有些文件是世界可写的,有些是所有者,有些是组 我需要做的是能够找出最后一个要修改的人,而不仅仅是访问一个文件。不知何故,我认为这很简单,因为我们知道文件的inode。。然而,我似乎找不到任何方法来获得这一点。我认为有一种实用的方法可以将任何给定的inode与上次访问它的uid关联起来 我想我已经挤压了谷歌在这个话题上给我带来的一切 感谢您的帮助。我正在用C写程序 编辑: 我需要能够做到这一点后,PID的任何程序修改的文件已经很久了 如果您使用的是2.

我正在写一个程序,将监测选择文件和目录的变化。有些文件是世界可写的,有些是所有者,有些是组

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

我想我已经挤压了谷歌在这个话题上给我带来的一切

感谢您的帮助。我正在用C写程序

编辑:


我需要能够做到这一点后,PID的任何程序修改的文件已经很久了

如果您使用的是2.6内核,那么可以利用内核的auditd守护进程。它可能会给你一些提示,告诉你如何完成你想做的事情。我确信有一个API可以在C中使用。

据我所知,这些信息不是由任何常见的文件系统存储的,但是您应该能够连接到哪些进程与哪些文件相接触并保持审计跟踪。

好的,使用普通的文件系统和旧的标准Linux,您将无法做到这一点。这些信息不会存储在任何地方,请参阅man lstat了解存储的内容

正如@pablo所建议的,您可以在启用安全审计的情况下执行此操作。他提到的链接是一个良好的开端,但其要点是:

打开审计守护进程,它从内核启用审计 您可以配置规则文件以捕获所需内容 您可以在审核文件中搜索所需的事件。 这里的困难在于,如果您开始审核所有文件的所有文件操作,审核将变得越来越大

那么您想要满足的实际需求是什么呢?

非常基本,但它可以: 你可以很容易地编写一个小c程序来做你想做的事情 此示例检索文件、目录或链接的UID, 只要试着找到你想要的属性

编译时使用:

gcc -x c my-prog.c -o my-prog
然后:

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

它不结实。但不管怎样,我知道如何使用它, 并在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;
}

我看不到从inotify获取修改过程的uid/gid/pid的任何方法?我只是修改了事件和路径。当内核调用您的代码时,您可以检查谁打开了文件,并将消息写入logAuditd,这将在一定程度上重复我正在做的事情,但代价更高。我正在编写的程序提供了可能入侵的近乎实时的通知。我正在获取auditd的源代码,以查看它如何与内核接口,我应该能够重用该代码。谢谢,我现在正在获取源代码以查看它如何与内核接口。您查找的信息不是直接存储的。但是,如果启用了审核,则审核跟踪可以显示最后一个进程及其AUID、EUID、RUID以写入文件。这是否真的改变了它还不得而知,但它可能已经改变了它。统计缓冲区的st_uid字段包含了文件的所有者,而不是最后一个修改它的用户的uid。Re:你的编辑,你所要求的是不可能的。是的,我知道。我只是想在编写更多代码之前进行检查,以便在访问文件后立即捕获pid。
# 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;
}