Могу ли я искать историю bash по всем пользователям на сервере?

20

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

Wesley
источник

Ответы:

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, так что, возможно, стоит добавить в. Я изменил это, чтобы проверить, что файл существует, прежде чем пытаться 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 Игнорирование несуществующих файлов - хорошая идея. Помните, что то, как вы это делаете, хитроумно: оно должно работать на практике, учитывая, что типичные имена пользователей не содержат «странных» символов, но в целом {}такое использование очень опасно. Имя файла интерполируется непосредственно в скрипте. Если у вас есть имя файла (здесь: имя пользователя), содержащее, скажем, $(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"

Но я не думаю, что это намного лучше, чем вы думали.

brodie31k
источник