我想修改我管理的系统上所有用户的历史记录设置。我希望它包含来自连接终端的信息,例如来自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=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
为什么?我管理多个系统,其中同一组的多个用户共享一个用户 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
如果您愿意,通常可以像平常的历史文件一样读取它。