使用 key 登录时分开记录操作历史记录

线上服务器一般都是配置 key 登录,一个账号可以多个工作人员连接,操作命令历史却全部记录在一个文件中,当然后查看某条命令是谁执行的时候就不好查了。这时候我们就可以通过配置 histroy 相关环境变量将不同工作人员操作历史分别记录到不同的文件中。具体脚本如下

# 通过登录的 key 分开记录命令历史
# 使用方法:
#   1. 禁用 openssh 密码登录验证
#   2. 设置 openssh 日志级别为 VERBOSE
#   3. 重启 openssh 服务
# 注意:
#   仅适用于 Centos 6.x
# 日期: 2018-03-21
# 作者: liwanggui


hist() {
    login_ip='127.0.0.1'
    login_name=$USER
}


hist_net() {
    login_ip=$(echo $SSH_CLIENT | awk '{print $1}')
    local login_port=$(echo $SSH_CLIENT | awk '{print $2}')
    local filter_arg1="Connection from ${login_ip} port ${login_port}"
    local filter_arg2="Found matching RSA key"
    local ssh_logfile="/var/log/secure"
    local authorized_keys="${HOME}/.ssh/authorized_keys"

    local start_line=$(grep -n "${filter_arg1}" "${ssh_logfile}" | awk -F':' '{print $1}')
    local key_md5=$(sed -n "${start_line},$"p "${ssh_logfile}" | grep "${filter_arg2}" | head -n 1 | awk '{print $NF}')

    local tmpdir=$(mktemp -d)
    while read line; do
        comment=$(echo $line | awk '{print $NF}')
        echo $line > ${tmpdir}/$comment
    done < ${authorized_keys}

    cd $tmpdir
    for name in $(ls); do
        md5=$(/usr/bin/ssh-keygen -lf $name | awk '{print $2}')
        if [ $key_md5 = $md5 ]; then
            login_name=$name
            break
        fi
    done
    cd ; /bin/rm -rf $tmpdir
}


# 判断登录方式

if [ "${SSH_CLIENT}x" = 'x' ]; then
    hist
else
    hist_net
fi


if [ ! -d /var/log/history ]; then
    /bin/mkdir -p /var/log/history
    /bin/chmod 777 /var/log/history
fi

if [ ! -f /var/log/history ];then
    touch /var/log/history/$login_name
    chmod 600 /var/log/history/$login_name
fi

export HISTFILESIZE=4096
export HISTSIZE=2000
export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [${login_ip}:${login_name}] "
export HISTFILE="/var/log/history/$login_name"
export PROMPT_COMMAND="history -a; history -w; history -c; history -r"

unset login_ip
unset login_name
unset hist
unset hist_net

注意: key 最后的注释应为工作人员的姓名拼音

posted @ 2017-10-30 16:10  liwanggui  阅读(463)  评论(0编辑  收藏  举报