我经常使用Terminal,有时我正在运行命令,这不是我不希望别人看到的东西,但是如果我不小心将箭头指向并不小心执行了更多命令,将会造成很多麻烦。 >
所以我想知道是否存在或可以建立某种终端“隐身模式”,该模式使我能够在执行某些命令时停止记录我的历史记录,然后仅开始记录在我再次执行“开始记录历史记录”命令并退出“隐身模式”后,还是只是重新启动终端机?

,因为我后来发现自己要从.bash_history中删除东西,如果我本可以先停止它的录制,或者至少让它尝试将其录制在一个不允许录制的地方,最后最终不录制它,则容易得多。

评论

好吧,想必您对其他人会阅读您的历史感到偏执吗?

@Sparhawk:好吧,部分原因是,我不想在将来仅仅提起派对时不小心执行可能致命的维护命令! :D

只需补充一点,您不必为自己辩护:“这不是我不希望别人看到的东西”。对我来说,那也是一个完全合理的理由。 (尤其是在这个时代,每个人都试图让您因“藏有东西”而内)

如果打开两个选项卡,则在第一个选项卡中执行操作,在第二个选项卡中执行操作,然后在第一个选项卡之前关闭第二个选项卡,似乎只有第一个选项卡的历史记录才会写入.bash_history。 (Ubuntu 15.04损坏了终端,很幸运,这是一个实时USB。)

在serverfault上看到此问题

#1 楼

运行命令而不将其放在历史记录中:
只需在命令前放置一个空格即可。 Bash将忽略带有前缀空格的命令:
示例:空格echo "Some secret text"
注意:仅当HISTCONTROL变量设置为ignorespaceignoreboth时,此方法才有效。

运行Space set +o history或Space shopt -uo history以禁用历史记录。
运行set -o historyshopt -so history以再次启用历史记录。


禁用当前会话的历史记录(赢得)不会记住会话中的任何命令):
unset HISTFILE

注意:在关闭终端之前,您将能够看到按Up的命令。

从中删除命令历史记录:
运行空间history | grep "part of your secret command"
将以以下格式显示以前运行的命令列表:
user@host:~$  history | grep pkill
  302  pkill $$
  467  pkill gone-cal
  468  pkill actionaz
  500  pkill chrome
  550  pkill super

在命令左侧选择条目号。您可以使用Ctrl + Shift + C复制它
运行空间history -d <number>,其中<number>是要删除条目的条目号。
您可以使用Ctrl + Shift + V


粘贴该号码。 >其他有趣的答案:

@echristopherson
@MoithilBiswas
@dolt


评论


如果使用history -d删除行,则将删除该行的内容,但是您永远无法删除运行history -d的事实(除非您在运行history -d之前先使用set + o history)

– AJFaraday
15年5月18日在15:38



它只是让我想起了超级禁令逻辑,仅此而已;)

– AJFaraday
2015年5月18日下午16:00

(OT)禁令是法律文件,禁止人们发表某些东西。超级禁令还阻止他们发布事实,即他们被拒绝具有发布能力。一些合理的论点询问他们是否可以发布自己被拒绝发布某些信息的能力。然后,它成为一个循环参数。

– AJFaraday
15年5月18日在16:06

@Helio我认为最好让用户知道“正确”的复制方式-特别是如果他们不小心去选择一些文本的话。我不确定该怎么做,也许还要澄清一下那里的空间? [空格]在我看来有点笨拙...

– Tim
15年5月18日在19:55



未设置的HISTFILE方法还可以追溯到尚未写入.bash_history的所有命令。

–卡巴斯德
2015年5月19日在14:23

#2 楼

您可以在工作后通过添加命令history -cw来简单地删除一个特定终端会话的历史记录。

在发出此命令之前请勿关闭终端。

评论


这样会不会删除所有历史记录?

– 0x2b3bfa0
15年5月19日在16:54

这只会删除该特定终端会话的历史记录。

– Moithil Biswas
15年5月19日在20:42

#3 楼

shopt -uo history应该是最好的选择。这对您来说可能不是一件积极的事情,但是考虑到您的提及,我想您想要更好的东西。更改HISTFILE历史记录设置将阻止触发整个历史记录机制。

您可以使用shopt重新打开登录(shopt -so history-s分别已设置和未设置)。

注意该命令本身可能会被记录,因此在清除变量之前,请在命令前面加上一个空格以阻止其添加到历史记录中。

#4 楼

无需登录到历史文件即可杀死当前shell的另一种方法是:

kill -9 $$


这会导致bash(可能还有其他shell)将SIGKILL信号发送到本身,当场将其杀死并阻止其将任何内容写入磁盘。

评论


也就是“朝自己的头部射击” :)。这样做的好处是,您在编写命令之前无需记住要做任何事情。

–圭多
15年5月23日在18:30

我将zsh与增量历史记录一起使用,因此我怀疑这种情况是否对我而言有效

–Wayne Werner
2015年9月15日12:20在

#5 楼

要临时禁用当前会话的命令历史记录,可以临时取消设置HISTFILE环境变量。

unset HISTFILE


在会话处于活动状态时,您可以照常访问历史记录,但不会保存到磁盘。

在同一会话中进行反向操作(所有更改将被记录)

HISTFILE=$HOME/.bash_history


评论


在当前会话中,有没有简单的方法可以扭转这种情况并使之继续下去?

–user364819
15年5月18日在15:04

@ParanoidPanda我添加了一个在当前会话中还原的命令。

–布鲁尼
15年5月18日在15:14

@ParanoidPanda:为什么需要一个命令在当前会话上再次设置HISTFILE?如果您撤消更改(即使在运行secret命令之后),则在您退出时它们将被存储到历史记录中。

– 0x2b3bfa0
15年5月18日在16:17

@Helio:哦,不,我的意思是会再次开始记录的命令,但不保存我不希望保存的命令。

–user364819
15年5月18日在16:29

@ ParanoidPanda,Helio似乎是正确的,因为历史记录在退出时保存。我没有考虑过那个。

–布鲁尼
15年5月18日在17:47

#6 楼

您可以在当前Shell会话中修改历史记录行。如果您浏览历史记录(例如使用Up或Ctrl + P)并在不执行的情况下更改了一行,则只会保存该行的修改版本。您可以按自己喜欢的任何方式进行修改;不错的选择包括使用Ctrl + U完全空白行或使用Esc#在开头添加一个#注释字符。

要在不执行任何操作的情况下留下一行,请记住不要按Return键(输入)。我要做的是通过Esc>返回历史上的最新行。

(代替Esc后跟>,在大多数终端中,您可以按住Alt并按>; Esc#建议也是如此以上)。

注意:您不能通过这种方式永久修改以前会话中的条目。这些更改将不会在会话结束时应用于HISTFILE

#7 楼

您还可以将.bash_history设为只读。我先清空文件,然后执行以下操作:

 chattr +i .bash_history


#8 楼

您可以在屏幕会话中执行敏感命令,然后在完成会话后将其销毁。

或者,您可以使该屏幕会话保持活动状态,但仍处于分离状态,并且仅在您实际希望执行该操作时才可以访问它。能够向上箭头查看否则会很危险的命令。

#9 楼

我个人使用mksh,并且此外壳默认情况下没有历史文件。这意味着您可以启动其他外壳程序,例如mkshdash(默认情况下会出现),以运行您不希望用户看到的命令,并在完成后退出。 bash历史记录只会记录您启动了其他Shell,仅此而已。

#10 楼

您还可以使用终端多路复用器,例如tmuxscreen。因此在tmuxscreen下不会保存历史记录。