Чи можна дізнатися, яка програма чи сценарій створили заданий файл?


35

У моєму домашньому каталозі раптово з’явилися три файли, які називаються «client_state.xml», «lockfile» та «time_stats_log». Останні два порожні. Мені цікаво, як вони туди потрапили. Це вже не вперше, але останній раз було тижні тому; Я видалив файли, і нічого не зламалось і не скаржилося. Я не міг подумати, що я робив у той час, про який повідомляв stat $filename. Чи є якийсь спосіб я дізнатися, звідки вони взялися?

Як варіант, чи існує спосіб відстеження домашнього каталогу (але не підкаталогів) на створення файлів?


Оскільки я впевнений, що хтось це згадає, я не ініціюю.
Вовк

Відповіді:


18

Я не вірю, що існує спосіб визначити, яка програма створила файл.

Для вашого альтернативного запитання: Ви можете спостерігати за тим, як файл буде відтворено, використовуючи inotify. inotifywait- інтерфейс командного рядка для inotifyпідсистеми; ви можете сказати йому, щоб шукати createподії у вашому домашньому каталозі:

$ (sleep 5; touch ~/making-a-test-file) &
[1] 22526

$ inotifywait -e create ~/
Setting up watches.
Watches established.
/home/mmrozek/ CREATE making-a-test-file

Ймовірно, ви хочете запустити його -m(монітор), який вказує йому не виходити після того, як він побачить першу подію


Як мені дістатись inotify? Він не встановлений (ядро 2.6.34) і немає /dev/inotify.
Вовк

1
@Wolf Який дистрибутив? Якщо ви будуєте власне ядро, це CONFIG_INOTIFY_USER( Filesystems-> Inotify support for userspace). inotifywaitймовірно, в пакеті з назвою щось на кшталтinotify-tools
Майкл Мрозек

@Michael, це openSUSE 11.3. Я ніколи не будував ядро; використовували Linux лише близько 5 місяців, і це трохи пристрасна концепція. Але я огляну підручник чи щось таке.
Вовк

@Wolf Ну, відповідь dogbane може бути простішою, якщо ядро ​​у вас з цим не вийшло
Michael Mrozek

2
@Michael Насправді, після трохи більше охоти та досліджень, я додав сховище спільноти, яке, виявляється, містить inotify-toolsпакунок, так що тепер у мене є inotifywaitinotifywatch). Я перевірив це і, здається, працює.
Вовк

22

Ви можете дивитися все, що відбувається у файловій системі, отримуючи доступ до неї через LoggedFS . Це складена файлова система, яка записує кожен доступ у дерево каталогів.

loggedfs -l /var/tmp/$USER-home-fs.log ~

Реєстрація всього домашнього каталогу, можливо, сповільнить вашу систему. Ви хоч хочете написати а конфігураційний файл із суворими фільтрами.

Якщо у вас є кореневий доступ, в Linux ви можете використовувати підсистему аудиту для реєстрації великої кількості речей, включаючи доступ до файлової системи. Переконайтеся, що auditdдемон запущений, а потім налаштуйте те, з чим ви хочете увійти auditctl. Кожна зареєстрована операція записується в /var/log/audit/audit.log(у типових дистрибутивах). Щоб почати перегляд певного файлу:

auditctl -w /path/to/file

або в довгій формі

auditctl -a exit,always -F path=/path/to/file

Якщо ви помістите годинник на каталог (з -wабо -F dir=), рекурсивно також переглядаються файли в ньому та його підкаталогах.


BSD також підтримує це за допомогою аудиту подій безпеки. freebsd.org/doc/en_US.ISO8859-1/books/handbook/audit.html
Шон Дж. Гофф

4

Можливо, ви захочете поглянути auditd, цей пакет дозволяє зробити аудит безпеки та отримати багато інформації про те, хто змінив те, що у файловій системі.


якщо у вас є сервер, який забезпечує доступ до оболонки для декількох користувачів, і вам потрібно забезпечити певний рівень підзвітності за окремі дії, ви можете створити певні оболонки (наприклад, bash та tcsh) з журналом історії команд. Я написав повідомлення в блозі про вхід в оболонки на < timkennedy.net/2010/12/07/… >. Реєстрація оболонок не є заміною справжньої системи аудиту, оскільки вона не записує команди, керовані неінтерактивними оболонками (як-от сценарії чи програми). Для отримання такого роду детальності вам справді потрібне хороше аудиторське рішення.
Тім Кеннеді

1
@TimKennedy - ваша публікація в блозі більше не з’являється.
slm

1
Вибачте. сайт зламали, і деякий час був вниз. нова сторінка знаходиться на сайті timkennedy.net/2010/12/logging-shell-commands-to-syslog-on.html
Тім Кеннеді

3

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

Одним із варіантів є використання sysdig: додаток для моніторингу з відкритим кодом. Використовуючи його, ви можете відстежувати активність у файлі за назвою. Припустимо, ви хотіли подивитися, який процес створював файл з назвою /tmp/example.txt:

# sysdig fd.name=/tmp/example.txt
567335 16:18:39.654437223 0 touch (5470) < openat fd=3(<f>/tmp/example.txt) dirfd=-100(AT_FDCWD) name=/tmp/example.txt flags=70(O_NONBLOCK|O_CREAT|O_WRONLY) mode=0666
567336 16:18:39.654438248 0 touch (5470) > dup fd=3(<f>/tmp/example.txt)
567337 16:18:39.654438592 0 touch (5470) < dup res=0(<f>/tmp/example.txt)
567338 16:18:39.654439629 0 touch (5470) > close fd=3(<f>/tmp/example.txt)
567339 16:18:39.654439764 0 touch (5470) < close res=0
567342 16:18:39.654441958 0 touch (5470) > close fd=0(<f>/tmp/example.txt)
567343 16:18:39.654442111 0 touch (5470) < close res=0

З цього виводу видно, що процес, названий touchpid 5470, відкрив файл.

Якщо ви хочете отримати додаткову інформацію, ви можете запустити в «режимі захоплення», де збирається системний слід виклику:

# sysdig -w /tmp/dumpfile.scap

Потім зачекайте, коли файл буде створений, а потім зупиніться sysdigта запустіть:

# csysdig -r /tmp/dumpfile.scap

Це дозволить вивчити все, що сталося. Ви можете натиснути <F2>і вибрати Files, натисніть <F4>для пошуку імені файлу, а потім натисніть <F6>на "копати" (що покаже вам вихід аналогічний команді, наведеній вище). З цим ви можете використовувати той же підхід, щоб знайти інформацію про процес, який фактично створив файл.

Існує версія GUI з csysdigназвою sysdig-inspect, якщо це більше ваша чашка чаю.


або, можливо, зайнятий цикл, який постійно працює lsof, намагаючись зрозуміти, чи / коли процес записує у цей файл ... unix.stackexchange.com/a/13782/8337
rogerdpack

2

У вас немає, inotifyщоб ви могли написати сценарій, який перевіряє файл у циклі:

#!/bin/sh

while [ true ]; do                     # Run for as long as nessesary
  if [ -f /path/to/file ]; then        # If fileexists
    echo "Found file"                  # Notify and stop monitoring
    exit 0
  fi
  sleep 5                             # Else wait 5 secs
done

2
Це не показує, яку програму створив
OverCoder
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.