您可以使用命令行分两步实现从历史文件中删除。
1.输入history -d <line_number>
从内存中的历史记录中删除指定行。
2. 输入history -w
将当前内存中的历史记录写入~/.bash_history
文件。
这两个步骤一起从内存中的history和.bash_history文件中永久地删除该行。
首先,如果你要发出的命令是敏感的、不安全的,或者你只是不需要它在你的历史记录中杂乱无章,那么最好/最快捷的办法就是一开始就阻止它进入历史记录。确保$HISTCONTROL
包含ignorespace
。
(bash)$ echo $HISTCONTROL
ignoredups:ignorespace
然后继续执行任何你不希望出现在历史中的命令,并加上一个空格:
(bash)$ sensitive-cmd-with --password 82cf7dfe
(bash)$ rm -r... # One-off recursive remove; mustn't be accidentally repeated!
如果你不小心把一个不需要的命令放到了历史中,只要你的bash会话还在打开,这个命令就还没有进入磁盘。要删除历史中的前一条命令,请发出:
(bash)$ history -d $((HISTCMD-1))
注意前面的空格,这条命令需要ignorespace
,否则就会自己删除!
如果你想删除最后几条命令,找到最后和第一个历史编号:
(bash)$ history 5
598 ok
599 sensitive
600 unsafe
601 doesn
本例中是602和599。然后发出:
(bash)$ for i in {602..599}; do history -d $i; done “`
(没有ignorespace
,就是603…599。)
如果你不想让当前会话中的任何历史记录进入磁盘,请使用退出。
(bash)$ kill -9 $$
到目前为止,我们的做法是甚至不让敏感的历史记录被写入磁盘,以增加安全性,因为理论上,从非易失性介质中删除的数据仍然可以恢复。
然而,如果你想删除的命令来自于之前的会话,那么在退出时,它们已经被附加到$HISTFILE
上了。使用上述命令来操作历史,仍然只会在退出时将剩余的新项目追加到$HISTFILE
。要用当前会话的全部历史视图覆盖 $HISTFILE
,现在,发出:
(bash)$ history -w
当然,对于已经在磁盘上的历史项目,用 history -d
命令编辑历史然后发出 history -w
的替代方法是用文本编辑器编辑 $HISTFILE
。t-work
602 otherwise-unwanted
”`
本例中是602和599。然后发出:
0x1&
(没有0x6&,就是603…599。)
如果你不想让当前会话中的任何历史记录进入磁盘,请使用退出。
0x1&
到目前为止,我们的做法是甚至不让敏感的历史记录被写入磁盘,以增加安全性,因为理论上,从非易失性介质中删除的数据仍然可以恢复。
然而,如果你想删除的命令来自于之前的会话,那么在退出时,它们已经被附加到0x6&上了。使用上述命令来操作历史,仍然只会在退出时将剩余的新项目追加到0x6&。要用当前会话的全部历史视图覆盖 0x6&,现在,发出:
0x1&
当然,对于已经在磁盘上的历史项目,用 0x6& 命令编辑历史然后发出 0x6& 的替代方法是用文本编辑器编辑 0x6&。
几种技术。
如果你在命令行输入了一些密码,然后发现所有的命令都被记录下来,你可以: 1:
1.强制退出当前会话,不保存历史记录。
如果你意识到敏感信息已经被存储,你想删除它,但不是你的整个历史记录。
一个简单的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 -l "$SENSITIVEINFO" |
tr \n \0 |
xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i
将替换所有在.
根目录树中的文件中出现的敏感信息。注意:即使该命令使用xargs -0
,它也不会处理名称中带有换行符的文件。
找到你要删除的行,按↑(向上箭头)直到出现,然后按Ctrl+U。这样就可以删除该行。
如果你使用history
命令,你可以看到该行已经被星号代替。
如果你需要从历史记录中删除一系列的行,下面的bash函数可以为你节省一些时间:
function histdel() {
[$# -eq 1] && history -d "$1" && history -w
if [$# -eq 2 -a "$1" -le "$2"]; then
for n in `seq "$2" "$1"`; do
history -d "$n"
done
history -w
fi
}
函数通常应该加到$HOME/.bashrc
。要立即使用这个函数,你需要让你正在运行的shell再次读取该文件(. $HOME/.bashrc
)。然后从历史记录中删除例如命令200-210。
$ histdel 200 210
(注意: 如果你搜索从bash历史记录中删除一系列命令,这个问题是搜索结果的前几位。) 所以,虽然以上内容超出了问题的要求,但对一些读者来说,可能是有用的)。)
只要试试这些,
$ history
这将显示历史和命令的id,例如:
. 211 ls 212 javac Welcome.java 213 java welcome .
使用,
$ history -d 211
这里211是历史的id。现在用
$ history
. . 211 javac Welcome.java 212 java welcome . .
我知道这个问题已经很久没有人问过了,也没有人回答,但是我给你看看我清理历史文件和同时注销的方法。
我运行 :history -w && nano "${HISTFILE}" && history -c && exit
它的作用很简单:
history -w
: 将缓存的历史记录写入"${HISTFILE}"
里面 2. nano "${HISTFILE}"
: 允许我编辑"${HISTFILE}"
你可以使用sed脚本或其他你想清理"${HISTFILE}"
history -c
: 清除缓存的历史记录,所以最后这条命令不会被附加。exit
: 注销我的缓存历史……但它是空的;) 在这条命令之后,你将以一个干净的历史文件注销。登录检查你的历史记录;)
希望能帮到大家。