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

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

history我怎样才能从数据库中删除某一行?

答案1

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

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

答案2

您可以使用命令行分两步从历史文件中删除:

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

这两个步骤一起从内存中永久删除该行历史并从.bash_history文件也是如此。

答案3

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

$ export HISTCONTROL=ignorespace

这将阻止任何以空格开头的命令被添加到历史记录中。然后,您可以通过运行以下命令完全清除历史记录

$  history -c -w
  ^-- additional space character

答案4

几种技术:

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

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

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

     kill -9 $$
    

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

    1. 正如正确指出的那样S0AndS0'评论,另一种方法是修改历史文件名

      HISTFILE=
      
  2. 在打开的 bash 会话中输入内容↑ (up arrow),直到显示敏感信息,然后使用行编辑键(如Ctrl+)W删除敏感信息,然后然后 ↓ (down arrow)直到出现新的空行,打字Enter

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

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

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

sed -e '/SeNsItIvE InFo/d' -i .bash_history

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

sed -e "/$(head -n1)/d" -i .bash_history

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

sed -e "\|$(head -n1)|d" -i .bash_history

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

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

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

最后,为了确保这种情况不会持续下去其他忘记的文件:

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

将列出所有相关文件。

find . -type f -print0 |
    xargs -0 grep -lZ "$SENSITIVEINFO" |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

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

相关内容