¿Puedo buscar el historial de bash en todos los usuarios de un servidor?

20

Quiero ver todos los comandos bash que se han ejecutado en un servidor Linux en varias cuentas de usuario. La distribución específica que estoy usando es CentOS 5.7. ¿Hay alguna manera de buscar globalmente archivos .bash_history en un servidor o sería un proceso más interno locate | cat | grep? (Me estremezco simplemente escribiendo eso).

Wesley
fuente

Respuestas:

25

Use getentpara enumerar los directorios de inicio.

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

Si sus directorios de inicio se encuentran en una ubicación conocida, podría ser tan simple como

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

Por supuesto, si un usuario usa un shell diferente o un valor diferente de HISTFILE, esto no le dirá mucho. Tampoco le informará sobre comandos que no se ejecutaron a través de un shell, o sobre alias y funciones y comandos externos ahora eliminados que estaban en algún directorio de usuario al principio del usuario $PATH. Si lo que quiere saber es qué comandos han ejecutado los usuarios, necesita una contabilidad de procesos o algún sistema de auditoría más sofisticado; ver Monitoreo de actividad en mi computadora. , ¿Cómo verificar cuánto tiempo se ejecutó un proceso después de que terminó? .

Gilles 'SO- deja de ser malvado'
fuente
+1 por sugerir la contabilidad de procesos en su lugar. Los archivos de historial son realmente para conveniencia del usuario y no hay formas simples de hacerlos lo suficientemente infalibles para cualquier tipo de registro.
jw013
@ jw013 Sí, ya me harté de lo fácil que es editar / modificar y, de lo contrario, arruinar el historial de shell. = |
Wesley
Esta es una vieja pregunta, pero fue mi primer resultado de Google, por lo que quizás valga la pena agregarla. Modifiqué esto para verificar que el archivo existe antes de intentar grep: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 archivos inexistentes es una buena idea. Tenga en cuenta que la forma en que lo está haciendo es poco fiable: debería funcionar en la práctica, dado que los nombres de usuario típicos no contienen caracteres "extraños", pero en general el uso de {}este tipo es muy peligroso. El nombre del archivo se interpola directamente en el script. Si tiene un nombre de archivo (aquí: un nombre de usuario) que contiene, digamos, $(rm -rf /)o ;rm -rf /;, el comando se ejecutará. Siempre pase los nombres de los archivos como argumentos a los scripts de shell, nunca use el {}mecanismo find o xargs .
Gilles 'SO- deja de ser malvado'
4
find /home -name .bash_history | xargs grep <string>

Alternativamente:

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

Tenga en cuenta que esto cubre los directorios principales en ubicaciones predeterminadas. Sería mejor analizar /etc/passwdo invocar getent, y analizar el resultado de eso.

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

Podrías hacerlo

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

Pero realmente no creo que sea mucho mejor de lo que estabas pensando.

brodie31k
fuente