执行命令而不将其保留在历史记录中


203

我想执行一些命令,但不想将它们存储在命令历史记录中。这样,没人能在.bash_history文件中搜索它。

有什么办法可以这样执行bash命令吗?


13
这个问题可能应该移到ServerFault上,因为它不是“编程”,而是“服务器管理员”-但是感谢您提出的问题/答案,正是我所需要的!
2014年

Answers:


294

用空格开始命令,该命令不会包含在历史记录中。

请注意,这确实需要设置环境变量$HISTCONTROL

  • 检查以下命令是否返回ignorespaceignoreboth

    #> echo $HISTCONTROL
  • 要添加缺少的环境变量,可以将以下行添加到bash配置文件中。例如%HOME/.bashrc

    export HISTCONTROL=ignorespace

重新提供配置文件后,将不会将带有空格前缀的命令写入 $HISTFILE


20
除非$ HISTCONTROL中包含了ignorespace,否则这将不起作用-尽管这在大多数系统上可能是默认设置。
pgl

2
正确。有关更多详细信息,OP应该在bash手册页中查看HISTCONTROL和HISTIGNORE。
u-punkt

2
thegeekstuff.com/2008/08/…-此处提供了更多bash历史提示,包括这种从历史中隐藏命令的方法
user379997 2011年

52

在任何给定的Bash会话中,通过键入以下命令将历史记录文件设置为/ dev / null:

export HISTFILE=/dev/null

请注意,正如注释中指出的那样,这不会将该会话中的任何命令写入历史记录!

请不要惹您系统管理员的辛勤工作;)

Doodad的解决方案更为优雅。只需取消设置变量:(unset HISTFILE谢谢!)


5
这将防止记录所有命令。这不是发问者想要的。
Noufal Ibrahim 2011年

12
这给我造成了与/dev/null注销时将权限设置为0600有关的问题。相反,我用了unset HISTFILE
Doodad 2014年


21

@John Doe和@ user3270492答案的扩展。但是,这似乎对我有用。

<your_secret_command>; history -d $((HISTCMD-1))

您不应在历史记录中看到该命令的条目。

这是解释。

'history -d'从历史记录中删除提及的条目。

HISTCMD存储下一个要执行的命令号。因此,(HISTCMD-1)指的是最后执行的命令。

从Bash历史记录文件中删除某行


不幸的是,这对我没有用。
Magick

10

您可能会考虑使用没有历史记录的shell,例如

/bin/sh << END
   your commands without history
END

(或许/bin/dash还是/bin/sash能比更合适/bin/sh

甚至更好地使用批处理实用程序,例如

batch << EOB
   your commands
EOB

历史将包含shbatch不是很有意义


8

您可以通过以下方式开始会话

export HISTFILE=/dev/null ;history -d $(history 1)

然后继续潜行。将histfile设置为/dev/null会被记录到历史文件中,但是该条目将被轻易删除,并且不会显示任何痕迹(至少在历史文件中)。

而且,这是非永久性的。


这已经回答了很多遍了。您会说什么,您的答案会增加该线程(无用的噪音除外)?
gniourf_gniourf

它不是在一个答案中组合在一起,以免命令本身出现在历史记录中,也不会显示任何随后输入的内容。
基督教徒

1
但是现在这个线程真是一团糟!在这种情况下,尤其是对于这样一个老问题,我认为最好编辑已经存在的好答案,和/或发表评论……
gniourf_gniourf

5

正如Doodad在comments中提到的那样unset HISTFILE它做得很好,但如果您还想删除一些历史记录,则要echo $HISTFILE获取历史记录文件的位置(通常是~/.bash_historyunset HISTFILE,然后进行编辑~/.bash_history(或其他任何操作HISTFILE-当然,现在unset可以了,所以您可以'没看过)。

$ echo $HISTFILE       # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # Or your preferred editor

然后,您已经编辑了历史记录,并编辑了它!


在以下版本上进行了尝试:GNU bash,版本3.2.57(1)-发行版(x86_64-apple-darwin15),它不起作用。取消设置历史记录后,我使用的命令存储在〜/ .bash_history
Krystian

@Krystian我的错误-我写了“ unset HISTORY”,但应该是“ unset HISTFILE”-已更正。现在可以用吗?它适用于GNU bash版本4.3.30(1)-发行版(x86_64-pc-linux-gnu)。
drkvogel

好吧,我不确定。简单测试:unset HISTFILE; echo TEST; history将为您提供从上至下的命令echo TEST。尽管在终止会话并再次连接后,历史记录确实没有此条目。所以我会说它有效:)
Krystian

unset HISTFILE似乎并没有阻止命令记录在内存的历史记录中,但是它确实阻止了命令被记录在$ HISTFILE文件中。因此,我想您的内存中仍保留有本地历史记录,但是现在不再将其记录在文件中,这可能是您想要的!;)
drkvogel

4

您还可以使用以下命令:

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

我认为这是一个非常可移植的命令。


我已经从中创建了别名:alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"现在您可以执行以下操作:mysql -uroot -pSecretPassword ; forget
sobi3ch

1
抱歉,但是我意识到您需要创建函数而不是别名,因为引号会更改$ssed和其他内容的含义。function forget() { // put code here // }
sobi3ch

3

如果使用的是zsh,则可以运行:

setopt histignorespace

设置后,每个以空格开头的命令将从历史记录中排除。

您可以使用别名.zshrc关闭此开/关

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'

很好,但是这个问题专门标记为bash
Tripleee'Nov

2

有几种方法可以实现此目的。这会将历史记录文件的大小设置为0:

export HISTFILESIZE=0

/dev/null会将历史记录文件设置为,从而有效地将其禁用:

export HISTFILE=/dev/null

对于单个命令,可以在命令前面加上一个空格,并且不会将其保存在历史记录文件中。请注意,这要求您具有ignorespace包含在$HISTCONTROL环境变量中的值(man bash并搜索以ignorespace获取更多详细信息)。


2
这将防止记录所有命令。这不是发问者想要的。
Noufal Ibrahim 2011年

好吧,我有点假设发问者将执行他所希望的而不应该记录的所有操作后将其重置。
pgl

1

如果要删除所有历史记录,包括删除所有历史记录,这非常方便!

rm .bash_history;export HISTFILE=/dev/null;exit

0

您只需要运行:
$ set +o history

要查看更多信息,请运行:
$ man set


2
这将禁用所有未来命令的历史记录,而不是单个命令的历史记录。多数来这里的人应该改用公认的答案。
Tripleee '18

这是有效的,或者可以,但是不完整。只要我们set -x history随后添加反向命令,它就可以工作。
阿卜迪拉

0

该命令可能会派上用场。这不会记录已执行的命令

history -d $((HISTCMD-1)) && <Your Command Here>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.