在 bash 历史记录中隐藏“history -d”

在 bash 历史记录中隐藏“history -d”

如果我不小心在 bash 中输入了密码或其他敏感信息,我可以轻松地用 删除该行history -d ROW#,但历史记录中的命令始终会向history -d ROW#所有人显示有人更正了错误。

我可以将一些内容附加到命令中以防止其出现在 bash 历史记录中吗?

答案1

如果不想在历史记录中保存单个命令,只需在命令前加上空格(标记为这里):

$ echo test
test
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2
$ echo test2
test2
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2

此行为在您的文件中设置~/.bashrc,即在以下行中:

HISTCONTROL=ignoreboth

man bash说:

HISTCONTROL
用冒号分隔的值列表,控制命令在历史列表中的保存方式。如果值列表包括 忽略空间以空格字符开头的行不会保存在历史列表中. 值为被忽略的 导致与前一个历史记录条目匹配的行不被保存。 忽略两者是简写忽略空间被忽略的

ignoredupshistory | tail -n2顺便说一下这就是为什么在上述测试中历史记录中只出现一次的原因。


终端的历史记录保存在 RAM 中,并~/.bash_history在您关闭终端后立即刷新到您的终端。如果您想从终端中删除特定条目,~/.bash_history可以使用以下命令sed

                                   # print every line…
sed '/^exit$/!d' .bash_history     # … which is just “exit”
sed '/^history/!d' .bash_history   # … beginning with “history”
sed '/>>log$/!d' .bash_history     # … ending with “>>log”
sed '\_/path/_!d' .bash_history    # … containing “/path/” anywhere

在最后一个中,我将默认分隔符更改/为 ,_因为它在搜索词中使用,实际上这等于sed -i '/\/path\//d' .bash_history。如果命令仅输出要删除的行,请添加选项-i并更改!dd以执行删除:

                                   # delete every line…
sed -i '/^exit$/d' .bash_history   # … which is just “exit”
sed -i '/^history/d' .bash_history # … beginning with “history”
sed -i '/>>log$/d' .bash_history   # … ending with “>>log”
sed -i '\_/path/_d' .bash_history  # … containing “/path/” anywhere

答案2

一种方法是设置HISTIGNORE环境变量。从man bash

HISTIGNORE
      A colon-separated list of patterns used to decide which  command
      lines  should  be  saved  on  the history list.  Each pattern is
      anchored at the beginning of the line and must  match  the  com‐
      plete  line  (no  implicit  `*'  is  appended).  Each pattern is
      tested against the line after the checks specified  by  HISTCON‐
      TROL  are  applied. 

[FWIW,默认HISTCONTROL提供在前面输入空格的解决方法]。

例如

HISTIGNORE='history -d*'

如果你希望它是持久的,请将其从你的~/.bashrc

export HISTIGNORE='history -d*'

答案3

你可以

  • 关闭终端窗口. 这会将您最近关闭的终端窗口中的最新历史记录(在其他窗口关闭后)刷新到文件中/home/$USER/.bash_history

  • 编辑文件/home/$USER/.bash_history无需参与bash,例如通过Alt+启动你最喜欢的编辑器F2

    这样,您可以检查整个历史记录并删除不再存在的命令。

    在此处输入图片描述

    在此处输入图片描述

答案4

如果要运行命令而不将其保存在历史记录中,请在命令前面添加一个空格

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

要使此功能正常工作,您需要在 HISTCONTROL 中使用 ignorespace 或 ignoreboth。例如,运行

HISTCONTROL=ignorespace 要使此设置持久,请将其放入您的 .bashrc 中。

相关内容