使用shell中的变量将密码传递给mysql_config_editor

时间:2017-02-14 17:18:12

标签: mysql linux bash shell variables

我将密码存储在变量$ 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而不是mysql_config_editor?

3 个答案:

答案 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存储用户名和密码的一种混淆方式