web-dev-qa-db-fra.com

Automatiser mysql_secure_installation avec la commande echo via un script shell

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.

55
KarthikJ

Vous pouvez essayer d'utiliser attendez . Regardez ceci automatisant mysql_secure_installation ou à mon modification .

21
Slam

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
71
Sleavely

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.

46
JakeGould

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
17
TSchroeder

Vous pouvez essayer ceci:

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

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

0
Stan Sokolov

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
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

Un script automatisé pour une nouvelle installation de mysql5.7 basé sur la réponse de @ JakeGould. Fonctionne bien sur Centos 7.5.1804.

0
Aiden Wang