Shell学习——子shell操作记录转储
概述
主要介绍子shell历史操作记录的保存以及解析,比如python, scala等,用于(准)实时监控用户行为.
背景
一级shell的历史操作记录已由系统实现,当用户从开始登录shell(这里指父shell)到退出,期间所有的操作记录都将记录在
~/.bash_history文件里, 但是当我从父shell新建一个子shell时(例如在当前shell执行scala),所有在scala命令行的
操作记录将不会被系统监控到, 那如果我想获取这里操作记录该怎么做, 别担心,办法总比问题多,这里的实现用到 tee 命令
设计思路
- 设置scala别名
- 使用tee把scala在终端的所有操作记录转储到文件
- 使用sed解析日志文件, 获取想要的结果(这里指用户在scala的输入)
案例分析
scala
- 别名设置
当用户执行scala命令时,自动实现操作记录转储
# 这里把日志保存到当前用户的log目录下
]# alias scala="scala | tee -a -i /home/${USER}/${LOGNAME}/$(date '+%Y%m%d').log"
# 永久生效
# 在/etc/bash文件末尾添加下面一行
]# vim /etc/bash
alias scala="scala | tee -a -i /home/${USER}/${LOGNAME}/$(date '+%Y%m%d').log"
- 运行scala
]$ scala
Welcome to Scala 2.12.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_171).
Type in expressions for evaluation. Or try :help.
scala> 1 + 1
res0: Int = 2
scala> println("hello scala")
hello scala
scala>
- 检查日志文件
这里的log文件就是转储后的文件,请看下面,是不是把scala在终端的所有操作记录都保存下来了
]# tailf 20180907.log
Welcome to Scala 2.12.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_171).
Type in expressions for evaluation. Or try :help.
scala> 1 + 1
res0: Int = 2
scala> println("hello scala")
hello scala
scala>
- sed解析转储后的文件
请看结果,是不是解析后的输出就是之前用户在scala终端的输入
# 这里只取用户输入命令
]# sed -n '/scala/p' 20180907.log | sed 's/scala> //g'
1 + 1
println("hello scala")
hello scala