无法从外部 bash 脚本正确设置 MySQL 密码

Posted

技术标签:

【中文标题】无法从外部 bash 脚本正确设置 MySQL 密码【英文标题】:Can't properly set MySQL password from external bash script 【发布时间】:2018-04-07 22:00:42 【问题描述】:

我有两个脚本 - 主脚本执行一些不同的操作并调用第二个脚本,第二个脚本用于安装 mysql

在我的主脚本中,我执行以下操作:

...

read -p "Set the password for the database [min. 4 characters]: " MPASS

# Install MySQL
path/to/setup-mysql.sh "$MPASS"

mysql --user="root" --password=$MPASS -e "GRANT ALL ON *.* TO root@'$IPADDRESS' IDENTIFIED BY '$MPASS';"
mysql --user="root" --password=$MPASS -e "GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '$MPASS';"
service mysql restart

mysql --user="root" --password=$MPASS -e "SET GLOBAL validate_password_policy = 'LOW'; SET GLOBAL validate_password_length = 4; CREATE USER 'johndoe'@'$IPADDRESS' IDENTIFIED BY '$MPASS';"
mysql --user="root" --password=$MPASS -e "GRANT ALL ON *.* TO 'johndoe'@'$IPADDRESS' IDENTIFIED BY '$MPASS' WITH GRANT OPTION;"
mysql --user="root" --password=$MPASS -e "GRANT ALL ON *.* TO 'johndoe'@'%' IDENTIFIED BY '$MPASS' WITH GRANT OPTION;"
mysql --user="root" --password=$MPASS -e "FLUSH PRIVILEGES;"

setup-mysql.sh 看起来像这样:

#!/bin/bash

export DEBIAN_FRONTEND=noninteractive

debconf-set-selections <<< "mysql-community-server mysql-community-server/data-dir select ''"
debconf-set-selections <<< "mysql-community-server mysql-community-server/root-pass password $1"
debconf-set-selections <<< "mysql-community-server mysql-community-server/re-root-pass password $1"

apt-get install -y mysql-server

# Start mysql on boot
update-rc.d mysql defaults

# Configure Password Expiration
echo "default_password_lifetime = 0" >> /etc/mysql/my.cnf

# Configure Access Permissions For Root
sed -i '/^bind-address/s/bind-address.*=.*/bind-address = */' /etc/mysql/my.cnf

在我看来,这应该可以工作,但是,当 bash 执行这一行时:

mysql --user="root" --password=$MPASS -e "GRANT ALL ON *.* TO root@'$IPADDRESS' IDENTIFIED BY '$MPASS';"

它说密码错误。当我尝试手动登录时,它不起作用。当我跳过密码字段 (mysql -u root) 时,它可以工作。所以根本没有设置密码。

另外,当我在setup-mysql.sh 中执行echo $1 时,它会正确显示MPASS 包含的内容。

为什么debconf-set-selections 没有为我的 MySQL 安装正确设置密码。我真的很困惑。

【问题讨论】:

【参考方案1】:

看来你是在写一个 MySQL 安装后初始化 shell 脚本。

在我个人看来:改变你的 shell 脚本设计方法。

在您的脚本中,您使用mysql --user="root" --password=$MPASS 提示错误信息。您可以使用mysql参数--defaults-file,将mysql登录用户root和相应的密码写入临时文件,如

[client]
user=root
password=YOURPASSWORD

假设文件路径为/tmp/mysql.cnf(赋值变量mysql_my_cnf

然后使用mysql --defaults-file="$mysql_my_cnf"登录,就可以登录成功了。

mysql --defaults-file="$mysql_my_cnf"赋值一个变量,比如mysql_command

旧方法

mysql --user="root" --password=$MPASS -e "GRANT ALL ON *.* TO root@'$IPADDRESS' IDENTIFIED BY '$MPASS';"

新方法

$mysql_command -e "GRANT ALL ON *.* TO root@'$IPADDRESS' IDENTIFIED BY '$MPASS';"

你可以试试。

PS

我写了MySQL and its variants installation and initialization shell script,可能对你有帮助。

【讨论】:

以上是关于无法从外部 bash 脚本正确设置 MySQL 密码的主要内容,如果未能解决你的问题,请参考以下文章

如何从 .gitconfig 别名调用外部脚本?

无法从 bash 脚本中使用 nvm

从 Bash 脚本中检测操作系统并通知用户

如何将密码从 bash 脚本传递到 aptitude 以安装 mysql?

如何将密码从 bash 脚本传递到 aptitude 以安装 mysql?

当它从命令行 bash 工作时,无法从 crontab 运行 bash 脚本