2012-01-31 15:43:03 +0000 2012-01-31 15:43:03 +0000
152
152

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

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

Antworten (12)

152
152
152
2012-01-31 16:09:25 +0000

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

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

这两个步骤一起从内存中的history.bash_history文件中永久地删除该行。

118
118
118
2012-01-31 16:01:05 +0000

你需要注销后再登录或运行history -a,这样当前的历史记录就会被提交到磁盘上。

然后编辑文件~/.bash_history即可。

41
41
41
2012-02-01 22:19:06 +0000

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

$ export HISTCONTROL=ignorespace

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

$ history -c -w
  ^-- additional space character
``` 来完全清除历史记录。
33
33
33
2013-06-18 16:33:19 +0000

首先,如果你要发出的命令是敏感的、不安全的,或者你只是不需要它在你的历史记录中杂乱无章,那么最好/最快捷的办法就是一开始就阻止它进入历史记录。确保$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&。

17
17
17
2013-07-19 12:50:40 +0000

几种技术。

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

如果你在命令行输入了一些密码,然后发现所有的命令都被记录下来,你可以: 1:

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

  1. 在打开的bash会话中输入↑(向上箭头),直到显示出敏感信息,然后用Ctrl+W等行编辑键删除敏感信息,再↓(向下箭头),直到提示新的空行,前**输入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 -l "$SENSITIVEINFO" |
    tr \n \0 |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

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

12
12
12
2015-04-01 16:00:26 +0000

找到你要删除的行,按↑(向上箭头)直到出现,然后按Ctrl+U。这样就可以删除该行。

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

5
5
5
2013-01-07 05:53:04 +0000

如果你需要同时删除几行,我通常会用这个方法。

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

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

history -d $((HISTCMD-2))
``` 如果你需要删除最后一条命令,你可以使用: 

0x1&
3
3
3
2012-10-26 14:09:51 +0000

如果你需要从历史记录中删除一系列的行,下面的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历史记录中删除一系列命令,这个问题是搜索结果的前几位。) 所以,虽然以上内容超出了问题的要求,但对一些读者来说,可能是有用的)。)

3
3
3
2014-03-04 11:16:04 +0000

只要试试这些,

$ history

这将显示历史和命令的id,例如:

. 211 ls 212 javac Welcome.java 213 java welcome .

使用,

$ history -d 211

这里211是历史的id。现在用

$ history

. . 211 javac Welcome.java 212 java welcome . .

3
3
3
2013-04-03 21:16:15 +0000
history | sed -i 59d

59是行号。没有比这更甜美的事情了:)

2
2
2
2015-09-30 04:57:29 +0000

我知道这个问题已经很久没有人问过了,也没有人回答,但是我给你看看我清理历史文件和同时注销的方法。

我运行 :history -w && nano "${HISTFILE}" && history -c && exit

它的作用很简单:

  1. history -w : 将缓存的历史记录写入"${HISTFILE}" 里面 2. nano "${HISTFILE}" : 允许我编辑"${HISTFILE}" 你可以使用sed脚本或其他你想清理"${HISTFILE}"
  2. history -c : 清除缓存的历史记录,所以最后这条命令不会被附加。
  3. exit : 注销我的缓存历史……但它是空的;)

在这条命令之后,你将以一个干净的历史文件注销。登录检查你的历史记录;)

希望能帮到大家。

1
1
1
2017-03-27 14:10:10 +0000

你也可以直接编辑历史文件,例如nano .bash_history如果你在bash shell中?