Как я могу отслеживать открытые файлы процесса в реальном времени?

42

Я знаю, что могу просматривать открытые файлы процесса, 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некоторых флагов, чтобы не видеть каждый системный вызов?

gertvdijk
источник

Ответы:

51

Запуск с

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 или «top» для проверки действий двоичного файла в режиме реального времени.
gertvdijk
Как бы вы хотели, чтобы это выглядело? Вероятно, можно превратить вывод strace в нечто более дружелюбное.
бесполезно
Вы определенно хотите использовать -oдля вывода результатов в файл (ы). Затем вы можете запустить tail -F strace.outputв другом терминале, чтобы получить «живое» обновление.
Петер
4
Вы также можете прикрепить straceк запущенному процессу с помощью -p PIDопции.
Фрэнк
Добавьте -yв «[p] пути rint, связанные с аргументами дескриптора файла»
Рикаб