从 Shell 脚本中完全清除 Bash 历史记录 (sysprep)

从 Shell 脚本中完全清除 Bash 历史记录 (sysprep)

我正在开发一个 sysprep 风格的脚本,该脚本可以取消机器的标识并为其模板化做好准备。我要执行的最后一个任务(在关闭之前)是清除 root 用户的 bash 历史记录。我可以执行

HISTFILE=~/.bash_history
set -o history
>$HISTFILE
history -c

从脚本内部。问题是,执行脚本的交互式根会话存储在内存中的历史记录会在该会话结束时写入 $HISTFILE。我希望 sysprep 脚本成为最后执行的事情(脚本中的最后一行是shutdown now -h)。

如果有必要,我可以在关闭之前手动清除交互式会话中的历史记录,但我想将其作为我的脚本的一部分。有什么建议么?

不确定这是否重要,但这适用于 RHEL8。

答案1

我能想到的最接近的是:

系统准备工具

#!/bin/sh
# other steps
cp /dev/null ~/.bash_history
shutdown -h now

其次是:

# exec /path/to/sysprep.sh

...而不是直接调用/path/to/sysprep.sh.使用execshell 脚本替换当前 shell,这允许当前 shell 写入其历史记录并退出。然后 sysprep 脚本可以自由地删除(或清除)您的历史文件。

答案2

$HISTFILE当 shell 退出时,将附加当前 shell 的历史记录。这样做unset $HIST_FILE不会发生这种情况,因此当 shell 退出时,该 shell 实例的历史记录将丢失。

所以,只要:

  1. 该脚本是从交互式 shell 中获取或执行的,或者在没有交互式 shell 的情况下直接调用
  2. 脚本在退出前取消设置 $HISTFILE

它可以删除历史文件,或将其替换为您以后想要查看的任何历史记录。

相关内容