Search code examples
mysqllinuxubuntudebconf

Install MySQL on Ubuntu Natty without password prompt and using shell variable as password


I'm trying to install MySQL on Ubuntu Natty from a shell script. However, I keep running into one major issue: when I try to define the password outside of the shell script.

Below is the code to my shell script (which I have saved in /etc/init.d/install_mysql:

export DEBIAN_FRONTEND=noninteractive
echo mysql-server-5.1 mysql-server/root_password password $dbpass | debconf-set-selections
echo mysql-server-5.1 mysql-server/root_password_again password $dbpass | debconf-set-selections
apt-get -y install mysql-server

So what I enter in the terminal is:

dbpass="mysqlpass"
chmod +x /etc/init.d/install_mysql
/etc/init.d/install_mysql

MySQL installs, but it installs without a password, so I can just do something like mysql -uroot to access mysql (which I don't want).

The funny thing is if I put the password in the shell script as regular text, it works ok. So if I my install script is as follows, everything works (i.e. I must specify a password to access mysql):

export DEBIAN_FRONTEND=noninteractive
echo mysql-server-5.1 mysql-server/root_password password mysqlpass | debconf-set-selections
echo mysql-server-5.1 mysql-server/root_password_again password mysqlpass | debconf-set-selections
apt-get -y install mysql-server

Is there a way I can use a shell script variable to define my password in the shell script, instead of entering the password literally?!

Thanks in advance.

EDIT:

I just edited the variable declaration $dbpass="mysqlpass" to dbpass="mysqlpass". It was a typo.


Solution

  • $dbpass="mysqlpass"
    

    Yeah, this is several types of wrong. Variable names don't start with $, and variables won't be passed to the environment of subprocesses unless exported.

    dbpass="mysqlpass"
    export dbpass
    

    Note that environment variables are not considered a secure mechanism for sharing data; you may want to retool your script to read the password from stdin instead, which would be a bit more secure.