我正在尝试执行一个shell脚本以root身份登录mysql并执行一些命令,为了避免将root的密码放在命令行中,我正在使用heredoc格式,如下所示。但是,mysql 会提示我输入密码,尽管我给了它正确的密码。
完全相同的语法在其他一些主机上完美运行,但在这里不是。
为什么?
mysql@myhost:MySQL> mysql -uroot -p -s -P3306 -e 'SELECT NOW();' <<EOF
> MyPassword
> EOF
Enter password: <---- why does it require manual password entry in here?
2014-12-23 14:57:25
假设您使用 BASH 或 KSH 命令行界面:
read -s pwd;mysql -uroot --password=${pwd} -s -P3306 -e 'SELECT NOW();'
对于 read 命令,您应该使用 -s 选项,因为就像使用 heredoc 一样,如果您不使用该选项,此解决方案也会在键入密码时显示密码。
此解决方案之所以有效,是因为 mysql 客户端会混淆密码,因此它不会显示在进程列表命令(如 ps)的输出中。运行以下命令:
read -s pwd;mysql -uroot --password=${pwd} -s -P3306
然后,如果您打开一个额外的命令行界面并执行 ps,您将看到它在进程列表中没有显示密码,而是显示它的混淆版本。
这是mysql 客户端的一个著名错误,但在 2002 年得到了修复。
使用 read -s 将密码放入变量中还有一个额外的好处,即不会在命令行界面的历史记录中显示密码。