Як я можу відстежувати відкриті файли процесу в режимі реального часу?


41

Я знаю, що можу переглядати відкриті файли процесу, використовуючи lsof в цей момент час на моїй машині Linux. Однак процес може відкривати, змінювати та закривати файл настільки швидко, що я не зможу його побачити під час моніторингу за допомогою стандартного сценарію оболонки (наприклад watch), як це пояснено у "моніторі відкритих файлів процесів у Linux (у режимі реального часу)" .

Отже, я думаю, що я шукаю простий спосіб аудиту процесу і бачу, що він зробив за минулий час. Було б чудово, якби також можна було побачити, які мережеві з'єднання це (спробувало) здійснити, і запустити аудит до того, як процес отримав час для запуску без проведення аудиту.

В ідеалі я хотів би зробити це:

sh $ audit-lsof /path/to/executable
4530.848254 OPEN  read  /etc/myconfig
4530.848260 OPEN  write /var/log/mylog.log
4540.345986 OPEN  read  /home/gert/.ssh/id_rsa          <-- suspicious
4540.650345 OPEN  socket TCP ::1:34895 -> 1.2.3.4:80    |
[...]
4541.023485 CLOSE       /home/gert/.ssh/id_rsa          <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80    |   this when polling

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


Відповіді:


50

Запустивши його

strace -e trace=open,close,read,write,connect,accept your-command-here

певно, було б достатньо

Вам потрібно буде скористатися -oопцією, щоб розмістити висновок strace де-небудь, крім консолі, якщо процес може надрукувати на stderr. Якщо ваш процес вилки, вам також знадобиться -fабо -ff.

О, і ви можете також захотіти -t, щоб ви могли бачити, коли відбувалися дзвінки.


Зауважте, вам може знадобитися налаштувати список викликів функцій залежно від того, що робить ваш процес - мені потрібно було додати, getdentsнаприклад, щоб отримати кращу вибірку, використовуючи ls:

$ strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null
...
09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3
09:34:48 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@V\0\0\0\0\0\0"..., 832) = 832
09:34:48 close(3)                       = 0
...
09:34:48 open("/proc/filesystems", O_RDONLY) = 3
09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366
09:34:48 read(3, "", 1024)              = 0
09:34:48 close(3)                       = 0
09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
09:34:48 getdents(3, /* 5 entries */, 32768) = 144
09:34:48 getdents(3, /* 0 entries */, 32768) = 0
09:34:48 close(3)                       = 0
09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21
09:34:48 close(1)                       = 0
09:34:48 close(2)                       = 0

1
Це в правильному напрямку, дякую! Хочеться більш дружнього користувача, але це робить свою роботу. Я можу зайняти час, щоб написати інструмент із більш подібним інтерфейсом для цього. Я сподівався, що в реальному часі буде створений інструмент, заснований на ncurses, або "топ-подібний", щоб перевірити дії бінарних файлів.
gertvdijk

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

ви напевно хочете використовувати -oдля проштовхування виводу у файл (и). Тоді ви можете запустити tail -F strace.outputв інший термінал, щоб отримати "live" оновлення.
петерф

4
Ви також можете приєднати straceдо запущеного процесу за допомогою -p PIDпараметра.
Френк Брейтінг

Додайте -yдо "[p] шляху до
rint,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.