【发布时间】:2012-01-18 09:02:05
【问题描述】:
我想执行一些命令,但我不想将它们存储在命令历史记录中。这样任何人都无法在.bash_history 文件中搜索它们。
有没有办法以这种方式执行 Bash 命令?
【问题讨论】:
-
这个问题可能应该转移到 ServerFault,因为这不是“编程”,而是“服务器管理员” - 但感谢您的问题/答案,正是我所需要的!
我想执行一些命令,但我不想将它们存储在命令历史记录中。这样任何人都无法在.bash_history 文件中搜索它们。
有没有办法以这种方式执行 Bash 命令?
【问题讨论】:
以空格开始您的命令,它不会包含在历史记录中。
请注意,这确实需要设置环境变量 $HISTCONTROL。
检查以下命令是否返回 ignorespace 或
ignoreboth:
echo $HISTCONTROL
如果缺少环境变量,要添加环境变量,可以在 Bash 配置文件中添加以下行。例如,归档%HOME/.bashrc。
export HISTCONTROL=ignorespace
sourcing 再次配置后,空格前缀的命令将不会写入$HISTFILE。
【讨论】:
在任何给定的 Bash 会话中,通过键入以下内容将历史文件设置为 /dev/null:
export HISTFILE=/dev/null
请注意,正如 cmets 中所指出的,这不会将该会话中的任何命令写入历史记录!
请不要打扰系统管理员的辛勤工作;)
Doodad's solution 更优雅。只需取消设置变量:unset HISTFILE(谢谢!)
【讨论】:
/dev/null 权限设置为 0600 相关的问题。相反,我使用了unset HISTFILE。
echo "discreet";history -d $(history 1)
【讨论】:
zsh 中不起作用。它输出fc: too many arguments 并将命令存储在历史记录中。
John Doe's 和 Cédric ROYER's answer 的扩展。但是,这似乎对我有用。
<your_secret_command>; history -d $((HISTCMD-1))
您不应该在历史记录中看到该命令的条目。
这里是解释...
'history -d' 从历史记录中删除提到的条目。
HISTCMD 存储下一个要执行的命令号。所以,(HISTCMD-1) 指的是最后执行的命令。
【讨论】:
如果您使用的是Z shell (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."'
【讨论】:
您可能会考虑使用没有历史记录的 shell,例如
/bin/sh << END
your commands without history
END
(也许/bin/dash 或/bin/sash 可能比/bin/sh 更合适)
或者更好的是,使用batch 实用程序,例如,
batch << EOB
your commands
EOB
然后历史记录将包含sh 或batch,这不是很有意义。
【讨论】:
你可以开始你的会话
export HISTFILE=/dev/null ;history -d $(history 1)
然后继续你的偷偷摸摸的行为。将 histfile 设置为 /dev/null 将被记录到历史文件中,但该条目将很容易被删除,并且不会显示任何痕迹(至少在历史文件中)。
另外,这是非永久性的。
【讨论】:
正如提到的by Doodad in comments、unset HISTFILE 做得很好,但如果您还想删除一些历史记录,请使用echo $HISTFILE 获取历史记录文件位置(通常为~/.bash_history)、unset HISTFILE 和编辑~/.bash_history(或任何HISTFILE ——当然现在是unset,所以你无法阅读)。
$ echo $HISTFILE # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history # Or your preferred editor
那么你已经编辑了你的历史,以及你编辑它的事实!
【讨论】:
unset HISTFILE; echo TEST; history 会给你命令echo TEST 就像从前到最后一样。虽然终止会话并再次连接后,历史确实没有这个条目。所以我会说它有效:)
unset HISTFILE 似乎不会停止将命令记录在内存中的历史记录中,但它确实会停止将它们记录在 $HISTFILE 所在的任何文件中。所以我猜你的内存中仍然有你的本地历史,但它不再被记录在文件中,这可能是你想要的! ;)
您也可以使用以下命令:
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
$s 的含义以及 sed 中的其他内容。 function forget() { // put code here // }
有几种方法可以实现这一目标。这会将历史文件的大小设置为 0:
export HISTFILESIZE=0
这会将历史文件设置为/dev/null,从而有效地禁用它:
export HISTFILE=/dev/null
对于单个命令,您可以在命令前加上空格,它不会保存在历史文件中。请注意,这要求您将 ignorespace 值包含在 $HISTCONTROL 环境变量中(man bash 并搜索 ignorespace 以获取更多详细信息)。
【讨论】:
你只需要运行:$ set +o history
要查看更多信息,请运行:$ man set
【讨论】:
set -x history就可以了。
如果您想清除所有历史记录,这很方便,包括您已清除所有历史记录的事实!
rm .bash_history;export HISTFILE=/dev/null;exit
【讨论】:
这个命令可能会派上用场。这不会记录执行的命令
history -d $((HISTCMD-1)) && <Your Command Here>
【讨论】: