Como monitoro os arquivos abertos de um processo em tempo real?

41

Eu sei que posso visualizar os arquivos abertos de um processo usando lsof naquele momento na minha máquina Linux. No entanto, um processo pode abrir, alterar e fechar um arquivo tão rapidamente que não poderei vê-lo ao monitorá-lo usando scripts de shell padrão (por exemplo, watchcomo explicado em "monitorar arquivos de processos abertos no linux (tempo real)" .

Então, acho que estou procurando uma maneira simples de auditar um processo e ver o que ele fez ao longo do tempo. Seria ótimo se também fosse possível ver quais conexões de rede (tentou) fazer e iniciar a auditoria antes que o processo tivesse tempo de executar sem que a auditoria fosse iniciada.

Idealmente, eu gostaria de fazer isso:

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

Isso seria possível usando stracealguns sinalizadores para não ver todas as chamadas do sistema?

gertvdijk
fonte

Respostas:

50

Executando com

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

provavelmente seria suficiente.

Você precisará usar a -oopção para colocar a saída do strace em outro lugar que não o console, se o processo puder ser impresso em stderr. Se o seu processo bifurcar, você também precisará de -fou -ff.

Ah, e você pode querer -ttambém, para poder ver quando as chamadas aconteceram.


Observe que você pode precisar ajustar a lista de chamadas de função, dependendo do que o seu processo faz - eu precisei adicionar, getdentspor exemplo, para obter uma amostra melhor 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
Sem utilidade
fonte
11
Isso está indo na direção certa, obrigado! Gostaria de uma saída mais amigável, mas faz o trabalho. Talvez eu tenha tempo para escrever uma ferramenta com uma interface mais sofisticada para isso. Eu esperava que houvesse uma ferramenta baseada em ncurses ou 'top' para inspecionar as ações do binário em tempo real.
gertvdijk
Como você gostaria que fosse? Provavelmente é possível transformar a saída do strace em algo mais amigável.
inútil
você definitivamente deseja usar -opara enviar a saída para o (s) arquivo (s). Em seguida, você pode executar tail -F strace.outputem outro terminal para obter a atualização "ao vivo".
Peterph
4
Você também pode se conectar stracea um processo em execução com a -p PIDopção
18717 Frank Breitling
Adicionar -ya "[p] caminhos associados aos argumentos do descritor de arquivo"
ricab em 23/08