我的密码存储在变量 $db_pwd 中,我想在 shell 脚本中将其传递给 mysql_config_editor。我无法使用配置文件或 db_pwd 环境变量。
我正在做这个
mysql_config_editor set --login-path=local --host=localhost --user=username --password
(https://stackoverflow.com/a/20854048/6487831).
它的作用是要求密码“输入密码”,但我希望使用变量提供密码。
我试过这个:
mysql_config_editor set --login-path=local --host=localhost --user=username --password $db_pwd
和
mysql_config_editor set --login-path=local --host=localhost --user=username --password | echo $db_pwd
和
echo "$db_pwd" | mysql_config_editor set --login-path=local --host=localhost --user=username --password
和
expect
。但是,如果出现“此路径已存在,重写(y/n)”之类的警告,这会导致错误。有什么办法可以做到这一点吗?或者我应该恢复使用
mysql
而不是 mysql_config_editor?
我发现当没有 TTY 时,其他建议的答案不起作用。所以我使用了这个 bash 脚本,它可以在 Terraform/ssh 等没有终端的地方工作:
#!/bin/bash
if [ $# -ne 4 ]; then
echo "Incorrect number of input arguments: $0 $*"
echo "Usage: $0 <login> <host> <username> <password>"
echo "Example: $0 test 10.1.2.3 myuser mypassword"
exit 1
fi
login=$1
host=$2
user=$3
pass=$4
unbuffer expect -c "
spawn mysql_config_editor set --login-path=$login --host=$host --user=$user --password
expect -nocase \"Enter password:\" {send \"$pass\r\"; interact}
"
测试一下:
./mysql_config.sh login 10.1.2.3 myuser mypass < /dev/null
--password
参数旨在显式避免在命令行上传递密码,因为这被认为是不安全的。
话虽如此,您仍然可以尝试将密码提供给
mysql_config_editor
:
echo "$db_pwd" | mysql_config_editor set --login-path=local --host=localhost --user=username --password
(如果 mysql_config_editor 坚持从当前终端而不是标准输入获取输入,这可能不起作用;如果是这种情况,您就无法从变量提供密码)。
正如您链接到的答案所示,您可以直接使用
mysql
来提供密码。使用 mysql_config_editor
意味着以加密形式将密码存储在 .mylogin.cnf
中(即,您从终端提供一次密码,然后将其加密并保存在配置文件中,mysql 可以从那里使用它)。
参考:https://dev.mysql.com/doc/refman/5.7/en/mysql-config-editor.html
更新:您可以使用
mysql_config_editor
实用程序:欺骗
unbuffer
认为它正在从交互式终端读取数据
echo "$db_pwd" | unbuffer -p mysql_config_editor set --login-path=local --host=localhost --user=username --password
也遇到这个问题了。 我的解决方案是运行命令一次,并在提示时提供密码
mysql_config_editor set --login-path=local --host=localhost --user=username --password
这会在用户主目录中生成文件 .mylogin.cnf。 只需将此文件(可以从 bash 脚本完成)复制到您想要使用 --login-path 选项授予访问权限的用户即可。
据我了解 .mylogin.cnf 只是存储特定 --login-path 的用户名和密码的一种混淆方式
我需要在 Dockerfile 中运行
mysql_config_edit
命令才能将它们用作参数。我可以使用 printf 来做到这一点:
printf '%s' "myPassword" | mysql_config_editor set --login-path=myconnection --host=connection.host.com --user=myconuser --password
效果很好。