it-swarm.cn

暂时在给定的shell上暂停bash_history?

有没有一种方法可以暂时暂停bash中的历史记录跟踪,从而进入某种“隐身”模式?我正在终端中输入我不想记录的敏感财务信息。

128
Naftuli Kay

这应该是您要寻找的:

unset HISTFILE

来自man bash

如果未设置HISTFILE或历史记录文件不可写,则不会保存历史记录。

另外,如果要先将其关闭然后再重新打开,则使用 set 可能会更容易:

关掉

set +o history

打开

set -o history
173
SiegeX

使用bash设置HISTCONTROL="ignorespace",并在空格之前加上您不希望在历史记录中记录的任何命令。如果您忘记采取任何措施,还有history -d <number>删除特定条目,或history -c用于清除整个命令历史记录。

33
forcefsck

确保HISTCONTROL包含ignorespace。您可能需要添加HISTCONTROL=ignorespace (要么 HISTCONTROL=ignoredups:ignorespace或其他内容)到您的~/.bashrc。然后,任何以空格开头的命令行都会从历史记录中省略。

另一种可能性是启动一个不保存其历史记录的新bash会话。

$ bash
$ unset HISTFILE
$ sooper-sekret-command
$ exit
$ #back in the parent Shell
27

如果您需要避免存储多个命令,而仍然想使用向上箭头访问以前的命令,请使用:

$ bash                        # open a new session.
$ unset HISTFILE              # avoid recording commands to file.
$ commands not recorded
.
.
$ exit
$

有四种方法(级别)来控制命令的存储方式。

  1. 第一个也是最简单的方法是使用ignorespace(或ignoreboth):

    $ HISTCONTROL="ignorespace${HISTCONTROL:+:$HISTCONTROL}"
    

    这样可以在要避免记录在history的内存列表中的命令之前使用空格。因此,由于在内存中没有记录可发送到文件的命令,因此也将避免one命令发送到$HISFILE中列出的文件。

  2. 避免将命令记录到$HISTFILE中的文件:

    $ unset HISTFILE
    

    如果未设置,则退出命令行管理程序时不会保存命令历史记录。

    HISTFILE=''和/或设置为HISTFILE=/dev/null的效果相同。了解仍然有命令记录在内存列表中,请尝试history命令或向上箭头。

    警告:如果在命令行管理程序存在之前重置HISTFILE,则无论如何,所有记录在内存中的内容都可以写入该文件。

  3. 避免将new命令记录到内存中的历史记录列表中。并且,由于不在内存中,因此无法记录到文件中。

    $ shopt -ou history              # or set +o history
    

    重新启用shopt -os history(或set -o history

  4. 从中删除所有命令到内存中的历史记录列表:

    $ HISTSIZE=0
    

    所有命令(从内存中)都将被擦除,因此,毫无疑问,什么也不会存储到文件中,直到将变量再次设置为某个有效的数值为止。

6
Isaac

关闭历史记录有一种简单的方法,因此命令不会存储在.bash_history文件。

您必须将空格或制表符空格放在任何命令的前面,以便该命令不会存储在历史记录中。例如:

$ ls 
print the list of file 
$ history 
ls
history

$  pwd
print the current  working directory 
$ history 
ls
history

pwd命令不会存储在历史记录中,因为它的前面有空格。

3
Kalanidhi M.
export HISTFILE=/dev/null 

那是我的后路。万一未设置的HISTORY/HISTFILE/HISTCONTROL等...不起作用,将其导出到/ dev/null总是对我有用。

2
Ambrose

让SiegeX的答案更进一步,真正使它进入隐身模式...

免责声明:标题内容可能会在gnome-terminal上运行。因为我很懒,所以仅在Linux Mint 19.3/Gnome Terminal 3.28.1中进行了测试。

将以下内容添加到~/.bash_functions(假设您是通过.bashrc/.profile等导入):

function setGnomeTerminalTitle() {
    local NEW_TITLE="$1";
    PS1="\[\e]0;${NEW_TITLE}\a\]\${debian_chroot:+(\$debian_chroot)}\[\033[01;32m\]\[email protected]\h\[\033[00m\] \[\033[01;34m\]\w \$\[\033[00m\]";
}

然后将以下内容添加到~/.bash_aliases中(再次假设您是通过.bashrc/.profile等导入):

alias title="setGnomeTerminalTitle";
alias hist='history'
alias histoff="setGnomeTerminalTitle 'Incognito Window' && set +o history"
alias histon="setGnomeTerminalTitle \"[email protected]$HOSTNAME:\${PWD//\${HOME//\\//\\\\\\/}/\\~}\" && set -o history"

编辑:解释histon标题的内容-gnome-terminal中的窗口标题通常为“ $ USER @ $ HOSTNAME:$ {PWD}”,除了如果您位于主文件夹/ home/foo中,它会显示为~;至少它在我的计算机上。此命令使用bash字符串替换来消除$HOME中的斜杠,因此我们得到\/home\/foo,然后依次将其用作正则表达式以将$PWD中的模式替换为文字~ ...,然后在顶部添加一串转义符,以使其用作双引号字符串中的别名。

现在,当您输入histoff时,您将在隐身模式下更改标题,并且该窗口中该会话的历史记录也将停止(单词histoff仍被记录,但之后没有任何记录)。如果然后键入histon,它将还原标题,并且不记录histoff以后的所有行,直到_histon所在的行都包括在内,但会记录histon之后的所有行。

例:

## this is still logged
histoff  

## this is NOT logged
echo "my password is: password";
fake_ua='If firefox and curl had a child, would it be named furl?';
curl -A "$fake_ua" https://www.itsnotap0rnsiteipromise.com/curvy-girlz/;

vi ~/Documents/maths/super-secret-squirrel/gift-ideas.txt

## this is still NOT logged
histon

## this is logged again
Sudo apt install -y kmag;

0
zpangwin