终端“隐身模式”?


230

我经常使用Terminal,有时我正在运行命令,这不是我不希望其他人看到的东西,但是如果我不小心将箭头指向并意外执行了更多命令,将会造成很多麻烦。

因此,我想知道是否存在或可以建立某种终端“隐身模式”,该模式可让我在执行某些命令时停止记录我的历史记录,然后仅在执行重新开始记录历史记录命令并退出“隐身模式”,还是我只是重新启动终端?

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


6
好了,想必你是偏执狂,你的历史将被别人看到?
Sparhawk

6
@Sparhawk:好吧,部分原因是,我不想在将来只是大肆宣传时,不愿意执行可能致命的维护命令!:D

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

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

1
看到这个问题serverfault
吕克中号

Answers:


265

运行命令而不将其记录在历史记录中:

只需在命令前放置一个空格即可。Bash将忽略带有前置空格的命令:

例: Spaceecho "Some secret text"

注意:仅当HISTCONTROL变量设置为ignorespace或时,此方法才有效ignoreboth


暂时停用历史记录:

  • 运行Spaceset +o historySpaceshopt -uo history禁用历史记录。
  • 运行set -o historyshopt -so history再次启用它。

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

unset HISTFILE

注意:在Up关闭终端之前,您将可以看到正在按下的命令。


从历史记录中删除命令:

Spacehistory | grep "part of your secret command"

它将以以下格式显示以前运行的命令列表:

casa@portátil:~$  history | grep pkill
  302  pkill $$
  467  pkill gone-cal
  468  pkill actionaz
  500  pkill chrome
  550  pkill super

选择命令左侧的条目号。您可以使用Ctrl+ Shift+ 复制它C

输入条目编号Spacehistory -d <number>在哪里运行<number>以删除该条目。
您可以使用Ctrl+ Shift+ 粘贴该号码V


其他有趣的答案:


7
如果您用于history -d删除行,则会删除该行的内容,但是您永远无法删除自己已运行的事实history -d(除非您先set +o history运行,然后再运行history -d
AJFaraday 2015年

1
这只是让我想起了超级禁令逻辑,仅此
而已

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

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

2
unset HISTFILE方法还可以追溯到尚未写入的所有命令.bash_history
卡巴斯德(Kasperd)


28

shopt -uo history 应该做到最好。

HISTFILE(et al)变量进行裸操作不会停止您的Up历史记录,只会将其推入磁盘。这对您来说可能不是一件积极的事情,但是考虑到您的提及,我想您想要更好的东西。更改shopt历史记录设置将阻止触发整个历史记录机制。

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

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


17

不登录到历史文件而杀死当前shell的另一种方法是:

kill -9 $$

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


7
又名“拍自己的头” :)。这样做的好处是,您在编写命令之前无需记住要做任何事情。
Guido 2015年

3
我使用zsh进行增量历史记录写入,因此我怀疑这是否适合我的情况
Wayne Werner 2015年

13

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

unset HISTFILE

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

在同一会话中撤消(所有更改将被记录)

HISTFILE=$HOME/.bash_history

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

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

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

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

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

10

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

要留下一行而不执行该行,请记住不要打ReturnEnter)。我要做的是通过返回历史上的最新行Esc>

(在大多数终端机中,您可以按住并按而不是Esc紧接着的;上述建议也是如此。)>Alt>Esc#

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


6

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

 chattr +i .bash_history

5

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

或者,您可以使该屏幕会话保持活动状态但仍处于断开状态,并且仅在您确实希望能够向上箭头键才能访问该屏幕会话时,才可以访问该会话,否则该命令很危险。


1

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


1

您也可以使用终端复用器,例如tmuxscreen。因此,根据tmuxscreen历史记录将不会保存。

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.