Определить UID, который последний раз изменял файл в Linux?
Я пишу программу, которая будет контролировать выбранные файлы и каталоги на предмет изменений. Некоторые файлы доступны для записи всем пользователям, некоторые владельцы, некоторые группы.
Что мне нужно сделать, так это выяснить, кто последний изменил (а не только получил доступ) файл. Каким-то образом я подумал, что это будет просто, учитывая, что мы знаем индекс файла. Однако я не могу найти какой-либо способ получить это. Я думал, что есть практический способ соотнести любой данный индекс с идентификатором, который последний раз обращался к нему.
Я думаю, что я сжал Google для всего, что собирается дать мне по этой теме.
Любая помощь приветствуется. Я пишу программу на C.
Редактировать:
Я должен быть в состоянии сделать это после того, как PID какой-либо программы, модифицировавшей файл, давно исчез.
4 ответа
Если вы работаете с ядром 2.6, вы можете воспользоваться ядром audd для ядра. Проверьте этот URL. Это может дать вам подсказку о том, как выполнить то, что вы пытаетесь. Я уверен, что есть API, который вы могли бы использовать в C.
Насколько мне известно, эта информация не хранится ни в одной из общих файловых систем, но вы должны иметь возможность подключиться к inotify и вести контрольный журнал того, какие процессы касаются каких файлов.
Хорошо, используя обычный старый стандартный Linux с обычными файловыми системами, вы не сможете это сделать. Эта информация нигде не хранится (см. man lstat
за что хранится.)
Как подсказывает @pablo, вы можете сделать это с включенным аудитом безопасности. Ссылка, которую он отмечает, является хорошим началом, но суть в следующем:
- вы включаете демон аудита, который включает аудит из ядра
- вы настраиваете файл правил, чтобы захватить то, что вы хотите
- Вы ищите в файлах аудита нужные вам события.
Сложность в том, что если вы начнете проверять все файловые операции для всех файлов, аудит станет большим.
Так что на самом деле нужно, чтобы вы хотите, чтобы снимать?
Очень простой, но он работает: вы можете легко написать небольшую 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;
}