如何防止命令出现在 Bash 历史记录中?

Posted

技术标签:

【中文标题】如何防止命令出现在 Bash 历史记录中?【英文标题】:How do I prevent commands from showing up in Bash history? 【发布时间】:2011-09-22 11:06:20 【问题描述】:

有时,当我运行rm -rf XYZ 之类的命令时,我不希望这被记录在 Bash 历史记录中,因为我可能会不小心再次通过reverse-i-search 运行相同的命令。有没有防止这种情况发生的好方法?

【问题讨论】:

serverfault.com/questions/48769/… 虽然bash 可能用于编写shell脚本(因此是编程),但它的这个特殊方面与编程完全无关(历史只是互动的东西)。投票结束。 相关:Execute command without keeping it in history 【参考方案1】:

我在我的.bashrc 中添加了“隐身”功能,当我想运行一些命令而不被保存而不必在每个命令之前添加空格时。

请注意,虽然当前终端会话的内存历史记录仍将被保存,但是当我打开 new 终端时,将永远不会看到在过去终端的隐身会话中发出的命令,因为他们从未写过HISTFILE

致您的.bashrc

ignoreHistory="false"
DEFAULT_HISTFILE=~/.bash_history
HISTFILE="$DEFAULT_HISTFILE"

# Toggle incognito mode
incognito() 
    if [[ "$ignoreHistory" == "true" ]]; then
        echo -e "\e[33mExited incognito mode\e[39m"
        ignoreHistory="false"
        HISTFILE="$DEFAULT_HISTFILE"
    else
        echo -e "\e[33mEntered incognito mode\e[39m"
        ignoreHistory="true"
        HISTFILE=/dev/null
    fi

不错的小实用程序,我认为有些人可能会发现它有用,您甚至可以更改提示以反映您是否处于隐身模式。

【讨论】:

当切换回来时,似乎整个历史仍然被写入......甚至是您在进入隐身模式后编写的命令。至少在使用 zsh 时会发生这种情况(我必须在代码中将 .bash_history 替换为 .zsh_history )。所以我会避免回到非隐身状态,直到关闭窗口或干脆删除 else 分支。【参考方案2】:
kill -9 $$

我知道这不如以前的答案那么好,但这会杀死当前的 Bash shell 而不会保存任何东西,这在默认情况下未设置 HISTCONTROL、您忘记设置它或您忘记设置的纯粹和简单时很有用一个前导空格,而您只是输入了一些密码并且不希望它们永久保留在历史记录中。

这是一种快速的方法,但像擦除历史文件这样的操作并不那么好,因为您需要在历史保存 shell 之外执行此操作(以其他用户身份登录并使用 su/sudo、创建后台作业等)。 )

【讨论】:

【参考方案3】:

更好地使用HISTIGNORE。这允许您指定一组要忽略的模式(例如rm)。 (我认为)这比将所有历史记录传输到 /dev/null 更好。

【讨论】:

啊,是的,忘了那个:)【参考方案4】:

如果您已将 HISTCONTROL 环境变量设置为 ignoreboth(通常默认设置),则带有前导空格字符的命令将不会存储在历史记录中(以及重复项)。

例如:

$ HISTCONTROL=ignoreboth
$ echo test1
$  echo test2
$ history | tail -n2
 1015  echo test1
 1016  history | tail -n2

man bash 是这样说的:

组织控制

以冒号分隔的值列表,用于控制命令在历史列表中的保存方式。如果值列表包含ignorespace以空格字符开头的行不会保存在历史列表中ignoredups 的值会导致不保存与前一个历史条目匹配的行。 ignoreboth 的值是 ignorespaceignoredups 的简写。 erasedups 的值会导致与当前行匹配的所有先前行在保存该行之前从历史列表中删除。任何不在上述列表中的值都将被忽略。如果HISTCONTROL 未设置,或者不包含有效值,则shell 解析器读取的所有行都将保存在历史列表中,以HISTIGNORE 的值为准。多行复合命令的第二行及后续行不经过测试,无论HISTCONTROL 的值如何,都会添加到历史记录中。

另见:

Why is bash not storing commands that start with spaces? 在 unix SE 上 Why does bash have a HISTCONTROL=ignorespace option? 在 unix SE 上

【讨论】:

【参考方案5】:

在 shell 启动时,我明确地从我不想出现的条目中清除历史记录。例如,我不希望在历史记录中出现任何rm -rf(删除一个包含一夜之间处理的结果的目录后的创伤,只需要一个Arrow-Up + Enter :)

我将以下 sn-p 放入我的 init 文件中(适用于 .zshrc,也应适用于 .bashrc

# ...
HISTFILE=~/.zshhistory
# ...

# remove dangerous entries from the shell history
temp_histfile="/tmp/$$.temp_histfile"
grep -v -P '^rm .*-rf' $HISTFILE > $temp_histfile
mv $temp_histfile $HISTFILE

【讨论】:

【参考方案6】:

或者

unset HISTFILE

(类似于前面的答案,只是更短:export HISTFILE=/dev/null)

【讨论】:

这只影响磁盘历史,不影响内存历史。【参考方案7】:

您可以做以下两件事之一:

export HISTFILE=/dev/null

或者,以空格开始命令。

【讨论】:

前面的空格太棒了 我们中的一些人认为自动忽略以空格为前缀的命令是一个非常糟糕的主意,因此默认情况下没有设置ignorespace 以这种方式设置HISTFILE 可以防止存储任何历史记录,并且不会阻止将命令添加到内存历史记录中。【参考方案8】:

在你的 .bashrc/.bash_profile/任何你想要的地方,输入export HISTIGNORE=' *'。然后,只需以一个空格开始您想要忽略的任何命令。

$ ls  # goes in history
$  ls # does not

【讨论】:

这取决于HISTCONTROL环境变量的值,不一定有ignorespace设置。 如果HISTCONTROL 包含ignorespace,实际上只是在HISTIGNORE 中包含` *` 是多余的。两者独立运作。

以上是关于如何防止命令出现在 Bash 历史记录中?的主要内容,如果未能解决你的问题,请参考以下文章

linux命令历史

如何在 Mac 上的 python 脚本中删除 bash 历史记录?

如何使linux系统下的root用户不保存终端历史记录到.bash_history中?

linux中如何清除文件中旧的操作历史记录

bash特性

HTML:防止出现文本输入中的历史记录