A-A+
linux以日志的方式记录用户操作
在日常操作linux的时候,经常会查看历史命令,或者是为了方面输入一条较长的而又使用过的命令,或者是为了查看过去对系统的操作,history就成了使用率极高的命令,它可以保存最近的操作记录,记录数还可以自定义,但有一点非常不方便,那就是history命令无法记录命令的执行时间,我在网上查了一些方法,基本都是通过修改用户初始化脚本,以rsyslog服务记录到一个文件当中,在这里分享一个比较简单的:
1、想要哪台服务器记录就要在哪台服务器上操作,首先登陆服务器,在/etc/profile中添加一下内容:
#history to logger files USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` export PROMPT_COMMAND='history -a >(tee -a ~/.bash_history|logger -p local1.debug -t "$USER_IP[$USER]")'解释: 第一条语句为获取当前session下登录用户的远程ip地址。 第二条语句为记录当前用户的操作命令到syslog的loccal1.debug级别的日志文件中。命令中为loccal加数字1.debug构成. 注意:此修改后当任何用户重新登录后生效记录操作命令,已经登录用户操作无法记录,再次登录后开始记录。 修改rsyslsog配置文件记录local1.debug级别日志信息 在/etc/rsyslog.conf配置文件中添加如下内容:
#Save history of user to userlog.log local1.* /var/log/usercmdhistory.log修改完成后保存退出,重启rsyslog服务使配置生效。 #/etc/init.d/rsyslog restart 查看/var/log/usercmdhistory.log文件生成,说明配置生效,未生成,检查配置。 测试配置是否正常运行 当前用户执行source /etc/profile,使新配置环境变量生效,执行任意命令,如ls,查看/var/log/usercmdhistory.log文件检查是否正常输出。输出内容格式如下: 日期时间 系统主机名远程IP[操作用户]:命令 Jun 14 00:59:01 oracle 192.168.10.103[oracle]: ls 如正常输出,则配置成功。无正常输出,请检查相关配置,或退出重新登陆再查看。 当初为服务器执行这项操作时,以为服务器数量较多,不想这么麻烦,就把所有步骤放在了一天命令里边,如下:
echo "#history to logger files" >> /etc/profile ; echo "USER_IP=\`who -u am i 2>/dev/null| awk '{print \$NF}'|sed -e 's/[()]//g'\`" >> /etc/profile ; echo export PROMPT_COMMAND=\'history -a \>\(tee -a \~/.bash_history\|logger -p local1.debug -t \"\$USER_IP[\$USER]\"\)\' >> /etc/profile ; echo "#Save history of user to userlog.log" >> /etc/rsyslog.conf ; echo local1.* /var/log/usercmdhistory.log >> /etc/rsyslog.conf ; /sbin/service rsyslog restart ; source /etc/profile把上面命令复制到命令行,以root身份执行即可生效,实际环境中要根据情况做相应修改。 这种方式实现比较简单,但缺点也很严重,如果你在登陆服务器后,执行切换身份的命令su等之后的命令无法记录,现在还没有找到实现方式,解决之后会对此做相应补充。 ------------------------------------------------------------------------------------------------------------ 另外,还有一种方式就是为history的执行结果添加时间和用户等信息,也是直接修改/etc/profile就可: vi /etc/profile
#设置history格式 export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`] " #记录shell执行的每一条命令 export PROMPT_COMMAND='\ if [ -z "$OLD_PWD" ];then export OLD_PWD=$PWD; fi; if [ ! -z "$LAST_CMD" ] && [ "$(history 1)" != "$LAST_CMD" ]; then logger -t `whoami`_shell_cmd "[$OLD_PWD]$(history 1)"; fi ; export LAST_CMD="$(history 1)"; export OLD_PWD=$PWD;'