从 Bash 历史文件中删除某一行

w0r*_*art 166 linux bash history command-history

如何从history的数据库中删除某行?

Pap*_*ern 158

您可以通过两个步骤使用命令行从历史文件中删除:

  1. 键入history -d <line_number>会从内存中的历史记录中删除指定的行。
  2. 键入history -w会将当前内存中的历史记录写入~/.bash_history文件。

这两个步骤一起从内存历史记录.bash_history文件中永久删除该行。

  • 如何从历史记录中删除最后一个`history -w`? (8认同)
  • 或者在它之前添加一个空格以防止它被添加,如@tao's answer (6认同)

cYr*_*rus 134

您需要注销并重新登录或运行,history -a以便将当前历史记录提交到磁盘。

然后只需编辑文件~/.bash_history

  • 当您退出 shell 时,条目将写入历史文件。因此,在输入要删除的命令后,您需要注销并重新登录,或者使用“history -d xxxx”将它们从当前的 shell 会话中删除。 (21认同)
  • 如果设置了 HISTFILE 环境变量,则历史文件不是 ~/.bash_history 而是 ${HISTFILE}。 (20认同)
  • @chiliNUT:用一个空格开始你的命令(例如`vim ~/.bash_history`);以空格开头的命令通常不会被记录(参见`$HISTCONTROL`)。 (5认同)
  • 但是如何删除编辑历史文件的记录呢? (3认同)

小智 41

为了首先防止将命令添加到历史记录中,请确保环境变量HISTCONTROL在其冒号分隔的值中包含 value ignorespace,例如(添加 eg to .bashrc):

$ export HISTCONTROL=ignorespace
Run Code Online (Sandbox Code Playgroud)

这将防止任何带有前导空格的命令被添加到历史记录中。然后,您可以通过运行完全清除历史记录

$  history -c -w
  ^-- additional space character
Run Code Online (Sandbox Code Playgroud)


Jam*_*igh 34

首先,如果您将要发出的命令是敏感的、不安全的,或者您只是不需要它弄乱您的历史记录,最好/最快的方法是首先防止它进入历史记录。确保$HISTCONTROL包含ignorespace

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace
Run Code Online (Sandbox Code Playgroud)

然后使用空格继续执行历史记录中不需要的任何命令:

(bash)$  sensitive-cmd-with --password 82cf7dfe
(bash)$  rm -r... # One-off recursive remove; mustn't be accidentally repeated!
Run Code Online (Sandbox Code Playgroud)

如果您不小心将不需要的命令放入历史记录中,前提是您的 bash 会话仍处于打开状态,则该命令尚未触及磁盘。要删除历史记录中的上一个命令,请发出:

(bash)$  history -d $((HISTCMD-1))
Run Code Online (Sandbox Code Playgroud)

注意前导空格;此命令需要ignorespace,否则它只会删除自己!

如果要删除最后几个命令,找到最后一个和第一个历史编号:

(bash)$  history 5
  598  ok
  599  sensitive
  600  unsafe
  601  doesn\'t-work
  602  otherwise-unwanted
Run Code Online (Sandbox Code Playgroud)

在本例中为 602 和 599。然后发出:

(bash)$  for i in {602..599}; do history -d $i; done
Run Code Online (Sandbox Code Playgroud)

(没有ignorespace,它将是 603..599。)

如果您不希望当前会话中的任何历史记录访​​问磁盘,请使用以下命令退出:

(bash)$ kill -9 $$
Run Code Online (Sandbox Code Playgroud)

到目前为止的方法是甚至不让敏感的历史项目写入磁盘以提高安全性,因为理论上从非易失性介质中删除的数据仍然可以恢复。

但是,如果您要删除的命令来自前一个会话,则它们将已附加到$HISTFILE退出时。使用上述命令操作历史记录仍然只会在退出时剩余的项目附加$HISTFILE, 。为了覆盖了与本届会议的观点,整个的历史,现在,问题:$HISTFILE

(bash)$  history -w
Run Code Online (Sandbox Code Playgroud)

当然,对于磁盘上已经存在的历史项目,使用history -d命令编辑历史然后发出的替代方法history -w$HISTFILE使用文本编辑器进行编辑。


F. *_*uri 18

几种技术:

防止敏感信息存储在历史文件中

如果您在命令行上输入了一些密码,然后意识到所有命令都已记录,您可以:

  1. 强制退出当前会话而不保存历史记录:

     kill -9 $$
    
    Run Code Online (Sandbox Code Playgroud)

    这将删除所有当前历史记录。

  2. ? (up arrow)在打开的 bash 会话中键入,直到显示敏感信息,然后使用像Ctrl+这样的行编辑键W删除敏感信息,然后 ? (down arrow)直到提示新的空行,然后键入Enter.

从历史文件中删除敏感信息

如果您意识到敏感信息已被存储,并且您想删除它,但不是您的整个历史记录:

一个简单的sed命令可以完成这项工作:

sed -e '/SeNsItIvE InFo/d' -i .bash_history
Run Code Online (Sandbox Code Playgroud)

但是,当您键入此内容时,您会创建另一个历史记录行,其中包含您尝试删除的搜索模式(敏感信息)。所以你可以:

sed -e "/$(head -n1)/d" -i .bash_history
Run Code Online (Sandbox Code Playgroud)

这将head -n1使用来自终端的输入运行。会出现你的终端挂了(不会有提示);只需键入要从文件中删除的信息。这是一个技巧,可以让您输入(部分)命令而不实际将其输入到命令行中,从而使其没有资格包含在历史记录中。然后sed将使用您输入的文本搜索.bash_history 并删除所有包含敏感信息的行。注意:如果您的敏感信息模式包含斜杠,则必须使用反斜杠对其进行转义,否则更改sed命令以使用此语法指定一个未出现在模式中的分隔符:

sed -e "\|$(head -n1)|d" -i .bash_history
Run Code Online (Sandbox Code Playgroud)

另一种方法是只删除敏感信息,但保留包含信息的命令。为此,您可以简单地用您选择的替代文本替换敏感信息:

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.
Run Code Online (Sandbox Code Playgroud)

从特定树中的任何文件中删除敏感信息

最后,确保这不会留在另一个被遗忘的文件中:

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"
Run Code Online (Sandbox Code Playgroud)

将列出所有相关文件。

find . -type f -print0 |
    xargs -0 grep -lZ "$SENSITIVEINFO" |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i
Run Code Online (Sandbox Code Playgroud)

将替换以 为根目录树中所有文件中出现的所有敏感信息.。注意:即使此命令使用xargs -0,它也不会处理名称中带有换行符的文件。


小智 12

↑ (up arrow)直到它出现,找到要删除的行,然后按Ctrl+ U。那应该删除该行。

如果您使用该history命令,您可以看到该行已被星号替换。

  • 实际上,我认为您必须将光标移至该行,按 Ctrl+U,_然后将光标向上或向下移至另一行_(可能是列表底部的空白行)。此外,严格来说,该行没有被星号取代。相反,该命令已被删除,并且_history number_ 已附加一个`*`。 (2认同)
  • 使用 Ctrl+R(反向增量历史搜索),这会变得更强大,然后例如 [End], Ctrl+U (2认同)

小智 5

如果你需要同时删除几行,我通常使用这个:

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'
Run Code Online (Sandbox Code Playgroud)

如果您需要删除最后一个命令,您可以使用:

history -d $((HISTCMD-2))
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很有效,但是`history | grep &lt;string&gt;` 仍然显示它声称要删除的所有行... (2认同)