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

#1 楼

这应该是您要查找的内容:

unset HISTFILE


来自man bash



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


或者,如果要先将其关闭然后再次打开,则使用set可能会更容易:

关闭

set +o history


打开

set -o history


评论


仅当bash退出时才检查HISTFILE的值,因此第一种方法不能按原样工作(如果还原该值,则将保存该命令)。设置+ o历史记录确实按照指示进行。

–吉尔斯'所以-不再是邪恶的'
2011年4月8日在20:10

谢谢,太好了。在执行秘密操作时,我将使用set + o历史记录和set -o历史记录来回切换;)

– Naftuli Kay
2011年4月8日23:38

未设置HISTFILE不起作用。设置-/ + o历史就像一个魅力!谢谢

– kholofelo Maloma
15-10-28在13:10



提示:如果在命令前放置一个空格(以空格开头的命令),该空格将不会记录在您的历史记录中,并且向上/向下箭头键也不会显示该空格。

–马赫迪
17年7月3日在16:21

这在zsh btw中不起作用

–Shubham Chaudhary
18年6月5日在15:36

#2 楼

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

#3 楼

确保HISTCONTROL包含ignorespace。您可能需要在HISTCONTROL=ignorespace中添加HISTCONTROL=ignoredups:ignorespace(或~/.bashrc等)。然后,历史记录中会省略所有以空格开头的命令行。

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

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


#4 楼

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

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



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


第一个也是最简单的方法是使用ignorespace(或两者都忽略):

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


这将允许您在要避免被记录在history的内存列表中的命令之前使用空格。因此,由于在内存中没有记录可发送到文件的命令,因此还将避免将一个命令发送到$HISFILE中列出的文件。


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

$ unset HISTFILE



如果未设置,则退出shell时不会保存命令历史记录。


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

警告:如果在存在外壳程序之前将HISTFILE重置,则无论如何都可以将内存中记录的所有内容写入文件中。


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

$ shopt -ou history              # or set +o history


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


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

$ HISTSIZE=0


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



评论


//,它在一个方便的页面中涵盖了@Ambrose以外的所有答案。要走的路,@ Isaac。您愿意为此添加一个或两个指向文档的链接吗?可以肯定的是,人类历史不会对我们大多数人造成影响。

– Nathan Basanese
18-10-15在22:46

@NathanBasanese展开。更好?

–艾萨克
18-10-17在15:58

//,是的!我假设这些来自Bash变量和Shopt内置文档是否正确?

– Nathan Basanese
18-10-17在16:52



//,同时,在阅读Bash变量文档时,我遇到了HISTIGNORE,它包含了HISTCONTROL的功能。

– Nathan Basanese
18-10-17在16:55

(假设您使用的是Linux):如果执行命令LESS = +'/ ^ * HISTI'man bash(不是“手册页”吗?),会发生什么。 @NathanBasanese

–艾萨克
18-10-17在21:38



#5 楼

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

必须将空格或制表符空格放在任何命令的前面,这样才能赢得该命令不会存储在历史记录中。例如:

$ ls 
print the list of file 
$ history 
ls
history

$  pwd
print the current  working directory 
$ history 
ls
history


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

评论


这行不通; Bash抱怨找不到“-”或“ -history”或其他带连字符的命令。

–塞缪尔·A·法沃二世
15年11月12日在21:52

除非在forcefsck的响应中设置了HISTCONTROL =“ ignorespace”,否则这将无法工作

– DeveloperChris
16-3-21在23:37

#6 楼

export HISTFILE=/dev/null 


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

评论


要暂时暂停历史记录吗?作为常规命令,这对我不起作用。后续命令已记录到历史记录。您是用.bash_profile还是脚本来调用它? GNU bash版本3.2.57(1)-发行版(x86_64-apple-darwin16)

– Mat Gessel
19 Mar 3 '19 at 22:26

#7 楼

为了进一步说明SiegeX的答案,并使其真正进入隐身模式...

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

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

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


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

alias title="setGnomeTerminalTitle";
alias hist='history'
alias histoff="setGnomeTerminalTitle 'Incognito Window' && set +o history"
alias histon="setGnomeTerminalTitle \"$USER@$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;