• Linux 编写shell脚本记录操作用户日志信息


    一、为了更好的管理服务器,分配了不同的用户信息,记录不同的用户服务器操作日志

    遇见问题
    1、windows编辑脚本,linux运行报错

    history.sh: line 6: $'\r': command not found
    
    • 1

    2、当前操作用户可以查看自己日志文件,并修改
    目录属性设置权限为300,可以在目录中创建日志文件
    文件书香设置权限为200,只可以在文件中新增日志,不可查看和删除
    3、测试过程中出现,刚登录服务器,提示文件不存在

    -bash:目录/用户/日志文件: No such file or directory
    
    • 1

    二、shell脚本

    1、定义储存的日志目录,根据登录用户创建目录,每天生成一个文件
    user=`whoami`
    hislog_dir="/var/log/history/${user}"
    # 创建存放日志文件
    export HISTFILE="${hislog_dir}/$(date '+%F').his"
    
    • 1
    • 2
    • 3
    • 4
    2、判断目录是否存在,如果不存在创建目录,并赋当前用户权限 可写可执行(2+1),禁止当前用户查看日志,删除日志
    [ -d ${hislog_dir} ] || mkdir -p -m 300 ${hislog_dir} 
    
    • 1
    3、创建日志文件,并赋当前操作用户权限,可写(2)
    # -x 判断文件是否有执行权限;-w 文件是否有写入权限; -r 文件是否有读取权限
    [ -e  ${hislog_dir}/$(date '+%F').his  ] || touch ${hislog_dir}/$(date '+%F').his
    [ -x  ${hislog_dir}/$(date '+%F').his  ] || chmod 200 -R ${hislog_dir}/$(date '+%F').his
    
    • 1
    • 2
    • 3
    4、记录当前用户,当前文件目录的操作命令
    #定义保存的命令日志文件
    export HISTTIMEFORMAT='%F %T '
    #定义命令日志格式
    export PROMPT_COMMAND='user=$(who am i | sed "s/[ ][ ]*/ /g"); history 1 | { read x date time cmd; echo "${date} ${time} ${user} $(whoami) $(pwd) ${cmd}";} >> $HISTFILE'
    
    • 1
    • 2
    • 3
    • 4

    三、整体代码

    整体代码
    # 创建目录
    user=`whoami`
    hislog_dir="/var/log/history/${user}"
    
    [ -d ${hislog_dir} ] || mkdir -p -m 300 ${hislog_dir} 
    
    # 创建存放日志文件
    export HISTFILE="${hislog_dir}/$(date '+%F').his"
    # -x 判断文件是否有执行权限;-w 文件是否有写入权限; -r 文件是否有读取权限
    [ -e  ${hislog_dir}/$(date '+%F').his  ] || touch ${hislog_dir}/$(date '+%F').his
    [ -x  ${hislog_dir}/$(date '+%F').his  ] || chmod 200 -R ${hislog_dir}/$(date '+%F').his
    
    #定义保存的命令日志文件
    export HISTTIMEFORMAT='%F %T '
    #定义命令日志格式
    export PROMPT_COMMAND='user=$(who am i | sed "s/[ ][ ]*/ /g"); history 1 | { read x date time cmd; echo "${date} ${time} ${user} $(whoami) $(pwd) ${cmd}";} >> $HISTFILE'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    日志文件
    2022-08-31 10:27:04 gitAuto pts/10 2022-08-31 10:26 (IP) gitAuto /home cd ../
    2022-08-31 10:27:04 gitAuto pts/10 2022-08-31 10:26 (IP) gitAuto /home ll
    2022-08-31 10:27:08 gitAuto pts/10 2022-08-31 10:26 (IP) gitAuto / cd ..
    
    • 1
    • 2
    • 3

    四、遇到问题

    1、windows编辑脚本,linux运行报错
    history.sh: line 6: $'\r': command not found
    
    • 1

    原因windows的换行“回车(CR)”和“换行(LF)”,linux的“换行(LF)”,sh文件在每行都会多了一个CR,所以Linux下运行时就会报错找不到命令

    解决办法

    在Linux上编辑文件,set ff 查看当前文件编辑系统,set ff=unix,设置当前文件编辑系统

    # 打开当前文件,进入编辑
    vim history.sh
    # 进入命令行模式,查看当前文件的编辑系统
    :set ff
    # 提示当前信息,表示windows系统编辑
    fileformat=dos 
    # 设置当前文件的编辑系统
    :set ff=unix
    # 再查看当前文件的编辑系统
     fileformat=unix 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    2、当前操作用户可以查看自己日志文件,并修改

    目录属性设置权限为300,可以在目录中创建日志文件

    # 先判断文件是否存在,不存在创建,并赋予权限
    [ -d ${hislog_dir} ] || mkdir -p -m 300 ${hislog_dir}
    
    • 1
    • 2

    文件书香设置权限为200,只可以在文件中新增日志,不可查看和删除

    # 判断文件的执行权限,不可以执行,赋予权限
    [ -x  ${hislog_dir}/$(date '+%F').his  ] || chmod 200 -R ${hislog_dir}/$(date '+%F').his
    
    • 1
    • 2
    3、测试过程中出现,每天第一次登录服务器,提示文件不存在 No such file or directory
    -bash:目录/用户/日志文件: No such file or directory
    chmod: cannot access '目录文件': No such file or directory
    # 第一次登录,未创建,就直接赋权导致的,判断文件是否存在,不存在,先创建文件
    [ -e  ${hislog_dir}/$(date '+%F').his  ] || touch ${hislog_dir}/$(date '+%F').his
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    Latex中也能展示动态图?
    C++日期类实现(联系类和对象)
    凝思系统ftp只能下载文件,不能上传文件
    EasyCVR视频调阅页面如何正确关闭正在播放的视频?
    Pytorch的数据操作(预备知识)
    【云原生之Docker实战】使用Docker部署Typecho个人博客平台
    Linux - MongoDB部署
    JS对象操作(in、instanceof、delete)运算符
    [西湖论剑 2022]real_ez_node
    6. vector
  • 原文地址:https://blog.csdn.net/G925010178/article/details/126618810