Определить UID, который последний раз изменял файл в Linux? - PullRequest
4 голосов
/ 18 марта 2009

Я пишу программу, которая будет отслеживать выбранные файлы и каталоги на предмет изменений. Некоторые файлы доступны для записи всем пользователям, некоторые владельцы, некоторые группы.

Что мне нужно сделать, так это выяснить, кто последний изменил (а не только получил доступ) файл. Каким-то образом я подумал, что это будет просто, учитывая, что мы знаем индекс файла. Однако я не могу найти какой-либо способ получить это. Я думал, что есть практический способ соотнести любой данный индекс с идентификатором, который последний раз обращался к нему.

Я думаю, что я сжал Google для всего, что собирается дать мне по теме.

Любая помощь приветствуется. Я пишу программу на C.

Edit:

Я должен быть в состоянии сделать это после того, как PID какой-либо программы, модифицировавшей файл, давно исчезнет.

Ответы [ 4 ]

5 голосов
/ 18 марта 2009

Если вы работаете с ядром 2.6, вы можете воспользоваться ядром audd для ядра. Проверьте этот URL . Это может дать вам подсказку о том, как выполнить то, что вы пытаетесь. Я уверен, что есть API, который вы могли бы использовать в C.

2 голосов
/ 18 марта 2009

Хорошо, используя обычный старый стандартный Linux с обычными файловыми системами, вы не сможете это сделать. Эта информация нигде не хранится (см. man lstat, для чего хранится ).

Как подсказывает @pablo, вы можете сделать это с включенным аудитом безопасности. Ссылка, которую он отмечает, является хорошим началом, но суть этого такова:

  • вы включаете демон аудита, который включает аудит из ядра
  • вы настраиваете файл правил для захвата того, что вы хотите
  • вы ищете в файлах аудита нужные вам события.

Сложность заключается в том, что если вы начнете проверять все файловые операции для всех файлов, аудит станет большим.

Так что же на самом деле вы хотите, чтобы заполнить?

2 голосов
/ 18 марта 2009

Насколько мне известно, эта информация не хранится ни в одной из распространенных файловых систем, но вы должны иметь возможность подключиться к inotify и вести учет того, какие процессы касаются каких файлов.

0 голосов
/ 19 мая 2010

очень простой, но работает: Вы можете легко написать небольшую C-программу, которая делает то, что вы хотите этот пример извлекает UID файла, каталога или ссылки, просто попробуйте найти свойства, которые вы хотите.

скомпилировать с:

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

, то:

./my-prog /etc

много другой информации можно получить вот так

это не надёжно. но что бы я ни знал, как это использовать, и сделайте проверку в оболочке bash: -)

[ -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;
}
...