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ę).
źródło
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"
{}
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 .Alternatywnie:
Pamiętaj, że dotyczy to katalogów domowych w domyślnych lokalizacjach. Lepiej byłoby parsować
/etc/passwd
lub wywoływaćgetent
i analizować wynik tego.źródło
Mógłbyś
Ale tak naprawdę nie sądzę, że jest to o wiele lepsze niż to, co myślałeś.
źródło