设置环境变量(密码)的方式不会将其值保存到 bash 历史记录中

Set an environment variable (password) in a way its value is not saved to the bash history

提问人:Alexey Starinsky 提问时间:7/3/2019 最后编辑:jottbeAlexey Starinsky 更新时间:3/28/2023 访问量:17335

问:

当我以root身份登录MySQL时,我通常会设置MROOTPASS环境变量

export MROOTPASS=my-secret-password

然后做

mysql -u root -p$MROOTPASS

这消除了每次以 root 身份连接到 MySQL 时重新输入密码的需要,但显然这是不安全的,因为密码已保存到 bash 历史记录文件中。是否可以阻止密码被保存?

巴什

评论

5赞 Cyrus 7/3/2019
将密码存储在选项文件中。请参见: 6.1.2.1 最终用户密码安全准则
11赞 glenn jackman 7/3/2019
如果在命令的开头放置一些空格,这将阻止它进入您的历史记录:“[space]export ...” -- HISTCONTROL 变量控制它。
1赞 chepner 7/3/2019
无关紧要,但如果在定义它的同一 shell 会话中使用它,则无需导出。MROOTPASS
2赞 John Kugelman 7/3/2019
这更像是 bash 的历史。来自 @Cyrus 的链接:“[使用 -p] 很方便,但不安全。在某些系统上,您的密码对系统状态程序(如 ps)可见,其他用户可能会调用这些程序来显示命令行。MySQL客户端通常在初始化序列中用零覆盖命令行密码参数。但是,该值仍然有一个短暂的间隔可见。此外,在某些系统上,这种覆盖策略是无效的,密码对ps仍然可见。
1赞 David C. Rankin 7/3/2019
对每个块使用 where,例如 , , , 等...您可以提供 and 以允许访问,而无需在命令行上提供用户或密码。请参阅 MySQL 选项文件 -- MariaDB 也是如此。/root/.my.cnf[mysqladmin][mysql][mysqldump]password = xxxxuser = xxxx

答:

35赞 jottbe 7/3/2019 #1

您可以使用以下命令输入变量

read -s -p "Enter password:" MROOTPASS 

这样,如果不将其保存在文件中,它也不会出现在任何地方。相反,您只需要输入一次。-s 选项告诉 read 不要回显键入的字符,因此在您键入时没有人可以查找它。

编辑:在这个答案被接受很久之后,有些人说,这并没有定义系统变量,而是定义了 shell 变量。如果你需要你的变量在子 shell 中可见,你只需要通过在 read 语句 (bash) 下面添加以下行来导出变量:

export MROOTPASS 

不同 shell 中内置命令的手册页:read

评论

0赞 vladkras 3/8/2021
此命令定义了 shell 变量,而不是 OP 要求的环境变量,因此,如果您的命令/脚本/程序等待 env var,它不会得到一个,只需尝试打印,您将什么也看不到env | grep MROOTPASS
0赞 baxx 5/20/2021
这是环境变量还是 shell 变量。
0赞 jottbe 6/17/2021
@baxx:这不是真正的问题,因为正如你所看到的,密码是通过替换变量来传递的。我想,这就是发帖人接受这个解决方案的原因,对我的帖子投反对票有点不公平,因为你们俩显然都这样做了!
0赞 jottbe 6/17/2021
@vladkras:我写给 Baxx 评论的内容也适用于您的评论/反对票。关键是,如果变量需要在子壳中可见,那么在读取下方添加一个简单的额外内容就可以了。export MYROOTPASS
12赞 Christian Oudard 5/21/2021 #2
$ read -rs PASSWORD
$ export PASSWORD