Bash
MySQL
Expect
mariadb
mysql_secure_installation

mysql_secure_installationのインタラクティブな入力が自動化の妨げになる

More than 1 year has passed since last update.

掲題の通り。

最初はexpectしてたのですが「minimalで入らないパッケージに依存して何が自動化だ」と。
考え直して/usr/bin/mysql_secure_installationの中身を読みました。

結果。
してることは至極単純で以下SQLを発行してるだけでした。

UPDATE mysql.user SET Password=PASSWORD('********') WHERE User='root';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';
FLUSH PRIVILEGES;

grep do_query /usr/bin/mysql_secure_installationすれば抽出できます。

以上より、expectはやめてこんな感じにしました。

# ランダムパスワード生成
vMariadbRootPasswd="$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 16 | tee -a ~/.mysql.secrets)"

# mysql_secure_installation
mysql -u root --password= -e "
    UPDATE mysql.user SET Password=PASSWORD('${vMariadbRootPasswd}') WHERE User='root';
    DELETE FROM mysql.user WHERE User='';
    DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
    DROP DATABASE test;
    DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
    FLUSH PRIVILEGES;"

以下の500,000,000倍いいですね。

expect -c '
    set timeout 10;
    spawn mysql_secure_installation;
    expect "Enter current password for root (enter for none):";
    send "\n";
    expect "Set root password?";
    send "y\n";
    expect "New password:";
    send "'"${vMariadbRootPasswd}"'\n";
    expect "Re-enter new password:";
    send "'"${vMariadbRootPasswd}"'\n";
    expect "Remove anonymous users?";
    send "y\n";
    expect "Disallow root login remotely?";
    send "y\n";
    expect "Remove test database and access to it?";
    send "y\n";
    expect "Reload privilege tables now?";
    send "y\n";
    interact;'

おわり。