Puis-je rechercher l'historique de bash parmi tous les utilisateurs d'un serveur?

20

Je veux voir toutes les commandes bash qui ont été exécutées sur un serveur Linux sur plusieurs comptes d'utilisateurs. La distribution spécifique que j'utilise est CentOS 5.7. Existe-t-il un moyen de rechercher globalement des fichiers .bash_history sur un serveur ou serait-ce un processus plus domestique locate | cat | grep? (Je frissonne juste de taper ça).

Wesley
la source

Réponses:

25

Utilisez getentpour énumérer les répertoires personnels.

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

Si vos répertoires personnels se trouvent dans un emplacement bien connu, cela peut être aussi simple que

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

Bien sûr, si un utilisateur utilise un shell différent ou une valeur différente de HISTFILE, cela ne vous en dira pas beaucoup. Cela ne vous dira pas non plus sur les commandes qui n'ont pas été exécutées via un shell, ni sur les alias et les fonctions et les commandes externes désormais supprimées qui se trouvaient dans un répertoire utilisateur au début de l'utilisateur $PATH. Si vous voulez savoir quelles commandes les utilisateurs ont exécutées, vous avez besoin de la comptabilité des processus ou d'un système d'audit plus sophistiqué; voir Surveillance de l'activité sur mon ordinateur. , Comment vérifier la durée d'un processus après sa fin? .

Gilles 'SO- arrête d'être méchant'
la source
+1 pour suggérer la comptabilité des processus à la place. Les fichiers d'historique sont vraiment destinés à la commodité de l'utilisateur et il n'existe aucun moyen simple de les rendre suffisamment infaillibles pour tout type de journalisation.
jw013
@ jw013 Oui, je me suis déjà dit à quel point il était facile d'éditer / modifier et sinon de foutre en revue l'historique du shell. = |
Wesley
C'est une vieille question, mais c'était mon premier résultat google, donc ça vaut peut-être la peine d'être ajouté. J'ai modifié cela pour vérifier que le fichier existe avant d'essayer de le 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 Ignorer des fichiers inexistants est une bonne idée. Attention, la façon dont vous le faites est douteuse: cela devrait fonctionner dans la pratique étant donné que les noms d'utilisateur typiques ne contiennent pas de caractères "bizarres", mais en général, utiliser {}comme ça est très dangereux. Le nom du fichier est interpolé directement dans le script. Si vous avez un nom de fichier (ici: un nom d'utilisateur) contenant, disons, $(rm -rf /)ou ;rm -rf /;, la commande sera exécutée. Toujours passer des noms de fichiers comme arguments aux scripts shell, ne jamais utiliser le {}mécanisme de find ou xargs .
Gilles 'SO- arrête d'être méchant'
4
find /home -name .bash_history | xargs grep <string>

Alternativement:

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

Notez que cela couvre les répertoires personnels dans les emplacements par défaut. Il serait préférable d'analyser /etc/passwdou d'invoquer getent, et d'analyser la sortie de cela.

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

Vous pourriez faire

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

Mais je ne pense pas vraiment que ce soit beaucoup mieux que ce que vous pensiez.

brodie31k
la source