如何在Bash脚本中传递密码给aptitude以安装MySQL?

22

我正在编写一个简单的bash脚本,在Ubuntu上安装MySQL。

#!/bin/bash
apt-get update

# Install MySQL5 
aptitude -y install mysql-server mysql-client libmysqlclient15-dev

然而,MySQL会提示输入密码和确认。我该如何传递root密码?是否有一种方式可以使用echo命令实现?

7个回答

14

这样做会容易很多..

在Ubuntu上安装MySQL而无需密码提示

sudo debconf-set-selections <<< 'mysql-server-5.1 mysql-server/root_password password your_password'
sudo debconf-set-selections <<< 'mysql-server-5.1 mysql-server/root_password_again password your_password'
sudo apt-get -y install mysql-server

如果你的shell不支持here-strings(zsh、ksh93和bash支持它们),可以使用:

echo ... | sudo debconf-set-selections 

这实际上是推荐的方法。期望脚本或等待/休眠只是一些不良修补,会在最不幸的时刻中断。 - Holger Just
2
我找不到需要覆盖的设置名称的文档。但是我曾经交互式地安装过该软件包,并使用“sudo debconf-show MyPkg”列出了已设置的变量。查看该列表,很明显我的软件包中有哪两个密码变量名称。 - Jeff Allen

12
感谢您提供有关expect的提示。在搜索Ubuntu管理员论坛时,我找不到任何信息,所以我选择了expect。正如您在此帖子的时间戳中所看到的那样,我花了3个小时才使其正常工作。以下是代码,希望能对某些人有所帮助:
#!/bin/bash
apt-get update
apt-get install expect

VAR=$(expect -c '
spawn apt-get -y install mysql-server
expect "New password for the MySQL \"root\" user:"
send "PasswordHere\r"
expect "Repeat password for the MySQL \"root\" user:"
send "PasswordHere\r"
expect eof
')

echo "$VAR"

apt-get -y install mysql-client libmysqlclient15-dev   

#For some reason important to restart - otherwise possible errors

/etc/init.d/mysql stop
/etc/init.d/mysql start

7

这是我为新服务器编写的设置脚本的摘录。你可以直接复制它,除了密码以外。

如果您不是root用户,需要使用sudo来运行此脚本。

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive
apt-get -q -y install mysql-server
echo "Give mysql server time to start up before we try to set a password..."
sleep 5
mysql -uroot -e <<EOSQL "UPDATE mysql.user SET Password=PASSWORD('yourpasswordhere') WHERE User='root'; FLUSH PRIVILEGES;"
EOSQL
echo "Done setting mysql password."

其他答案使用了-y参数,这使得apt-get命令总是回答yes。-q参数隐藏了一些进度指示器,所以你可以将输出发送到日志中。你也可以使用-qq参数,它会自动给你一个-y选项。这在apt-get的手册页中有说明。 <
我从这个人那里得到了这个解决方案的heredoc部分:http://padwasabimasala.posterous.com/non-interactive-scripted-mysql-install-on-ubu 记住heredoc的事情是,在结束字符串之前的空格会破坏它。所以不要缩进那行。这是关于heredoc语法的一个页面:http://tldp.org/LDP/abs/html/here-docs.html

这个错误信息是 ERROR 1698 (28000): Access denied for user 'root'@'localhost' - user1623521
也许已经设置了根密码?这个脚本没有使用密码进行身份验证,因为mysql之前没有设置密码。您可以添加“-p”来提示输入密码,或者添加“-p$PASS”在命令行中提供密码。 - Mnebuerquo
没有,我已经尝试过使用干净的虚拟机。我猜测mysql不接受空密码。 - user1623521
我的下一个猜测是,根据您的连接方式,您可能并不是真正的root@localhost:https://dev59.com/questions/SGIj5IYBdhLWcg3w95nA - Mnebuerquo

4

最简单的方法是使用DEBIAN_FRONTEND环境变量以及aptitude的-q和-y标志:

sudo DEBIAN_FRONTEND=noninteractive aptitude install -q -y mysql-server

更普遍地说,假设已经以某种方式提供了sudo密码:

#!/bin/bash
INSTALLER_LOG=/var/log/my-installer.log

installnoninteractive(){
  sudo bash -c "DEBIAN_FRONTEND=noninteractive aptitude install -q -y $* >> $INSTALLER_LOG"
}

installnoninteractive mysql-server

1
我尝试了expect方法,但一直遇到微妙的引用问题。DEBIAN_FRONTEND=noninteractive技巧正是我正在寻找的。接着使用mysqladmin -u root password YOUR_DB_PASSWORD,你很快就能完成了。 - Jonathan Eunice
+1 表示在 Ubuntu 12.04 干净安装上实际可行的某些东西。 - Automatico

3

当以超级用户身份启动时,此脚本运行成功:

#!/bin/bash

export temp_mysql_password="**********"
export DEBIAN_FRONTEND=noninteractive 

debconf-set-selections <<< "mysql-server mysql-server/root_password password $temp_mysql_password"
debconf-set-selections <<< "mysql-server mysql-server/root_password_again password $temp_mysql_password"
debconf-set-selections <<< "mysql-server-5.6 mysql-server/root_password password $temp_mysql_password"
debconf-set-selections <<< "mysql-server-5.6 mysql-server/root_password_again password $temp_mysql_password"

apt-get update
apt-get -y upgrade
apt-get -y install mysql-server

完美运行...只需要将mysql-server版本更改为5.7,因为它取决于Ubuntu版本。 - vkrams

2

建议使用expect技术。

它可以用于自动化大多数交互会话,但不建议使用root密码。


1

Expect 可能有些过度了。可以在 Debian 或 Ubuntu 管理员论坛上查看 -- 诸如 FAI 等工具长期以来一直使用 preseeding 来回答 debconf 问题。你也应该能够在这里使用它。

最后,你可能还可以使用 apt-get 本身或其他前端工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接