你不能,也不应该尝试,原因如下:
- 技术能力不完善(语义)
- 技术能力不完善(集中测井)
- 替代向量(过程表)
- 最佳实践(教导正确性)
技术能力不完善(语义)
假设您实际上想要一个历史文件——它的存在是有原因的;帮助您记住您键入的命令,通过引用重复命令等。在这种情况下,您想要删除错误输入的密码。你是怎样做的?
你可以有一个在 bash 历史文件中扫描的明文密码列表......但是你的系统上有一个明文密码列表。
您可以查找诸如“sudo”和“su”之类的命令并尝试删除它们之后的内容...但是将会发生的事情是有人会错误地输入“sudp”,然后在提示符下输入他们的密码,然后您的过滤器不会注意到它,因为错误导致密码泄露。
简而言之,计算机不够智能,无法过滤掉不适当的密码条目;这是一个语义问题。
技术能力不完善(集中测井)
在 bash 4.1 中,他们引入了将每个人的历史日志复制到 syslog 的功能。这是人们多年来一直在破解、修补和编写 bash(和其他 shell)脚本的功能的合法版本。如果其他人管理您的机器——比如工作中的 IT 团队——那么您可能无法控制您的命令行是否被悄悄地记录下来,而您却不知道。
这不仅仅是 bash。Linux 上的 auditd 守护进程可以配置为记录命令和参数:
# grep oops /var/log/audit/auditd.log
type=EXECVE msg=audit(1443795447.953:2387443): argc=6 a0="sudo" a1="oops" a2="i" a3="typed" a4="my" a5="password"
#
这是一个系统级设置,通过内核运行,与您使用的任何 shell 完全无关,也与您可能为自己选择的任何历史设置无关。
替代向量(过程表)
您在命令行上键入的任何内容都可能会显示在进程表中,这就是使用密码的工具要求以交互方式输入密码的原因。如果你搞砸了(如上面的 sudo 示例)并将它们作为参数输入,它们就在那里供某人从进程列表中抓取 - 并且某人编写一个从命令行中抓取命令行的收割机并不难进程表。
最佳实践(教导正确性)
这些反对意见中的每一个都有警告......“如果我不想继续使用历史文件”,“如果我的系统管理员不干涉”,“如果没有人仔细观察进程表”......但是我对“最佳实践”的定义是“你做的事情,因为你不能依赖其他事情按照你希望的方式进行。” 因此,最佳实践只是假设任何错误输入的密码都被泄露,立即更改密码,然后继续您的生活。
您可以实施的任何“解决方案”都是部分的,并且容易在用户的检测范围之外发生故障。我宁愿不要给人们一种错误的印象,他们比他们更安全。
我意识到训练人们去做这件事很困难。哎呀,培训人们做任何事情都很难,而安全则是双重困难。但这是正确的答案。