提问人:Alexey Starinsky 提问时间:7/3/2019 最后编辑:jottbeAlexey Starinsky 更新时间:3/28/2023 访问量:17335
设置环境变量(密码)的方式不会将其值保存到 bash 历史记录中
Set an environment variable (password) in a way its value is not saved to the bash history
问:
当我以root身份登录MySQL时,我通常会设置MROOTPASS环境变量
export MROOTPASS=my-secret-password
然后做
mysql -u root -p$MROOTPASS
这消除了每次以 root 身份连接到 MySQL 时重新输入密码的需要,但显然这是不安全的,因为密码已保存到 bash 历史记录文件中。是否可以阻止密码被保存?
答:
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
评论
MROOTPASS
/root/.my.cnf
[mysqladmin]
[mysql]
[mysqldump]
password = xxxx
user = xxxx