Czy mogę przeszukiwać historię bash wszystkich użytkowników na serwerze?

20

Chcę zobaczyć wszystkie polecenia bash, które zostały uruchomione na serwerze Linux na wielu kontach użytkowników. Konkretna dystrybucja, której używam, to CentOS 5.7. Czy istnieje sposób globalnego wyszukiwania plików .bash_history na serwerze, czy byłby to proces bardziej domowy locate | cat | grep? (Wzdrygam się, kiedy to piszę).

Wesley
źródło

Odpowiedzi:

25

Służy getentdo wyliczania katalogów domowych.

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

Jeśli Twoje katalogi domowe znajdują się w znanej lokalizacji, może to być tak proste

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

Oczywiście, jeśli użytkownik używa innej powłoki lub innej wartości HISTFILE, to niewiele ci powie. Nie powie ci to również o poleceniach, które nie zostały wykonane przez powłokę, ani o aliasach i funkcjach oraz teraz usuniętych poleceniach zewnętrznych, które były w jakimś katalogu użytkownika na początku użytkownika $PATH. Jeśli chcesz wiedzieć, jakie polecenia wykonali użytkownicy, potrzebujesz rozliczania procesów lub bardziej zaawansowanego systemu kontroli; zobacz Monitorowanie aktywności na moim komputerze. , Jak sprawdzić, jak długo proces trwał po jego zakończeniu? .

Gilles „SO- przestań być zły”
źródło
+1 za sugerowanie zamiast tego procesu rozliczania. Pliki historii są naprawdę dla wygody użytkownika i nie ma prostych sposobów, aby uczynić je wystarczająco odpornymi na wszelkiego rodzaju rejestrowanie.
jw013,
@ jw013 Tak, miałem już dość tego, jak łatwo jest edytować / modyfikować i w inny sposób zmieniać historię powłoki. = |
Wesley,
To stare pytanie, ale to był mój pierwszy wynik w Google, więc może warto do niego dodać. Zmodyfikowałem to, aby sprawdzić, czy plik istnieje, zanim 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"
spróbuję
1
@BryKKan Ignorowanie nieistniejących plików jest dobrym pomysłem. Uwaga: sposób, w jaki to robisz, jest podejrzany: powinien działać w praktyce, biorąc pod uwagę, że typowe nazwy użytkowników nie zawierają „dziwnych” znaków, ale generalnie {}takie używanie jest bardzo niebezpieczne. Nazwa pliku jest interpolowana bezpośrednio w skrypcie. Jeśli masz nazwę pliku (tutaj: nazwę użytkownika) zawierającą, powiedzmy, $(rm -rf /)lub ;rm -rf /;, polecenie zostanie wykonane. Zawsze przesyłaj nazwy plików jako argumenty do skryptów powłoki, nigdy nie używaj {}mechanizmu find ani xargs .
Gilles „SO- przestań być zły”
4
find /home -name .bash_history | xargs grep <string>

Alternatywnie:

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

Pamiętaj, że dotyczy to katalogów domowych w domyślnych lokalizacjach. Lepiej byłoby parsować /etc/passwdlub wywoływać getenti analizować wynik tego.

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

Mógłbyś

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

Ale tak naprawdę nie sądzę, że jest to o wiele lepsze niż to, co myślałeś.

brodie31k
źródło