有什么办法可以阻止命令被添加到您的历史记录中吗?我有一个命令想保留在我的历史文件中,当我搜索内存中存储的历史记录时,我真的不关心它在那里,尽管这不是一个问题。有什么办法可以防止这种情况,或者我只需要返回并编辑我的历史文件。
更新:我没有意识到这可能是特定于 shell 的。我的外壳是zsh
.欢迎您回答其他 shell,以便人们知道如何在他们的 shell 中执行此操作。
答案1
在ZSH:
首先插入setopt HIST_IGNORE_SPACE
到您的~/.zshrc
.现在,再次登录后,您可以在任何不想存储在历史记录中的命令前面加上space
.请注意(与 bash 的同名选项不同)该命令会在内部历史记录中徘徊,直到输入下一个命令才会消失,从而允许您短暂地重用或编辑该行。
来自用户手册,以下 3 个选项可用于表示某些行根本不应该进入历史记录:
- HIST_IGNORE_SPACE不要存储以空格为前缀的命令
- HIST_NO_STORE不存储历史(fc-l) 命令
- HIST_NO_FUNCTIONS不存储函数定义
答案2
如果您一遍又一遍地运行该命令,您可能需要使用 shell 的历史记录忽略功能。假设您有 ssh 访问的 Secret.server.com、FTP 文件等,但您不希望保存任何提及 Secret.server.com 的行:
在bash
你会设置
HISTIGNORE="*secret.server.com*"
而在zsh
参数中被称为
HISTORY_IGNORE="*secret.server.com*"
HISTIGNORE
可以包含多个模式,用冒号分隔。HISTORY_IGNORE
指定单个模式,但该模式可以包含替代项,并用管道分隔。请注意,每个模式都与全输入线,因此您可能需要包含 *.例如,以下将从fortune
历史记录中排除,但会存储fortune -l
:
HISTIGNORE="*secret.server.com*:ytalk*:fortune"
HISTORY_IGNORE="*secret.server.com*|ytalk*|fortune"
设置 HISTIGNORE 后,与您列出的模式匹配的任何内容都不会保存到.bash_history
/.zsh_history
中,甚至向上箭头键(通常会调用您之前的命令)如果与您的模式匹配,也将不起作用。
答案3
在 bash 中,使用该HISTCONTROL
变量。
将其设置为HISTCONTROL=ignorespace
(或HISTCONTROL=ignoreboth
)。从现在开始,当你以空格开始一行, 它会不是被保存在历史中。这避免了在某些配置文件中包含未公开的命令。
即使这样,它也碰巧忘记添加空格然后想返回。要删除历史记录中的条目,请使用history -d <index>
, 以及index
通过命令找到的编号history
(第一列)。
答案4
最简单的一次性方法是
$ $SHELL
$$ unset HISTFILE
$$ secret-command
$$ exit
$
其中$
表示初始 shell 的提示符,$$
表示子 shell 的提示符。这适用于 bash 和 zsh;在 ksh 中,您需要HISTFILE=/notwritable
改为。请注意,重要的是写入历史文件时的值HISTFILE
,而不是运行命令时的值。 Bash、ksh 和 zsh 退出时会写入历史文件(根据配置,zsh 可以更频繁地执行此操作)。
或者,您可以让 bash 或 zsh 忽略与某些模式匹配的行(其他答案已经涵盖了这一点)。
zsh 中的另一种可能性是
% fc -p
% secret-command
% fc -P
fc -p
将当前历史列表推入堆栈并启动一个与保存文件无关的新列表。fc -P
将未保存的历史记录从堆栈中弹出并完全忘记它。
当进程运行时,命令及其参数(在某些系统上还有其环境)将显示在进程表(ps
输出)中。 root 可以看到过去的命令系统会计数据库,并且可以在不受您控制的情况下进行更多日志记录。并且可能会有各种取证证据可以大致显示您运行的命令(例如文件修改时间)。因此,您无法获得针对坚决窃听者的隐私。