Posso effettuare ricerche nella cronologia di bash su tutti gli utenti su un server?


20

Voglio vedere tutti i comandi bash che sono stati eseguiti su un server Linux su più account utente. La distribuzione specifica che sto usando è CentOS 5.7. C'è un modo per cercare globalmente i file .bash_history su un server o sarebbe un processo più domestico locate | cat | grep? (Rabbrividisco solo digitandolo).

Risposte:


25

Utilizzare getentper enumerare le home directory.

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

Se le tue home directory sono in una posizione ben nota, potrebbe essere semplice come

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

Ovviamente, se un utente utilizza una shell diversa o un valore diverso di HISTFILE, questo non ti dirà molto. Né questo ti dirà dei comandi che non sono stati eseguiti tramite una shell, o degli alias e delle funzioni e dei comandi esterni ora rimossi che si trovavano in una directory utente all'inizio dell'utente $PATH. Se quello che vuoi sapere è quali comandi hanno eseguito gli utenti, hai bisogno della contabilità di processo o di un sistema di controllo più elaborato; vedi Attività di monitoraggio sul mio computer. , Come verificare per quanto tempo è terminato un processo dopo il completamento? .


+1 per suggerire invece la contabilità di processo. I file di cronologia sono davvero per comodità dell'utente e non ci sono modi semplici per renderli sufficientemente sicuri per qualsiasi tipo di registrazione.
jw013,

@ jw013 Sì, ho già avuto il pieno di quanto sia facile modificare / modificare e altrimenti confondere con la cronologia della shell. = |
Wesley,

Questa è una vecchia domanda, ma è stato il mio primo risultato su Google, quindi forse vale la pena aggiungere. Ho modificato questo per verificare che il file esista prima di provare a 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 È una buona idea ignorare i file inesistenti. Fai attenzione che il modo in cui lo fai è complicato: dovrebbe funzionare in pratica dato che i nomi utente tipici non contengono caratteri "strani", ma in generale l'utilizzo in {}questo modo è molto pericoloso. Il nome del file viene interpolato direttamente nello script. Se si dispone di un nome file (qui: un nome utente) contenente, diciamo, $(rm -rf /)o ;rm -rf /;, il comando verrà eseguito. Passa sempre i nomi dei file come argomenti agli script di shell, non usare mai il {}meccanismo find o xargs .
Gilles 'SO- smetti di essere malvagio' il

4
find /home -name .bash_history | xargs grep <string>

In alternativa:

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

Si noti che questo riguarda le home directory nelle posizioni predefinite. Sarebbe meglio analizzare /etc/passwdo invocare getente analizzare l'output di quello.

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

3

Si potrebbe fare

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

Ma non penso che sia molto meglio di quello che stavi pensando.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.