用日志记录Linux用户执行的每一条命令

把用户执行的每一个命令都记录下来,然后在每个用户退出登录时把用户所执行的每一个命令都发送给日志守护进程rsyslogd,也可通过配置“/etc/rsyslog.conf”进一步将日志发送给日志服务器

方法一:

vim /etc/profile

#设置history格式
export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null| \
awk '{print $NF}'|sed -e 's/[()]//g'`] "
#记录执行的每一条命令
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;'

编辑完成后运行命令source /etc/profile使之生效

方法二:

1、全局设置(这是一次性设置,需要root用户权限)

vim /etc/profile

#用户登录时执行此脚本
#设置history显示格式
export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null\
| awk '{print $NF}'|sed -e 's/[()]//g'`] "
#登录时清空当前缓存
echo "" > .bash_history

编辑完成后运行命令source /etc/profile使之生效

2、不同用户分别设置

vim /home/user1/.bash_logout

#当用户退出登录时会执行此脚本
tmpfile="/tmp/`whoami`_history.tmp"
#把格式化的history记录到文件里
history > $tmpfile
 
#读取文件,一行一行把文件内容发送到给syslogd。
#不要试图用"history | logger"或"logger -f $tmpfile"来替代下面的代码,
#否则将只能记录前200行。
k=1
while read line; do
((k++))
logger -t `whoami`_shell_cmd "$line"
done < $tmpfile
rm -f $tmpfile

运行命令:less /var/log/messages查看日志

不足之处:
1. 不能实时记录命令并发送log
2. 要记录终端桌面下的命令需要重启。

weinxin
聂扬帆博客
一个分享IT运维相关工作经验和实战技巧的个人博客

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: