J'essaie d'automatiser le script mysql_secure_installation avec une réponse automatisée. Mon code est le suivant:
echo "& y y abc abc y y y y" | ./usr/bin/mysql_secure_installation
Les questions que j'automatise sont les suivantes:
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
Mais cela me donne une erreur "Désolé, vous ne pouvez pas utiliser un mot de passe vide ici", mais à l'écran, j’appuyais sur la touche Retour pour la première question.
Vous pouvez essayer d'utiliser attendez . Regardez ceci automatisant mysql_secure_installation ou à mon modification .
Je suis tombé sur cette question, mais j'ai décidé de l'exécuter manuellement via un script 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
Puisque mysql_secure_installation
n'est qu'un script Bash, il suffit de consulter le code source brut comme indiqué ici . Cherchez les lignes qui lisent, do_query
(notez que l’espace supplémentaire que j’ai placé après do_query
; besoin de trouver des requêtes par rapport à la fonction) et ensuite vous pouvez trouver ces commandes.
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;
Notez que pour cet exemple, le mot de passe est défini sur root
, mais n'hésitez pas à le modifier pour l'adapter à vos besoins en matière de configuration. Quoi qu'il en soit, prenez cette pile de commandes MySQL et enregistrez-la dans un fichier nommé mysql_secure_installation.sql
.
Ceci fait, exécutez la commande suivante via un script pour sécuriser l’installation de MySQL:
mysql -sfu root < "mysql_secure_installation.sql"
Le s
élimine les erreurs et le f
force les commandes à continuer même si l’on étouffe. Le u
se rapporte au nom d'utilisateur qui le suit immédiatement qui, dans ce cas, est clairement root
.
Exécutez-le dans un script de déploiement où MySQL est initialement installé sans mot de passe et vous êtes prêt à le verrouiller sans aucune interaction du clavier.
PS: Ce script a été mis en place pour sécuriser une installation MySQL sur Ubuntu 14.04 qui a été installée avec le export DEBIAN_FRONTEND=noninteractive
set et la commande d’installation réelle étant définie sur Sudo -E aptitude install -y --assume-yes -q mysql-server mysql-client
. Faire cela installera proprement MySQL sur Ubuntu sans mot de passe; ce qui est bien pour les scripts de déploiement. Cette mysql -sfu root < "mysql_secure_installation.sql"
_ verrouille le tout en quelques secondes après l’installation.
Je viens de faire ceci sur CentOS 6.7 avec ce qui suit:
mysql_secure_installation <<EOF
y
secret
secret
y
y
y
y
EOF
Vous pouvez essayer ceci:
echo -e "\ny\ny\nabc\nabc\ny\ny\ny\ny" | ./usr/bin/mysql_secure_installation
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
Entrez le mot de passe actuel pour root (entrez pour aucun)? (J'ai 123 pour la racine)
Passer à l'authentification unix_socket? n
Changer le mot de passe root? n
Supprimer les utilisateurs anonymes? n
Interdire la connexion root à distance? y
Supprimer la base de données de test et y accéder? y
Recharger les tables de privilèges maintenant? y
Version: mysql Ver 15.1 Distrib 10.4.6-MariaDB, pour osx10.14 (x86_64) en utilisant readline 5.1
J'utilise une simple commande pour changer le mot de passe root après l'installation de MySql, mais pour obtenir l'Above 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
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
Un script automatisé pour une nouvelle installation de mysql5.7 basé sur la réponse de @ JakeGould. Fonctionne bien sur Centos 7.5.1804.