Я хотел бы изменить настройки истории для всех пользователей в системах, которыми я управляю. Я хотел бы, чтобы она содержала информацию из подключаемого терминала, например, изwho
sysadmin:/ # who
sysadmin pts/0 Mar 26 07:11 (sysadmin.doofus.local)
В настоящее время я изменяю свою историю следующими способами. Я знаю, что многие из этих настроек были рассмотрены здесь несколько раз. Однако я вытащил этот код из "Рецепты системного администрирования Linux от: Джульет Кемп" давно.
shopt -s histappend
PROMPT_COMMAND='history -n;history -a'
HISTSIZE=100000
HISTFILESIZE=100000
HISTTIMEFORMAT="%m/%d/%y %T "
shopt -s histappend
устраняет проблему, при которой при открытии нескольких терминалов информация может быть потеряна.
PROMPT_COMMAND='history -n;history -a'
расширяет возможности, позволяя в режиме реального времени добавлять историю на несколько терминалов.
HISTSIZE=100000
HISTFILESIZE=100000
увеличивает срок history
удержания
HISTTIMEFORMAT="%m/%d/%y %T
"предваряет каждую строку истории отметкой времени
Что вы обычно получаете с history
835 ls
836 cd ..
Мои измененные текущие history
результаты
5853 03/26/12 07:16:49 ls
5854 03/26/12 07:16:50 ll
Возвращение history
я хотел бы увидеть
5853 03/26/12 07:16:49 sysadmin.doofus.local ls
5854 03/26/12 07:16:50 sysadmin.doofus.local ll
001 03/26/12 05:11:29 demo_user.doofus.local cd
002 03/26/12 05:11:30 demo_user.doofus.local ll
Я не "женат" на том, чтобы видеть DNS
имя. Я бы хотел, чтобы оно было там, только если оно извлекается из who
или из другого места без необходимости выполнять поиск или запрос любого рода. Я был бы счастлив с IP-адресом.
002 03/26/12 05:11:30 192.168.0.2 ll
Почему? Я управляю несколькими системами, где несколько пользователей одной группы используют идентификатор пользователя для выполнения своих повседневных задач. Это позволило бы мне сопоставить их реальное местоположение и фактического пользователя в организации с тем, что они делали в истории.
Я понимаю, что это не оптимально, и хотел бы это изменить, но когда вы находитесь на судне размером с круизный лайнер, вы не пытаетесь делать крутые повороты. (Примечание: когда вы это делаете, пассажиры пытаются выбросить вас за борт)
В любом случае, пока я не смогу перенести их на лучшее решение, я хотел бы иметь эту возможность отслеживания.
Кроме того, если у вас есть какие-либо рекомендации по поводу того, что я в настоящее время использую для своих history
модификаций, я был бы рад их услышать.
Спасибо,
Редактировать: 1
Я не хочу запускать другие программы или настраивать что-либо дополнительно «в пределах разумного».
Я хочу добавить 0
накладные расходы, но если уж придется, то они должны быть небольшими.
Я доверяю своим пользователям, я просто хотел бы (если что-то случится) увидеть, кто из, скажем, 10 пользователей, которые вошли в систему с тем же user:password, сделал это. Или, это мог быть не пользователь, а забытый cron
в системе, который выполняет подключение как пользователь, чтобы что-то сделать. Или приложение, например, BMC Control-M
которое подключается ssh
и запускает задачи. Речь идет не столько о поиске "плохих пользователей", сколько о возможности отследить их с минимальными усилиями.
Редактировать 2:
Системы работают под управлением SLES и RHEL.
решение1
По предложению llua, мы можем немного больше поработать с историей. Добавить строку в системный файл BASH RC, например /etc/bash.bashrc.
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
Настройте ведение журнала для "local6" в системном регистраторе. Может быть, что-то вроде этого:
local6.* /var/log/commands.log
Перезапустите системный логгер. Возможно, настройте ротацию файлов журналов. Выйдите из системы; войдите в систему; и история теперь записывается в /var/log/commands.log в таком формате:
дата время имя хоста регистратор: имя пользователя [audit_pid]: команда [return_val]
Это можно изменить по вкусу.
решение2
Следующие параграфы описывают идею в общем и в некоторых аспектах устарели, но вы можете использовать последнюю версию изэтотpage. Давайте использовать большой файл ~/.bash_history.archive (отдельно от HISTFILE=~/.bash_history). А затем при выходе из каждой сессии bash будем добавлять в него новые строки истории.
Первая проблема с этим подходом была: как заставить bash вызывать этот скрипт при каждом выходе? Конечно, если вы выйдете из него, набрав «exit», то вы можете создать псевдоним функции «exit», но я использую для этого сочетание клавиш Ctrl-D и не смог найти способ переназначить его на что-то, кроме встроенной функции выхода.
Итак, первая попытка была: запретить Ctrl-D
export IGNOREEOF=10
и определите двойную комбинацию Ctrl-X для вызова функции выхода.
Но правильный подход — использовать команду exit tramp из bash, что является идеальным решением, поскольку она вызывается независимо от способа выхода из bash: Ctrl-D, выход, закрытие окна xterm.
trap 'archive_history' EXIT
Следующий шаг — определить начальную строку в нашем bash_history, чтобы мы могли сохранять только новые строки и быть уверенными, что мы добавляем данные в файл истории.
export CURBASHSTART=`grep -v "^[ \t]*$" $HISTFILE | wc -l | awk '{print $1}'` CURBASHDATE=`date`
shopt -s cmdhist histappend
Это все, что нам нужно при запуске bash - теперь мы знаем, с какой строки истории начинается текущая (свежая) история. Чтобы сохранить историю, добавьте следующий фрагмент в ваш ~/.bashrc.
archive_history()
{
HISTORYOLD=${HISTFILE}.archive
CURTIME=`date`
CURTTY=`tty`
if [ x$HISTDUMPPED = x ]; then
echo "#-${HOSTNAME}-- ${CURBASHDATE} - ${CURTIME} ($CURTTY) ----" >> $HISTORYOLD
history $(($HISTCMD-${CURBASHSTART-0})) | sed -e 's/^[ ]*[0-9][0-9]* [ ]*//g' >> $HISTORYOLD
export HISTDUMPPED=1
fi
}
exit ()
{
archive_history
builtin exit
}
Файл ~/.inputrc должен содержать следующие строки для переопределения сочетания клавиш выхода на Ctrl-x x. При первой попытке вам может показаться, что это ужасное сочетание клавиш, но потом вы привыкнете — поверьте мне.
$if Bash
# to exit through calling exit function which will archive the history
"\C-x\C-x": "exit\n"
# to dump history we have so far
"\C-x\C-w": "archive_history\n"
$endif
Также, если ваш сеанс bash является сеансом входа в систему и вы выходите, вызывая ' logout
', то вы можете добавить следующую строку в свой~/.bash_logout
archive_history
После выполнения всех указанных действий вы можете обнаружить свой ~/.bash_history.archive
файл, содержащий такие разделы:
#-belka-- Sun Oct 12 21:52:13 EDT 2003 - Sun Oct 12 21:53:25 EDT 2003 (/dev/pts/13) ----
exit
aptitude
exit
#-washoe-- Sun Oct 12 18:03:16 EDT 2003 - Sun Oct 12 23:06:48 EDT 2003 (/dev/pts/3) ----
exit
cd progr/letters/resume/
e resume.tex
который в целом можно читать как обычный файл истории, если хотите.