Posso pesquisar o histórico do bash em todos os usuários em um servidor?

20

Eu quero ver todos os comandos bash que foram executados em um servidor Linux em várias contas de usuário. A distribuição específica que estou usando é o CentOS 5.7. Existe uma maneira de pesquisar globalmente arquivos .bash_history em um servidor ou seria um processo mais caseiro locate | cat | grep? (Estremeço apenas digitando isso).

Wesley
fonte

Respostas:

25

Use getentpara enumerar os diretórios pessoais.

getent passwd |
cut -d : -f 6 |
sed 's:$:/.bash_history:' |
xargs -d '\n' grep -s -H -e "$pattern" 

Se os diretórios pessoais estiverem em um local conhecido, pode ser tão simples quanto

grep -e "$pattern" /home/*/.bash_history

Obviamente, se um usuário usar um shell diferente ou um valor diferente de HISTFILE, isso não lhe dirá muito. Isso também não informa sobre comandos que não foram executados por meio de um shell, ou sobre aliases e funções e comandos externos agora removidos que estavam em algum diretório do usuário no início do usuário $PATH. Se o que você quer saber é quais comandos os usuários executaram, você precisa da contabilidade de processos ou de algum sistema de auditoria mais sofisticado; consulte Monitorando atividades no meu computador. , Como verificar por quanto tempo um processo foi executado após a conclusão? .

Gilles 'SO- parar de ser mau'
fonte
+1 por sugerir contabilidade do processo. Os arquivos de histórico são realmente para conveniência do usuário e não há maneiras simples de torná-los à prova de idiotas o suficiente para qualquer tipo de registro.
Jw013
@ jw013 Sim, eu já tive a idéia de como é fácil editar / modificar e, de outra forma, mexer com o histórico do shell. = |
21412 Wesley
Esta é uma pergunta antiga, mas foi o meu primeiro resultado no Google, então talvez valha a pena adicionar. Eu modifiquei este para verificar se o arquivo existe antes de tentar grep-lo:getent passwd | cut -d : -f 6 | sed "s:$:/.bash_history:" | xargs -d'\n' -I{} sh -c "[ -f {} ] && echo {}" | xargs -d'\n' grep -Hn -e "$pattern"
BryKKan
1
@BryKKan Ignorar arquivos inexistentes é uma boa ideia. Lembre-se de que a maneira como você está fazendo isso é desonesta: deve funcionar na prática, uma vez que os nomes de usuário típicos não contêm caracteres "estranhos", mas, em geral, o uso {}assim é muito perigoso. O nome do arquivo é interpolado diretamente no script. Se você tiver um nome de arquivo (aqui: um nome de usuário) contendo, digamos, $(rm -rf /)ou ;rm -rf /;, o comando será executado. Sempre passe nomes de arquivos como argumentos para scripts de shell, nunca use o {}mecanismo find ou xargs .
Gilles 'SO- stop be evil'
4
find /home -name .bash_history | xargs grep <string>

Alternativamente:

grep string $(find /home -name .bash_history)

Observe que isso abrange os diretórios pessoais nos locais padrão. Seria melhor analisar /etc/passwdou invocar getente analisar a saída disso.

for i in $(getent passwd | cut -d: -f6 ); do grep string ${i}/.bash_history; done
Devdas
fonte
3

Você poderia fazer

find /home | grep bash_history | xargs grep "whatever"

Mas eu realmente não acho que isso seja muito melhor do que você estava pensando.

brodie31k
fonte