当我尝试在终端内运行MySQL上的以下命令时:
mysql -u $user -p$password -e "statement"
执行按预期工作,但它总是发出一个警告:
警告:在命令行界面上使用密码可能不安全。
但是,我必须使用存储密码的环境变量($password)来执行上面的语句,因为我想从Terminal中在bash脚本中迭代地运行命令,而且我绝对不喜欢等待提示显示并强迫我在一个脚本中输入密码50或100次的想法。我的问题是:
压制警告可行吗?如我所述,该命令可以正常工作,但是当我循环并运行该命令50或100次时,窗口变得非常混乱。
我应该遵守警告信息,不写我的密码在我的脚本?如果是这样的话,那么每次提示时我都必须输入密码吗?
Running man mysql没有帮助,说的只是
——显示警告
在每条语句后显示警告(如果有的话)。此选项适用于交互和批处理模式。
也没有提到如何关闭功能,如果我没有错过什么。
我使用的是OS X 10.9.1 Mavericks,使用的是自制的MySQL 5.6。
shell> mysql_config_editor set --login-path=local
--host=localhost --user=localuser --password
Enter password: enter password "localpass" here
shell> mysql_config_editor set --login-path=remote
--host=remote.example.com --user=remoteuser --password
Enter password: enter password "remotepass" here
要查看mysql_config_editor对.mylogin.cnf文件写了什么,使用print命令:
shell> mysql_config_editor print --all
[local]
user = localuser
password = *****
host = localhost
[remote]
user = remoteuser
password = *****
host = remote.example.com
print命令将每个登录路径显示为一组行,以方括号开头的组标头表示登录路径名称,然后是登录路径的选项值。密码值被屏蔽,不会以明文形式显示。
如前面的示例所示,.mylogin.cnf文件可以包含多个登录路径。通过这种方式,mysql_config_editor可以很容易地为连接到不同的MySQL服务器设置多个“个性”。稍后在调用客户端程序时,可以使用——login-path选项按名称选择其中任何一个。例如,要连接到本地服务器,使用以下命令:
shell> mysql --login-path=local
要连接到远程服务器,使用这个命令:
shell> mysql --login-path=remote
来自@david-g的答案非常棒,但至少BSD grep将[Warning]解释为单个字符的正则表达式表示(匹配单词Warning中的任何一个字符)。
对于我的脚本,我使用了相同的方法,包装在一个函数中(为了简单起见,只匹配字符串的部分):
mysql() {
(
(
(
(
(
/usr/local/bin/mysql "$@"
) 1>&9
) 2>&1
) | grep -v 'Using a password on the command line interface can be insecure.'
) 1>&2
) 9>&1
}
out=$(mysql ...... 2>&1)
rc=$?
上面的代码将使用一组选项调用mysql,将过滤的stderr重定向到stdout,并在$opt中捕获组合输出,在$rc中捕获退出码。
我使用的是:
mysql --defaults-extra-file=/path/to/config.cnf
or
mysqldump --defaults-extra-file=/path/to/config.cnf
其中config.cnf包含:
[client]
user = "whatever"
password = "whatever"
host = "whatever"
这允许您拥有多个配置文件-针对不同的服务器/角色/数据库。使用~/.my.cnf将只允许您拥有一组配置(尽管它可能是一组有用的默认值)。
如果你是基于Debian的发行版,并且以root用户运行,你可以跳过上面的步骤,使用/etc/mysql/debian.cnf进入…:
mysql——defaults-extra-file = / etc / mysql / debian.cnf