Как добавить данные о сетевом или пользовательском источнике подключения в записи истории?

Как добавить данные о сетевом или пользовательском источнике подключения в записи истории?

Я хотел бы изменить настройки истории для всех пользователей в системах, которыми я управляю. Я хотел бы, чтобы она содержала информацию из подключаемого терминала, например, из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

который в целом можно читать как обычный файл истории, если хотите.

Связанный контент