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


14

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

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

Answers:


27

要在历史记录中不保存单个命令,只需在其前面加上一个空格(在此处标记为):

$ 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用
冒号分隔的值列表,用于控制如何在历史记录列表中保存命令。如果值列表包含 ignorespace则以空格字符开头的行不会保存在历史记录列表中忽略的值将 导致不保存与上一个历史记录条目匹配的行。ignoreboth的值 是ignorespaceignoreups的简写。

ignoredups顺便说一下,这就是为什么history | 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选择和改变!d,以d执行删除操作:

                                   # 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

12

一种方法是设置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*'

6

您可以

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

  • /home/$USER/.bash_history不涉及情况下编辑文件bash,例如,通过Alt+ 启动您喜欢的编辑器F2

    这样,您可以检查整个历史记录并删除不再需要的所有命令。

    在此处输入图片说明

    在此处输入图片说明


1

我通常使用:

history -w; history -c; $EDITOR $HISTFILE; history -r

将历史文件写入磁盘,在内存中清除,然后对其进行编辑以执行所需的操作,然后将已编辑的历史文件读回。

请注意,如果您的编辑器保存了备份文件,则顽皮的单词可能仍会出现在磁盘上。

使用的另一种选择-d是使用预测历史数字:

startide sr> # good thing
startide sr> # bad thing
startide sr> history | tail -n 2
17239  # bad thing
17240  history | tail -n 2
startide sr> history -w; history -d 17239; history -d 17239; history -d 17239
startide sr> # other thing
startide sr> history | tail -n 3
17239  # good thing
17240  # other thing
17241  history | tail  -n 3

在此示例中,我删除了不好的事情,删除了命令以获取历史记录编号,然后删除了用于删除历史记录的命令。一切都被消毒了。


0

如果要运行命令而不将其保存在历史记录中,请在命令前添加多余的空间

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

为此,您需要在HISTCONTROL中使用ignorespace或ignoreboth。例如,运行

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.