当前位置: 首页 > news >正文

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

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

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

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

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

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

二、shell脚本

1、定义储存的日志目录,根据登录用户创建目录,每天生成一个文件

user=`whoami`
hislog_dir="/var/log/history/${user}"
# 创建存放日志文件
export HISTFILE="${hislog_dir}/$(date '+%F').his"

2、判断目录是否存在,如果不存在创建目录,并赋当前用户权限 可写可执行(2+1),禁止当前用户查看日志,删除日志

[ -d ${hislog_dir} ] || mkdir -p -m 300 ${hislog_dir} 

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

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'

三、整体代码

整体代码

# 创建目录
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'

日志文件

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、windows编辑脚本,linux运行报错

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

原因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 

2、当前操作用户可以查看自己日志文件,并修改

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

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

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

# 判断文件的执行权限,不可以执行,赋予权限
[ -x  ${hislog_dir}/$(date '+%F').his  ] || chmod 200 -R ${hislog_dir}/$(date '+%F').his

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

相关文章:

  • 从零开始配置vim(19)——终端配置
  • 岑溪洁净实验室设计布局规划总结
  • 要不要做全链路压测
  • node.js云学堂微信小程序学习系统的设计与实现毕业设计源码011735
  • 前端知识3-JavaScript
  • 函数和二维数组
  • 马士兵老师JVM调优(修订版)
  • OpenCV使用教程-读取图像imread使用说明
  • 项目应用RabbitMQ简单配置
  • k8s Seata1.5.1
  • Linux 搭建nginx redis mysql rabbitmq以及配置SSL
  • 点击化学DBCO-PEG-FITC|二苯并环辛炔-聚乙二醇-异硫氰基荧光素
  • 离线数仓(8):ODS层实现之导入流量日志
  • 计算机三级 网络技术 大题第一题 答题技巧分享
  • 项目总结——深入浅出socket网络编程
  • Cumulo 的 ClojureScript 模块已经成型
  • exports和module.exports
  • Intervention/image 图片处理扩展包的安装和使用
  • IOS评论框不贴底(ios12新bug)
  • Quartz初级教程
  • 从tcpdump抓包看TCP/IP协议
  • 第2章 网络文档
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 回顾2016
  • 微信小程序:实现悬浮返回和分享按钮
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #考研#计算机文化知识1(局域网及网络互联)
  • $forceUpdate()函数
  • (2)nginx 安装、启停
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (三)mysql_MYSQL(三)
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET 使用配置文件
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net和php怎么连接,php和apache之间如何连接
  • .NET连接数据库方式
  • .net知识和学习方法系列(二十一)CLR-枚举
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [acm算法学习] 后缀数组SA
  • [ACTF2020 新生赛]Upload 1
  • [AIGC 大数据基础]hive浅谈
  • [android学习笔记]学习jni编程
  • [autojs]autojs开关按钮的简单使用
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [C puzzle book] types
  • [C++]C++类基本语法
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】
  • [CISCN 2023 初赛]go_session
  • [DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]
  • [FTP]pureftp部署和优化
  • [HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • [iOS]Win8下iTunes无法连接iPhone版本的解决方法