¿Cómo monitorizo ​​los archivos abiertos de un proceso en tiempo real?

42

Sé que puedo ver los archivos abiertos de un proceso usando lsof en ese momento en mi máquina Linux. Sin embargo, un proceso puede abrir, alterar y cerrar un archivo tan rápido que no podré verlo al monitorearlo utilizando scripts de shell estándar (por ejemplo watch) como se explica en "monitorear archivos de proceso abiertos en Linux (en tiempo real)" .

Entonces, creo que estoy buscando una forma simple de auditar un proceso y ver qué ha hecho con el tiempo. Sería genial si también es posible ver qué conexiones de red hizo (intentó) y hacer que la auditoría comience antes de que el proceso tenga tiempo de ejecutarse sin que se inicie la auditoría.

Idealmente, me gustaría hacer esto:

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

¿Sería esto posible usar stracealgunas banderas para no ver todas las llamadas al sistema?

gertvdijk
fuente

Respuestas:

51

Ejecutándolo con

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

probablemente sería suficiente

Deberá usar la -oopción para colocar la salida de strace en otro lugar que no sea la consola, si el proceso puede imprimir en stderr. Si su proceso se bifurca, también necesitará -fo -ff.

Ah, y es posible que también desee -t, para que pueda ver cuándo ocurrieron las llamadas.


Tenga en cuenta que es posible que deba modificar la lista de llamadas de función según lo que haga su proceso; necesitaba agregar, getdentspor ejemplo, para obtener una mejor muestra usando 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
Inútil
fuente
1
Eso está yendo en la dirección correcta, ¡gracias! Quisiera una salida más amigable para el usuario, pero hace el trabajo. Podría tomarme el tiempo para escribir una herramienta con una interfaz más superior para esto. Esperaba que existiera una herramienta basada en ncurses o 'top' para inspeccionar las acciones del binario en tiempo real.
gertvdijk
¿Cómo te gustaría que se vea? Probablemente sea posible combinar la salida de strace en algo más amigable.
Inútil
definitivamente desea usar -opara enviar la salida a los archivos. Luego puede ejecutar tail -F strace.outputen otra terminal para obtener la actualización "en vivo".
Peter
44
También puede adjuntar stracea un proceso en ejecución con la -p PIDopción.
Frank Breitling
Agregar -ya "[p] rutas de rint asociadas con argumentos de descriptor de archivo"
ricab