ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
<p style="text-indent:2em;">一般情况下,可以通过`/root/.bash_history`文件中读取到最近1000条的操作记录,或者通过history命令直接显示出来,但是这种方式读取到的历史记录数据可读性差,而且无法溯源,不清楚具体是哪个用户使用哪个ip在何时进行操作的。</p> <p style="text-indent:2em;">为解决这个问题,可以通过配置`history`命令相关的环境变量来实现,也可以通过编写shell脚本来实现。</p> <br> **history相关环境变量:** * HISTCONTROL:设置为 **ignorespace**, 以 space 开头的行将不会插入到历史列表中;设置为 **ignoredups**, 匹配上一次历史记录的行将不会插入;设置为 **ignoreboth**,会结合以上两种情况;设置为**erasedups**,为清除整个命令历史中的重复条目 * HISTFILE:保存命令历史的文件名,默认值是 `~/.bash_history`。如果取消定义,在交互式 shell 退出时命令历史将不会保存 * HISTFILESIZE:保存命令历史的最大值 * HISTIGNORE:忽略掉常用的命令(alias),不将他们记录到日志中,冒号为分隔符,如:`HISTIGNORE="ls *:ll:ls"` * HISTTIMEFORMAT:记录命令执行的时间格式,如果不设置此变量HISTFILE文件中将不会记录命令执行的时间戳 * PROMPT_COMMAND:该环境变量可以用于命令回调,如可以使用该变量来开启操作日志记录并存储到指定文件 **方法一:** root用户下,直接在`/etc/profile`文件中追加环境变量,可直接通过设置PROMPT_COMMAND变量来实现,该变量设置完可以实现实时调度将历史记录写入文件 ``` [root@izwz91quxhnlkan8kjak5hz ~]# vi /etc/profile export HISTORY_FILE="/var/log/history/root.log" export PROMPT_COMMAND='{ date "+%Y-%m-%d %T $(history 1)"; } >> $HISTORY_FILE' ``` **方法二:** 以shell脚本方式实现实时写入历史记录 第一步、编写history.sh脚本,内容如下: ``` #!/usr/bin/env bash // 获取用户ip USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` // 获取当天日期 DT=`date +"%Y%m%d"` // 设置历史记录文件 export HISTORY_FILE="/var/log/history/${LOGNAME}/${DT}/${USER_IP}.log" dir=`dirname $HISTORY_FILE` if [ ! -d $dir ]; then mkdir -p $dir chmod 300 $dir fi export PROMPT_COMMAND='{ date "+%Y-%m-%d %T $(history 1)"; } >> $HISTORY_FILE' export HISTCONTROL=ignoredups ``` 第二步、在`/etc/profile`文件中调度history.sh脚本 ``` [root@izwz91quxhnlkan8kjak5hz ~]# vim /etc/profile source /etc/history.sh [root@izwz91quxhnlkan8kjak5hz ~]# source /etc/profile // 重新执行脚本 ``` **方法三:** 退出当前登录或者关闭shell终端之后才写入文件 ``` #!/usr/bin/env bash USER=`whoami` USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` if [ "$USER_IP" = "" ]; then USER_IP=`hostname` fi if [ ! -d /var/log/history ]; then mkdir /var/log/history chmod 777 /var/log/history fi DT=`date +"%Y%m%d"` if [ ! -d /var/log/history/${LOGNAME}/${DT} ]; then mkdir /var/log/history/${LOGNAME}/${DT} chmod 300 /var/log/history/${LOGNAME}/${DT} fi export HISTTIMEFORMAT="%F %T " export HISTSIZE=4096 export HISTFILE="/var/log/history/${LOGNAME}/${DT}/${USER_IP}.log" ```