【问题标题】:Security of passwords in bash subcommandsbash 子命令中密码的安全性
【发布时间】:2025-12-12 12:45:01
【问题描述】:

我听说直接在命令行输入密码是个坏主意,因为任何人都可以看到其中的“秘密”

mysql -u root -psecret

通过浏览history

我的 MySQL 数据库密码存储在具有有限读取权限的文本文件中,我想知道通过以下方式访问它是否安全:

mysql -u root -p$(cat ~/.mysql_pass)

浏览history,我看到打印的命令,而不是文字值。所以看起来它正在按照我想要的方式工作。

我确信有更好的方法来处理密码,我只是想知道这个方法是否完全公开了我的密码。

【问题讨论】:

  • 你也可以在你的命令前加一个空格,这样history就不会存储了。 superuser.com/a/324881/204979
  • @fedorqui 值得注意的是,这仅在$HISTCONTROL 环境变量具有ignorespaceignoreboth 标志时才有效。
  • 命令行也可以通过ps命令看到,独立于任何shell历史机制,或者使用哪个shell。

标签: mysql bash security passwords


【解决方案1】:

您建议使用以下内容:

mysql -u root -p$(cat ~/.mysql_pass)

但是,子命令将在执行 mysql 之前展开,因此即使命令历史记录中没有此功能,也完全有可能有人在调用后查看进程列表并查看您的密码。

我认为更好的方法是使用mysql client options file 并让mysql 命令从选项文件中读取密码。

【讨论】:

  • 其实在MySQL的具体情况下,它隐藏了密码——查看进程列表会显示“-pxxxxxx”或类似的东西。但总的来说,你是对的。
  • 对,我正要说它在我的例子中显示了-px。可以假设 MySQL 是安全的吗?
  • @chrisf 这取决于您对安全性的偏执程度。 mysql 二进制文件本身为 ps 列表重写了它的命令,因此实际上有一个很小的时间窗口可以在进程列表中看到密码 。这就是为什么我在答案中提到可以在“调用后”查看密码。
【解决方案2】:

只需输入mysql -u root -p,系统会提示您输入密码,并且不会存储在历史记录中。

【讨论】:

  • 没错,但我正在尝试更多的不干涉方法(这样我就可以从命令行执行查询而不会中断)。