Pap*_*ern 158
您可以通过两个步骤使用命令行从历史文件中删除:
history -d <line_number>
会从内存中的历史记录中删除指定的行。history -w
会将当前内存中的历史记录写入~/.bash_history
文件。这两个步骤一起从内存历史记录和.bash_history文件中永久删除该行。
cYr*_*rus 134
您需要注销并重新登录或运行,history -a
以便将当前历史记录提交到磁盘。
然后只需编辑文件~/.bash_history
。
小智 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
几种技术:
如果您在命令行上输入了一些密码,然后意识到所有命令都已记录,您可以:
强制退出当前会话而不保存历史记录:
kill -9 $$
Run Code Online (Sandbox Code Playgroud)
这将删除所有当前历史记录。
? (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
命令,您可以看到该行已被星号替换。
小智 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)