在 SSH 终端开启的时候自动恢复历史记录

2017-11-14 2696点热度 0人点赞 0条评论

很多时候重开一个终端,之前敲的命令却找不到了,很麻烦。如果像 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 再读取)

StarryVoid

Have a good time