web-dev-qa-db-ja.com

シェルスクリプト経由でechoコマンドでmysql_secure_installationを自動化する

自動応答でmysql_secure_installationスクリプトを自動化しようとしています。私のコードは次のとおりです:

echo "& y y abc abc y y y y" | ./usr/bin/mysql_secure_installation

私が自動化している実際の質問は次のとおりです。

Enter current password for root (enter for none): <enter>
Set root password? [Y/n] y
New password: abc
Re-enter new password: abc
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

しかし、「申し訳ありませんが、ここで空のパスワードを使用することはできません」というエラーが表示されますが、画面では最初の質問のリターンキーを押していました。

55
KarthikJ

expect を使用してみてください。これを見る mysql_secure_installationの自動化 または 変更 を見てください。

21
Slam

私はこの質問に出くわしましたが、Bashスクリプトを使用してクエリを手動で実行することにしました。

#!/bin/bash

# Make sure that NOBODY can access the server without a password
mysql -e "UPDATE mysql.user SET Password = PASSWORD('CHANGEME') WHERE User = 'root'"
# Kill the anonymous users
mysql -e "DROP USER ''@'localhost'"
# Because our hostname varies we'll use some Bash magic here.
mysql -e "DROP USER ''@'$(hostname)'"
# Kill off the demo database
mysql -e "DROP DATABASE test"
# Make our changes take effect
mysql -e "FLUSH PRIVILEGES"
# Any subsequent tries to run queries this way will get access denied because lack of usr/pwd param
71
Sleavely

mysql_secure_installationは単なるBashスクリプトなので、 ここに示す生のソースコード をチェックアウトするだけです。読み取り行do_querydo_queryの後に追加したスペースがあることに注意してください。関数に対してクエリを検索する必要があります)すると、これらのコマンドを見つけることができます。

UPDATE mysql.user SET Password=PASSWORD('root') 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 IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;

この例では、パスワードをrootに設定していますが、セットアップのニーズに合わせて自由に変更してください。とにかく、MySQLコマンドの単純な山を取り、mysql_secure_installation.sqlという名前のファイルに保存します。

それが完了したら、スクリプトを使用して次のコマンドを実行し、MySQLインストールを保護します。

mysql -sfu root < "mysql_secure_installation.sql"

sはエラーを抑制し、fは1つがチョークしてもコマンドを強制的に続行します。 uは、直後に続くユーザー名(この場合は明らかにroot)に関連しています。

MySQLが最初にパスワードなしでインストールされ、キーボード操作なしでロックダウンするように設定されているデプロイメントスクリプトでそれを実行します。

PS:このスクリプトは、export DEBIAN_FRONTEND=noninteractiveが設定され、実際のインストールコマンドがSudo -E aptitude install -y --assume-yes -q mysql-server mysql-clientに設定されてインストールされたUbuntu 14.04上のMySQLインストールを保護するためにまとめられました。これを行うと、パスワードなしでMySQLがUbuntuに正常にインストールされます。これは、展開スクリプトに適しています。このmysql -sfu root < "mysql_secure_installation.sql"は、インストールが行われてから数秒ですべてをロックダウンします。

46
JakeGould

私はこれをCentOS 6.7で次のように実行しました:

mysql_secure_installation <<EOF

y
secret
secret
y
y
y
y
EOF
17
TSchroeder

これを試すことができます:

echo -e "\ny\ny\nabc\nabc\ny\ny\ny\ny" | ./usr/bin/mysql_secure_installation
1
Riccardo
Sudo mysql -e "SET PASSWORD FOR root@localhost = PASSWORD('123');FLUSH PRIVILEGES;" 

printf "123\n n\n n\n n\n y\n y\n y\n" | Sudo mysql_secure_installation

ルートの現在のパスワードを入力します(なしの場合は入力します)? (ルートに123が設定されています)

Unix_socket認証に切り替えますか? n

ルートパスワードを変更しますか? n

匿名ユーザーを削除しますか? n

リモートでrootログインを許可しませんか? y

テストデータベースを削除してアクセスしますか? y

今すぐ特権テーブルをリロードしますか? y

バージョン:mysql Ver 15.1 Distrib 10.4.6-MariaDB、osx10.14(x86_64)for readline 5.1

0
Stan Sokolov

MySqlのインストール後にルートパスワードを変更する簡単なコマンドを使用していますが、上記のerror (signal 9 kill)を取得しています

(FATAL: Chef::Exceptions::ChildConvergeError: Chef run process terminated by signal 9 (KILL)) Though the command works and password is changed the error is confusing.
script "change password" do
interpreter "bash"
user "root"
cwd "/tmp"
code <<-EOH
#MYSQL
root_temp_pass=$(grep 'A temporary password' /mysql/log/mysqld.log |tail -1 |awk '{split($0,a,": "); print a[2]}')

#Login as root change password
mysql -uroot -p"$root_temp_pass" -Be "ALTER USER 'root'@'localhost' IDENTIFIED BY 'Czt732ck#';" --connect-expired-password
EOH
end
0
sandeep
yum localinstall -y https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
yum install -y mysql-community-server

# start mysql service
service mysqld start

# get Temporary root Password
root_temp_pass=$(grep 'A temporary password' /var/log/mysqld.log |tail -1 |awk '{split($0,a,": "); print a[2]}')

echo "root_temp_pass:"$root_temp_pass

# mysql_secure_installation.sql
cat > mysql_secure_installation.sql << EOF
# Make sure that NOBODY can access the server without a password
UPDATE mysql.user SET Password=PASSWORD('yourrootpass') WHERE User='root';
# Kill the anonymous users
DELETE FROM mysql.user WHERE User='';
# disallow remote login for root
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
# Kill off the demo database
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
# Make our changes take effect
FLUSH PRIVILEGES;
EOF

mysql -uroot -p"$root_temp_pass" --connect-expired-password <mysql_secure_installation.sql

@JakeGouldの回答に基づく、mysql5.7の新規インストール用の自動スクリプト。 Centos 7.5.1804で正常に動作します。

0
Aiden Wang