2

我有两个脚本——主要的一个做一些不同的事情并调用第二个脚本,第二个脚本安装 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) 时,它会起作用。所以根本没有设置密码。

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

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

4

1 回答 1

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"login,就可以登录成功了。

将变量分配给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}';"

你可以试试。

附言

我写了一个MySQL 及其变种安装和初始化 shell 脚本,它可能对你有帮助。

于 2017-10-31T08:25:07.800 回答