很多时候重开一个终端,之前敲的命令却找不到了,很麻烦。如果像 OSX 一样关机再开还能原样恢复作业就很舒坦了。
1 、 History 命令
History 是 Bash Shell 自带的命令,用于读取 系统运行后 内存缓存的历史记录信息,默认记录 500 条
History 储存到本地的记录 保存两个信息,UNIX 时间戳 和 执行的命令
#1638403820 echo "2021-12-02-08:10:20" #1638403821 echo "2021-12-02-08:10:21" #1638403822 echo "2021-12-02-08:10:22"
History 命令 主要有两个变量,一个是文件,一个是格式
其中 HISTTIMEFORMAT 存在两个变量,日期 %F = 2021-12-02 ,时间 %T = 08:10:20 分别对应 Unix 时间戳
HISTFILE = ~/.bash_history HISTTIMEFORMAT = ""
当使用 Bash 运行一条命令时,记录将储存在 当前 tty(pts/0) 所占用的内存空间中,并在 logout 动作时停止记录并保存在 $HISTFILE 默认路径中
如果系统不重启,因为 Linux 文件实质储存在 易失性存储空间(内存)的路径中,内存历史文件不会被自动清理,记录可以长期保持
而当系统重启,内存缓存记录将被清空,虽然本地历史文件依然存在,但输入 history 命令无法读取
常用的命令如下
# 查看内存缓存历史纪录 # 注意每次运行 history 时最后一条必然为 history 本身的记录 history #编号 命令 1 echo "2021-12-02-08:10:20" 2 echo "2021-12-02-08:10:21" 3 echo "2021-12-02-08:10:22" 4 echo "hello" 5 history
# 清空内存缓存历史记录 history -c
# 删除内存缓存指定编号记录 history -d 2 # 删除内存缓存指定编号段记录 history -d 2-3 # 删除内存缓存倒数编号记录 history -d -3
# 写入文件历史记录(附加) history -a # 写入文件历史记录(覆盖) history -w
# 加载文件历史记录(从当前 Shell 起始时间点后文件历史记录增加项) history -n # 强制加载文件历史记录(所有记录) history -r
# 运行命令但不增加到内存缓存中 history -p # 将指定内容强制增加到内存缓存中 history -s
2 、 History 记录
2.1 、简单备份历史方案
断开自动保存
echo -e "cp -f ~/.bash_history ~/.bash_history_back" >> ./.bash_logout
cp -f ~/.bash_history ~/.bash_history_bac
连接自动恢复
echo -e "# Backup history\nif [ -f .bash_history_backup ]\nthen\n mv -f .bash_history_backup .bash_history\nfi" >> ./.bashrc
# Backup history if [ -f .bash_history_backup ] then mv -f .bash_history_backup .bash_history fi
这个方式采用移动备份文件的方式,存在严重缺点:多 vty 记录丢失
优点是保存的为原始记录,可以随时通过 history 加载到内存缓存中
2.2 、完整备份历史方案
既然系统存在日志,我们完全可以通过日志的方式储存记录,并按照我们需要的格式记录
当然为了方便管理,需要创建一个日志文件夹 /var/log/history_log 并创建我们需要管理的用户文件夹
对于 /var/log/history_log/ 目录使用权限 0755
对于 /var/log/history_log/user 目录使用权限 4750 限定本人使用以及群组可查
mkdir /var/log/history_log/ chmod 0755 /var/log/history_log chown root:root /var/log/history_log mkdir /var/log/history_log/root chmod 4750 /var/log/history_log/root chown root:root /var/log/history_log/root
创建完毕后,在需要管理的用户目录下新增文件 .bash_logout
并添加以下信息
nano .bash_logout
# ~/.bash_logout log_file=/var/log/history_log/$(id -un)/history_"$(date +%Y%m%d-%H%M%S)".log HISTTIMEFORMAT="$(id -un)@$(who am i | xargs -x echo) +%T || " history >> "${log_file}" chmod 400 "${log_file}" if [ -f /work/shell/user/clear-userlog.sh ] then source /work/shell/user/clear-userlog.sh fi
每当用户退出当前 tty 时,Bash 会自动根据用户创建历史日志记录,并将用户当前信息按照格式自动写入到本地日志文件中(不可被 history 再读取)