对于运维来讲,history命令应该说是用到最多的了,尤其是一些老旧的系统,一些历史命令更多时候,相当于是运维手册,但是history命令有时候也有很多不方便的地方。
今天介绍一种方式,是把历史命令,不同用户使用的历史命令都可以根据用户记录下来,甚至可以做为审计使用。
执行如下脚本,会在/etc/profile.d下面生成一个cmd.sh脚本,然后会在/etc/ryslogd.d下建立一个日志规则,结果的话,是在/var/log下生成具体记录。
注意: 密码啥的不建议直接命令行直接输入!!!
# 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
具体结果的话,是这样的:
可以看到具体的主机名、登陆用户、操作指令、从哪里登陆的都可以很清晰的看到了。