Existem outras maneiras de registrar todos os comandos executados por um usuário. Com sysdig
instalado, pode-se executar algo como
# sysdig "user.name = jdoe and evt.type = execve"
para registrar todas as chamadas execve(2)
por jdoe
; a opção -p
para sysdig
pode personalizar o formato de saída, etc.
Outra maneira seria usar SystemTap
, que tem a vantagem de ser suportado pelo RedHat; aqui assumimos jdoe
tem um UID de 1000
;
probe begin {
printf("begin trace...\n\n")
}
probe syscall.execve.return {
if (uid() != 1000) next;
printf("runs %s[%d]: %s\n", execname(), pid(), cmdline_str());
}
isso pode ser executado por meio de algo como
# stap-prep
...
# stap whatyousavedtheaboveas.stp
Ambos os métodos provavelmente exigirão ajustes para capturar exatamente o que você precisa, lidar com condições de erro em que um execve
falha, etc. No lado positivo, sysdig
e SystemTap
são muito mais eficientes que strace
(run vmstat 1
e observe como strace
envia interrupções de contexto no telhado durante a execução).