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

Posted

技术标签:

【中文标题】如何将密码从 bash 脚本传递到 aptitude 以安装 mysql?【英文标题】:How can I pass a password from a bash script to aptitude for installing mysql? 【发布时间】:2010-11-15 04:46:18 【问题描述】:

我正在编写一个简单的 bash 脚本来在 Ubuntu 上安装 mysql

#!/bin/bash
apt-get update

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

但是 MySQL 会提示输入密码并进行确认。如何传递根密码。有没有可以使用的回声?

【问题讨论】:

【参考方案1】:

考虑使用expect

它可用于自动化大多数交互式会话,尽管我不会使用 root 密码

【讨论】:

【参考方案2】:

期望可能是矫枉过正。查看 Debian 或 Ubuntu 管理员论坛之一——像 FAI 等人长期以来一直使用预置来解决 debconf 问题。你应该也可以在这里使用它。

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

【讨论】:

【参考方案3】:

感谢您提供有关预期的提示。我通过搜索 Ubuntu 管理论坛找不到任何东西,所以我选择了期望。从这篇文章的时间戳可以看出,我花了 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

【讨论】:

【参考方案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

【讨论】:

我尝试了expect 方法,但一直遇到微妙的引用问题。 DEBIAN_FRONTEND=noninteractive 技巧正是我想要的。用mysqladmin -u root password YOUR_DB_PASSWORD 关注它,你很快就到家了。 +1 用于实际适用于 ubuntu 12.04 的干净安装的东西【参考方案5】:

这是我的新服务器设置脚本的摘录。除了密码之外,您应该能够逐字复制它。

如果您还不是 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 总是对问题回答是。 -q 隐藏了一些进度指示器,因此您可以将输出发送到日志。你也可以使用-qq,它会自动给你一个-y。这是 apt-get 的手册页。

&lt;&lt;EOSQL 是一种 bash heredoc 语法以提高可读性。

我从这个人那里得到了这个解决方案的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' 可能已经设置了root密码?此脚本不使用密码进行身份验证,因为 mysql 尚未设置密码。您可以将 -p 添加到提示符或添加 -p$PASS 以在命令行上提供它。 没有,我试过用干净的虚拟机。我猜mysql不接受密码为空。 我的下一个猜测是你不是真正的 root@localhost 取决于你的连接方式:***.com/questions/19712307/mysql-localhost-127-0-0-1【参考方案6】:

这很容易..

install mysql on ubuntu without password prompt

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 

【讨论】:

这实际上是推荐的方法。期望脚本或等待/睡眠只是会在最不幸的时刻中断的杂物。 我找不到需要覆盖哪些设置名称的文档。但是我以交互方式安装了一次包,并使用sudo debconf-show MyPkg 列出了设置的变量。查看该列表,很明显我的包的两个密码变量名称是什么。【参考方案7】:

此脚本在以超级用户身份启动时成功:

#!/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 版本。

以上是关于如何将密码从 bash 脚本传递到 aptitude 以安装 mysql?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数从 bash 传递到 php 脚本?

bash 脚本从 bash 脚本添加 git 凭据

如何在bash脚本中通过函数调用将参数/参数从一个函数传递到另一个函数[重复]

将数组从一个 Bash 脚本传递到另一个

如何从bash脚本加密zip文件

如何使用 Bash 脚本中的密码运行 sftp 命令?