history
我怎样才能从数据库中删除某一行?
答案1
您需要注销并重新登录或运行history -a
,以便将当前历史记录提交到磁盘。
然后只需编辑该文件即可~/.bash_history
。
答案2
您可以使用命令行分两步从历史文件中删除:
- 打字
history -d <line_number>
会从内存的历史记录中删除指定的行。 - 打字会将
history -w
当前内存中的历史记录写入文件~/.bash_history
。
这两个步骤一起从内存中永久删除该行历史并从.bash_history文件也是如此。
答案3
到防止首先,要阻止将命令添加到历史记录中,请确保环境变量HISTCONTROL
在其以冒号分隔的值中包含值ignorespace
,例如(将例如添加到.bashrc
):
$ export HISTCONTROL=ignorespace
这将阻止任何以空格开头的命令被添加到历史记录中。然后,您可以通过运行以下命令完全清除历史记录
$ history -c -w
^-- additional space character
答案4
几种技术:
防止敏感信息存储在历史文件中
如果您在命令行上输入了密码,然后意识到所有命令都已记录,您可以:
强制退出当前会话而不保存历史记录:
kill -9 $$
这将删除所有当前历史记录。
正如正确指出的那样S0AndS0'评论,另一种方法是修改历史文件名:
HISTFILE=
在打开的 bash 会话中输入内容↑ (up arrow),直到显示敏感信息,然后使用行编辑键(如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 -lZ "$SENSITIVEINFO" |
xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i
将替换以 为根目录树中的所有文件中出现的所有敏感信息.
。注意:即使此命令使用xargs -0
,它也不会处理名称中带有换行符的文件。