我将密码存储在变量$ 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?
答案 0 :(得分:3)
我发现当没有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
答案 1 :(得分:1)
--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
更新 :您可以通过使用unbuffer
utility来欺骗mysql_config_editor
认为它正在从交互式终端读取/ p>
echo "$db_pwd" | unbuffer -p mysql_config_editor set --login-path=local --host=localhost --user=username --password
答案 2 :(得分:1)
也遇到了这个问题。 我的解决方案是只运行一次命令,并在提示符下提供密码
mysql_config_editor set --login-path=local --host=localhost --user=username --password
这将在用户主目录中生成文件.mylogin.cnf。 只需使用--login-path选项将此文件(可以通过bash脚本完成)复制到您要授予访问权限的用户即可。
据我了解,.mylogin.cnf只是为特定的--login-path存储用户名和密码的一种混淆方式