如何将网络或用户源连接数据添加到历史记录条目?

如何将网络或用户源连接数据添加到历史记录条目?

我想修改我管理的系统上所有用户的历史记录设置。我希望它包含来自连接终端的信息,例如来自who

sysadmin:/ # who
sysadmin  pts/0        Mar 26 07:11 (sysadmin.doofus.local)

我目前通过以下方式修改我的历史记录。我知道其中许多设置已在此处介绍过多次。但是,我从“Linux 系统管理食谱作者:Juliet Kemp“ 很久以前。

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=100000history延长保留 量

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

为什么?我管理多个系统,其中同一组的多个用户共享一个用户 ID 来执行日常任务。这将使我能够将组织内他们的真实位置和实际用户与他们在历史中所做的事情相关联。

我知道这不是最佳选择,并且想改变它,但是,当您乘坐游轮大小的船上时,您不会尝试急转弯。 (注意:当你这么做时,乘客会试图把你扔到海里)

无论如何,在我能够将它们迁移到更好的解决方案之前,我希望拥有这种跟踪能力。

另外,如果您对我目前用于history修改的内容有任何建议,我很乐意听到。

谢谢,

编辑:1

我不想运行其他程序或必须“在合理范围内”配置任何额外的内容。

我想增加0开销,如果我必须添加的话,它需要很小。

我确实信任我的用户,我只是想(如果发生什么情况)看看使用相同用户名:密码登录系统的 10 个用户中的哪一个执行了此操作。或者,它可能不是一个用户,它可能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

以下段落大体描述了这个想法,并且在某些方面已经过时,但是您可以使用然后使用最新的页。让我们使用一个大文件 ~/.bash_history.archive (与 HISTFILE=~/.bash_history 分开)。然后在退出每个 bash 会话时向其添加新的历史记录行。

这种方法的第一个问题是:如何让 bash 在每次退出时调用这个脚本?当然,如果你通过输入“exit”退出它,那么你可以为“exit”函数别名,但我使用快捷键 Ctrl-D 来实现这一点,并且我找不到如何将其重新分配给某些东西但不是内置退出函数的方法。

所以第一次尝试是:禁止 Ctrl-D

export IGNOREEOF=10

并定义双 Ctrl-X 组合来调用退出函数。

但正确的方法是使用 bash 的 exit trapp,这是一个完美的解决方案,因为无论您以何种方式退出 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

如果您愿意,通常可以像平常的历史文件一样读取它。

相关内容