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

问题描述 投票:0回答:4

我的密码存储在变量 $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?

mysql linux bash shell variables
4个回答
8
投票

我发现当没有 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

4
投票

--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

0
投票

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

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

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

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


0
投票

我需要在 Dockerfile 中运行

mysql_config_edit
命令才能将它们用作参数。我可以使用 printf 来做到这一点:

printf '%s' "myPassword" | mysql_config_editor set --login-path=myconnection --host=connection.host.com --user=myconuser --password

效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.