Answers:
您需要注销然后重新登录或运行,history -a
以便将当前历史记录提交到磁盘。
然后编辑文件~/.bash_history
。
vim ~/.bash_history
使用空格启动命令(例如)即可;以空格开头的命令通常不会被记录(请参阅参考资料$HISTCONTROL
)。
您可以通过以下两个步骤使用命令行从历史文件中删除:
history -d <line_number>
会从内存中的历史记录中删除指定的行。history -w
会将当前的内存历史记录写入~/.bash_history
文件。这两个步骤一起从内存历史记录和.bash_history文件中永久删除该行。
history -w
从历史记录中删除最后一个?
<line_number>
仅history | grep [unwanted_content]
包含所有行的列表[unwanted_content]
(如密码)。
首先,如果您要发出的命令是敏感,不安全的,或者您只是不需要它使您的历史记录变得混乱,那么最好/最快地只是阻止它首先输入历史记录。确保$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\'t-work
602 otherwise-unwanted
在这种情况下为602和599。然后发出:
(bash)$ for i in {602..599}; do history -d $i; done
(如果没有ignorespace
,则为603..599。)
如果您不希望当前会话中的任何历史记录进入磁盘,请使用以下命令退出:
(bash)$ kill -9 $$
到目前为止,这种方法甚至不让敏感的历史记录项写入磁盘以提高安全性,因为从理论上讲,从非易失性介质中删除的数据仍然可以恢复。
但是,如果您希望删除的命令来自上一个会话,则这些命令将已经附加到$HISTFILE
on出口上。与上面的命令操纵历史上还是只会追加剩余的新项目到$HISTFILE
,在退出。为了覆盖了$HISTFILE
与本届会议的观点,整个的历史,现在,问题:
(bash)$ history -w
当然,对于已经在磁盘上的历史记录项目,使用history -d
命令然后发出history -w
,编辑历史记录的替代方法是$HISTFILE
使用文本编辑器进行编辑。
$HISTFILE
,退出。”其实,这是不完全正确的。似乎只附加了从原始历史记录长度“伸出”的其余新项目。例如,如果我删除5个原始项并添加15个新项,则仅附加最后10个新项,而我希望所有15个新项都将附加。我认为这是一个错误,因为我看不到这是多么理想的功能。
几种技术:
如果您在命令行中输入了一些密码,然后意识到所有命令都已记录下来,则可以:
强制退出当前会话而不保存历史记录:
kill -9 $$
这将删除所有当前历史记录。
键入↑ (up arrow)open bash会话,直到显示敏感信息为止,然后使用行编辑键(如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 -l "$SENSITIVEINFO" |
tr \\n \\0 |
xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i
将替换根目录为的目录树中所有文件中所有敏感信息.
。注意:即使此命令使用xargs -0
,它也不会处理名称中带有换行符的文件。
如果您需要同时删除多行,通常使用以下命令:
history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'
如果需要删除最后一个命令,可以使用:
history -d $((HISTCMD-2))
history | grep <string>
仍显示它声称要删除的所有行...
history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
如果您需要从历史记录中删除一系列行,则以下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历史记录中删除一系列命令,那么这个问题就是搜索结果中排名最高的一个。因此,尽管以上内容超出了问题的要求,但对某些读者来说还是有用的。)
for
语句的替代形式:for n in $(seq "$2" "$1")
在样式上某些人更喜欢它,如果seq
不起作用,请尝试for ((n="$2"; n>="$1"; n--))
。
我知道问和回答这个问题已经有很长时间了,但是我将向您展示清除历史记录文件并同时注销的方法。
我跑:
history -w && nano "${HISTFILE}" && history -c && exit
它的作用很简单:
history -w
:将缓存的历史记录写入内部 "${HISTFILE}"
nano "${HISTFILE}"
:允许我编辑"${HISTFILE}"
您可以使用sed脚本或任何您想要清洁的内容"${HISTFILE}"
history -c
:清除缓存的历史记录,因此不会附加最后一个命令。exit
:注销附加缓存的历史记录...,但是为空;)执行完该命令后,您将使用干净的历史记录文件注销。登录以查看您的历史记录;)
我希望这会对某人有所帮助。