Kann ich den Bash-Verlauf für alle Benutzer auf einem Server durchsuchen?

20

Ich möchte alle Bash-Befehle anzeigen, die auf einem Linux-Server über mehrere Benutzerkonten ausgeführt wurden. Die von mir verwendete Distribution ist CentOS 5.7. Gibt es eine Möglichkeit, .bash_history-Dateien auf einem Server global zu durchsuchen, oder handelt es sich um einen eigenentwickelten Prozess locate | cat | grep? (Ich schaudere, wenn ich das schreibe).

Wesley
quelle

Antworten:

25

Verwenden Sie getentdiese Option, um die Basisverzeichnisse aufzulisten.

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

Wenn sich Ihre privaten Verzeichnisse an einem bekannten Ort befinden, ist dies möglicherweise ganz einfach

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

Wenn ein Benutzer eine andere Shell oder einen anderen Wert von verwendet HISTFILE, sagt Ihnen dies natürlich nicht viel. Hier erfahren Sie auch nichts über Befehle, die nicht über eine Shell ausgeführt wurden, oder über Aliase und Funktionen und jetzt entfernte externe Befehle, die sich zu Beginn des Benutzers in einem Benutzerverzeichnis befanden $PATH. Wenn Sie wissen möchten, welche Befehle Benutzer ausgeführt haben, benötigen Sie eine Prozessabrechnung oder ein höherwertiges Prüfsystem. Siehe Überwachen der Aktivität auf meinem Computer. , Wie überprüfe ich, wie lange ein Prozess nach seiner Beendigung lief? .

Gilles 'SO - hör auf böse zu sein'
quelle
+1 für das Vorschlagen der Prozessabrechnung. Verlaufsdateien sind wirklich benutzerfreundlich und es gibt keine einfachen Möglichkeiten, sie für Protokollierungszwecke narrensicher genug zu machen.
Jw013
@ jw013 Ja, ich hatte schon genug davon, wie einfach es ist, Shell-History zu bearbeiten / zu modifizieren und ansonsten zu verarschen. = |
Wesley
Dies ist eine alte Frage, aber es war mein erstes Google-Ergebnis. Ich habe dies geändert, um zu überprüfen, ob die Datei vorhanden ist, bevor ich versuche, sie zu prüfen: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 Nicht vorhandene Dateien zu ignorieren ist eine gute Idee. Beachten Sie, dass die Art und Weise, wie Sie es tun, zweifelhaft ist: Es sollte in der Praxis funktionieren, da typische Benutzernamen keine „seltsamen“ Zeichen enthalten, aber im Allgemeinen ist die Verwendung {}dieser Zeichen sehr gefährlich. Der Dateiname wird direkt im Skript interpoliert. Wenn Sie einen Dateinamen (hier: einen Benutzernamen) haben, der beispielsweise $(rm -rf /)oder enthält ;rm -rf /;, wird der Befehl ausgeführt. Übergeben Sie Dateinamen immer als Argumente an Shell-Skripte, verwenden Sie niemals den {}Mechanismus von find oder xargs .
Gilles 'SO- hör auf böse zu sein'
4
find /home -name .bash_history | xargs grep <string>

Alternative:

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

Beachten Sie, dass dies Basisverzeichnisse in Standardverzeichnissen abdeckt. Es wäre besser, zu analysieren /etc/passwdoder aufzurufen getentund die Ausgabe davon zu analysieren .

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

Du könntest es tun

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

Aber ich denke nicht wirklich, dass das viel besser ist, als Sie dachten.

brodie31k
quelle