从〜/ .bash_history删除历史记录


8

我对存储在中的终端或命令行历史记录有一些疑问~/.bash_history

  1. 我可以使用history命令在终端中看到该文件,但是如果尝试使用gedit bash_history该文件打开该文件,则该文件完全为空。为什么?

  2. 我发现了如何使用以下代码行从终端中删除文件中一定数量的行:

    for i in {1..N}; do history -d N; done

    其中N是要删除的行(或命令)的数量,但是现在历史记录文件显示了最后一个命令,如果您试图掩盖内容,那并不是很聪明。因此,问题是:我该如何给出最后一个代码行并确保未记录该行?



为了将来注意,如果您以空格开头的任何命令,该命令将不会保存在您的历史记录中。
帕迪·兰道

Answers:


18
  1. 您只是忘记了前面的点,打开(bash)终端历史文件的命令是

    gedit ~/.bash_history

    仅在关闭终端时才更新此文件。

  2. 要从此文件中删除最后10行并且不记录此命令本身,请打开一个新终端并执行以下命令链:

    sed -n -e :a -e '1,10!{P;N;D;};N;ba' ~/.bash_history && history -c && exit

    要么

    for i in {1..10}; do sed -i '$d' ~/.bash_history; done && history -c && exit

    要么

    head -n -10 ~/.bash_history > ~/.b_h_2 && mv ~/.b_h_2 ~/.bash_history && history -c && exit

    sedhead分别从中删除选定的行~/.bash_historyhistory -c清除并exit关闭终端的历史记录。


for+的更短且希望更快的替代方法sedhead -n -N其中大写字母N是要删除的行数。stackoverflow.com/a/13380679/711006
Melebius

2
@Melebius看起来很有希望,但是如何将输出重定向到覆盖它的输入文件?head -n -N testfile > testfile只是清除文件!我添加了一种解决方法,但是它肯定不会更短。
甜点,

没错,我忘了head不能像那样就地工作sed。我主要是在寻找单个sed命令来替换您的for循环。我链接的页面上有一些选项,但是看起来不像您的代码那样容易理解。
Melebius

@Melebius参见sed1line.txt –我在上面添加了它,它并不是真的更短,但是应该更快。
甜点

4

bash_history文件是一个隐藏文件,以点开头。你需要做

gedit ~/.bash_history

这将在gedit中打开文件。


1

如果您只想删除命令日志的某些部分,那么上述方法就可以了。如果要停止特定bash会话的命令记录,请发出命令

unset HISTFILE

更激烈的是,如果您不想记录任何命令,则可以执行

rm ~/.bash_history
ln -s /dev/null ~/.bash_history

请注意,第一种方法仅对单个会话有效,而第二种方法将停止所有未来会话的命令记录。


1

我意识到这已经有了一个可以接受的答案,但这就是我从80年代以来一直在做的事情。这是隐藏曲目的好方法,而且是一种多阶段的方法。在大多数情况下,除非真正关注它,否则它不会被注意到。这是如何完成的。

打开终端/外壳/会话并执行以下操作:

 chmod 444 ~/.bash_history

退出外壳程序打开终端/外壳程序/会话并执行以下操作:这是一些永久删除历史记录的创新方法

1:

 vi ~/.bash_history
 9999999 dd
 <esc>wq!

2(创建伪造的历史记录)

 sudo echo "which ls" > ~/.bash_history
 sudo echo "cd ~/;ls" >> ~/.bash_history

然后采取良好措施:

 chmod 444 ~/.bash_history

退出外壳

打开一个新的外壳并输入

 history

使其不那么引人注意的是,如果执行ls -ratl,〜/ .bash_history最终将消失在目录列表的混乱中。它不会显示为会引起不必要关注的链接。大多数人在其根目录上都没有-a,这在需要仿真时很有用。

这种方法的缺点是您无法返回和检索历史记录。实际的〜/ .bash_history文件也可能会出现在目录列表的顶部,因为随着时间的推移,它的结尾可能是一个很旧的修改日期,这本身可能会导致发现某些问题。


如果您用于9999999 dd删除文件中的所有行,则效果更好:%d:1,$d或者dG是效果更好
phuclv

0

1)运行sh; 这产生了灰烬的子壳,它根本不记录历史。从那里编辑

2)将行添加HISTCONTROL=ignoreboth.bashrc,并exec bash做为用重新初始化的外壳永久替换当前的外壳,然后执行所有您不想使用前导空格记录的命令。


0

由于我还不能发表评论,因此将我的评论添加为答案:

man history 会回答一切。

#1的答案是历史记录正在记忆中。history -a立即保存到文件。history -w也会保存,但可能会弄乱其他会话。

答案2:history -a,gedit,删除所需的行,history -r


0

在您退出外壳程序之前,不会保存历史记录。尝试注销外壳程序,然后再次查看.bash_history。命令历史记录应该在其中。


按建议编辑,现在足够好了吗?
闪电追猎者
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.