用日志記錄Linux用戶執(zhí)行的每一條命令
作者:佚名 
  工作中,需要把用戶執(zhí)行的每一個(gè)命令都記錄下來,并發(fā)送到日志服務(wù)器的需求,為此我做了一個(gè)簡(jiǎn)單的解決方案。這個(gè)方案會(huì)在每個(gè)用戶退出登錄時(shí),把用戶所執(zhí)行的每一個(gè)命令都發(fā)送給日志守護(hù)進(jìn)程rsyslogd,你也可通過配置“/etc/rsyslog.conf”進(jìn)一步將日志發(fā)送給日志服務(wù)器。
 工作中,需要把用戶執(zhí)行的每一個(gè)命令都記錄下來,并發(fā)送到日志服務(wù)器的需求,為此我做了一個(gè)簡(jiǎn)單的解決方案。這個(gè)方案會(huì)在每個(gè)用戶退出登錄時(shí),把用戶所執(zhí)行的每一個(gè)命令都發(fā)送給日志守護(hù)進(jìn)程rsyslogd,你也可通過配置“/etc/rsyslog.conf”進(jìn)一步將日志發(fā)送給日志服務(wù)器。 
***種方法
- # vi /etc/profile
 - #設(shè)置history格式
 - export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`] "
 - #記錄shell執(zhí)行的每一條命令
 - 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;'
 
下面是第二種方法,較笨
***步:全局設(shè)置(這是一次性設(shè)置,需要root用戶權(quán)限)
命令# vi /etc/profile
- #用戶登錄時(shí)執(zhí)行此腳本
 - #設(shè)置history顯示格式
 - export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`] "
 - #登錄時(shí)清空當(dāng)前緩存
 - echo "" > .bash_history
 
第二步:不同用戶分別設(shè)置
命令# source /etc/profile
命令# vi /home/user1/.bash_logout
- #當(dāng)用戶退出登錄時(shí)會(huì)執(zhí)行此腳本
 - tmpfile="/tmp/`whoami`_history.tmp"
 - #把格式化的history記錄到文件里
 - history > $tmpfile
 - #讀取文件,一行一行把文件內(nèi)容發(fā)送到給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
 
(如果還有其它用戶需要監(jiān)控,則重復(fù)第二步驟)
第三步:把日志發(fā)送給遠(yuǎn)程主機(jī)(可選)
- # vi /etc/rsyslog.conf
 - #增加如下行,IP自己換,也可以用域名,@表示用UDP協(xié)議,@@表示用TCP協(xié)議
 - *.* @192.168.0.1
 
不足之處:
1. 不能實(shí)時(shí)記錄命令并發(fā)送log
2. 要記錄終端桌面下的命令需要重啟。
責(zé)任編輯:火鳳凰 
                    來源:
                    問問云
 
















 
 
 











 
 
 
 