Чи можна шукати історію bash у всіх користувачів на сервері?


20

Я хочу побачити всі команди bash, які виконувалися на сервері Linux через декілька облікових записів користувачів. Я використовую конкретний дистрибутив CentOS 5.7. Чи є спосіб глобально шукати файли .bash_history на сервері чи це був би більш домашній процес locate | cat | grep? (Я здригаюся, просто набравши це).

Відповіді:


25

Використовуйте getentдля перерахування домашніх каталогів.

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

Якщо ваші домашні каталоги знаходяться у відомому місці, це може бути так само просто

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

Звичайно, якщо користувач використовує іншу оболонку або інше значення HISTFILE, це не дасть вам великого значення. Це також не розповість вам про команди, які не виконувалися через оболонку, або про псевдоніми та функції та видалені тепер зовнішні команди, які були в деякому каталозі користувачів на початку користувача $PATH. Якщо ви хочете дізнатися, які команди виконували користувачі, вам потрібен облік процесів або якась більш фантазійна система аудиту; див. Моніторинг активності на моєму комп’ютері. , Як перевірити, як довго тривав процес після його закінчення? .


+1 замість цього запропонувати облік процесу. Файли історії дійсно для зручності користувачів, і не існує простих способів зробити їх досить нерозумними для будь-яких цілей ведення журналу.
jw013

@ jw013 Так, у мене вже було заповнено, як легко редагувати / змінювати та іншим чином виправляти історію оболонок. = |
Веслі

Це старе питання, але це був мій перший результат в Google, тому, можливо, варто додати його. Я змінив це, щоб перевірити, чи існує файл, перш ніж намагатись отримати його: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 Ігнорування неіснуючих файлів - хороша ідея. Будьте уважні, що те, як ви це робите, є хитрим: це повинно працювати на практиці, враховуючи, що типові імена користувачів не містять "дивних" символів, але в цілому використовувати {}подібне дуже небезпечно. Ім'я файлу інтерполюється безпосередньо в сценарій. Якщо у вас є ім'я файлу (тут: ім'я користувача), що містить, скажімо, $(rm -rf /)або ;rm -rf /;, команда буде виконана. Завжди передайте імена файлів як аргументи скриптам оболонки, ніколи не використовуйте {}механізм find або xargs .
Жил "ТАК - перестань бути злим"

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

Як варіант:

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

Зауважте, що це стосується домашніх каталогів у типових місцях. Було б краще проаналізувати /etc/passwdабо викликати getentта проаналізувати вихід цього.

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

3

Ви могли б зробити

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

Але я не думаю, що це набагато краще, ніж те, що ви думали.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.