Узнайте, какой процесс изменяет файл

35

Я пытаюсь найти надежный способ узнать, какой процесс на моей машине меняет файл конфигурации ( /etc/hostsесли быть точным).

Я знаю, что могу использовать, lsof /etc/hostsчтобы узнать, какие процессы в данный момент открывают файл, но это не помогает, потому что процесс, очевидно, открывает файл, записывает в него, а затем закрывает его снова.

Я также посмотрел на lsofпараметр повтора (-r), но, похоже, он работает с такой скоростью, как раз в секунду, что, вероятно, никогда не отразит текущую запись.

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

robbles
источник

Ответы:

53

Вы можете использовать одитинг, чтобы найти это. Если он еще не доступен, установите и включите аудит для своего дистрибутива.

установить наблюдение за аудитом в / etc / hosts

/sbin/auditctl -w /etc/hosts -p war -k hosts-file

-w watch /etc/hosts
-p warx watch for write, attribute change, execute or read events
-k hosts-file is a search key.

Подождите, пока файл hosts не изменится, а затем используйте ausearch для просмотра того, что записано

/sbin/ausearch -f /etc/hosts | more

Вы получите массу продукции, например,


time-> Wed 12 окт. 09:34:07 2011 тип = PATH msg = аудит (1318408447.180: 870): item = 0 name = "/ etc / hosts" inode = 2211062 dev = fd: 00 mode = 0100644 ouid = 0 ogid = 0 rdev = 00: 00 obj = system_u: object_r: etc_t: s0 type = CWD msg = аудит (1318408447.180: 870): cwd = "/ home / iain" тип = SYSCALL msg = аудит (1318408447.180: 870): arch = c000003e syscall = 2 success = yes exit = 0 a0 = 7fff73641c4f a1 = 941 a2 = 1b6 a3 = 3e7075310c items = 1 ppid = 7259 pid = 7294 au id = 1001 uid = 0 gid = 0 euid = 0 suid = 0 fsuid = 0 egid = 0 sgid = 0 fsgid = 0 tty = pts0 ses = 123 comm = "touch" exe = "/ bin / touch" subj = user_u: не определено_t: s0 ключ = "hosts-файл"


В этом случае я использовал команду touch, чтобы изменить файлы. Timstamp: pid - 7294, ppid - 7259 (моя оболочка).

user9517 поддерживает GoFundMonica
источник
2
«Включить аудит для вашего дистрибутива», вероятно, следует немного расширить. Досадно, что приведенные выше команды не дали мне ни ошибок, ни результатов. «/ sbin / audctl -e 1» также не помогло. Выполнение аудита deamon для ведения журнала помогло - «/etc/init.d/auditd start» (хотя это и удалило мои правила, поэтому мне пришлось вводить их снова).
Tobixen
Не работает для меня, ausearchвсегда возвращается<no matches>
m0skit0
1
иногда вам может потребоваться установить несколько аудитов, чтобы получить фактический процесс, который инициировал модификацию, если этот процесс, например, вызывает внешнюю команду для выполнения работы за него. то есть я пытался выяснить, почему запись в crontab пользователя постоянно сбрасывается. Команда crontab была ответственна, но к тому времени, когда я проверил ppid, из которого она вышла, мне пришлось также провести аудит / usr / bin / crontab, затем сопоставить временную метку доступа к crontab с проверенным выполнением crontab и затем проверить это ppid ... который показал, что демон оркестровки принудительно вводил конкретную пользовательскую конфигурацию cron.
Уил
3

Вы также можете использовать inotify-tools:

  inotifywait -mq -e open -e modify /etc/hosts
Dragos
источник
14
Auditd может дать вам информацию, которую вы хотите. Даже если легко предположить, что inotify позволит вам это сделать, этого не произойдет, поскольку он не даст вам идентификатор процесса, который внес изменение.
объективировано
2

После долгих поисков я нашел решение, просто используйте эту команду: sudo fs_usage | grep [path_to_file]

treblam
источник
2
это только для MacOS ...
Majick