【问题标题】:Pass password to mysql_config_editor using variable in shell使用 shell 中的变量将密码传递给 mysql_config_editor
【发布时间】:2017-07-03 02:33:09
【问题描述】:

我将密码存储在变量 $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)”之类的警告。
  • options 文件,但即使我将它用作第一个参数,它们仍然给我变量未找到错误。选项文件是否与 mysql 配置编辑器兼容?

有什么办法吗?还是我应该恢复使用mysql 而不是mysql_config_editor?

【问题讨论】:

标签: mysql linux bash shell variables


【解决方案1】:

当没有 TTY 时,我发现其他建议的答案不起作用。所以我使用了这个在 Terraform/ssh 等没有终端的地方工作的 bash 脚本:

#!/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

【讨论】:

    【解决方案2】:

    --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 使其认为它正在从交互式终端读取:

    echo "$db_pwd" | unbuffer -p mysql_config_editor set --login-path=local --host=localhost --user=username --password
    

    【讨论】:

    • 是的,它不起作用。我正在用我尝试过的其他方法编辑问题。
    【解决方案3】:

    也遇到了这个问题。 我的解决方案是运行一次命令,并在提示时提供密码

    mysql_config_editor set --login-path=local --host=localhost --user=username --password
    

    这会在用户主目录中生成文件 .mylogin.cnf。 只需将此文件(可以从 bash 脚本完成)复制到您想要使用 --login-path 选项授予访问权限的用户就可以了。

    据我了解,.mylogin.cnf 只是为特定的 --login-path 存储用户名和密码的一种混淆方式

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 2013-11-02
      • 2013-05-04
      • 1970-01-01
      • 2014-09-09
      • 2015-01-08
      • 2013-09-09
      • 2015-09-09
      • 2017-03-06
      相关资源
      最近更新 更多