對于運維來講,history命令應(yīng)該說是用到最多的了胶哲,尤其是一些老舊的系統(tǒng)畔塔,一些歷史命令更多時候,相當(dāng)于是運維手冊鸯屿,但是history命令有時候也有很多不方便的地方澈吨。
今天介紹一種方式,是把歷史命令寄摆,不同用戶使用的歷史命令都可以根據(jù)用戶記錄下來谅辣,甚至可以做為審計使用。
執(zhí)行如下腳本婶恼,會在/etc/profile.d下面生成一個cmd.sh腳本桑阶,然后會在/etc/ryslogd.d下建立一個日志規(guī)則柏副,結(jié)果的話,是在/var/log下生成具體記錄蚣录。
注意: 密碼啥的不建議直接命令行直接輸入8钤瘛!包归!
# cat gen_histry.sh
#!/bin/bash
# Debug:set -x
# Check if user is root
if [ $(id -u) -ne "0" ]; then
echo "Error: You must be root to run this script, please use root to install."
exit 1
fi
# define variables
cmd_path=/etc/profile.d
log_path=/etc/rsyslog.d
cat > $cmd_path/cmd.sh << 'EOF'
#!/bin/bash
# get realip
WHOAMI=`who -u am i | awk '{print $NF}'`
DATE=`date +%F_%T`
if [ -n "$WHOAMI" ];then
declare -x REAL_LOGNAME=`who am i | cut -d" " -f1`
declare -x REAL_IP=`who -u | egrep $WHOAMI | head -1 | awk '{print $NF}' | sed -e 's/[()]//g'`
else
echo "$DATE ssh execute." >> /dev/null
fi
if [ $USER == root ]; then
declare -x PROMT="#"
else
declare -x PROMT="$"
fi
LAST_HISTORY="$(history 1)"
__LAST_COMMAND="${LAST_HISTORY/*:[0-9][0-9] /}"
declare -x h2l='
THIS_HISTORY="$(history 1)"
__THIS_COMMAND="${THIS_HISTORY/*:[0-9][0-9] /}"
if [ "$LAST_HISTORY" != "$THIS_HISTORY" ];then
__LAST_COMMAND="$__THIS_COMMAND"
LAST_HISTORY="$THIS_HISTORY"
logger -p local4.notice -i -t $REAL_LOGNAME $REAL_IP "[$USER@$HOSTNAME $PWD]$PROMT $__LAST_COMMAND"
fi'
trap "$h2l" DEBUG
EOF
#####
if [ -d $log_path ];then
echo "$log_path does exist"
else
mkdir -p $log_path
fi
# record cmd log
cat > $log_path/cmd_track.conf << 'EOF'
# Log nc_profile generated CMD log messages to file
local4.notice /var/log/history.log
& ~
EOF
重啟 syslogd
# sh gen_histry.sh
# systemctl restart syslogd
具體結(jié)果的話锨推,是這樣的:
可以看到具體的主機名、登陸用戶公壤、操作指令换可、從哪里登陸的都可以很清晰的看到了。