Shell学习——子shell操作记录转储

时间:2022-06-10 00:12:12

概述

主要介绍子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