Je voudrais exécuter un script mysql où l'utilisateur est invité à entrer le mot de passe de manière dynamique à partir de la ligne de commande, si possible avec un message Enter your $root password
. Cependant, cela ne fonctionne pas comme prévu. Jusqu'ici j'ai
mysql -u root -p CREATE DATABASE IF NOT EXISTS Test
de plus, quand la base de données est créée, comment se déconnecter de mysql et revenir aux commandes bash?
Selon le docs
mysql -u root -p --execute="SELECT User, Host FROM mysql.user"
demande un mot de passe, exécute la commande donnée et retourne au shell (aucune déconnexion requise).
Si vous souhaitez plutôt créer votre propre invite, vous devez en faire un script:
#!/usr/bin/env bash
echo "Enter pwd"
read pwd
mysql -u root -p$pwd --execute="SELECT User, Host FROM mysql.user"
Veuillez noter qu'il ne doit y avoir aucun espace entre -p
et $pwd
car mysql
considère alors $pwd
comme étant le nom de la base de données.
Je ne le recommanderais pas car le mot de passe est ensuite affiché en texte clair dans le terminal, alors que mysql -p
affiche des astérisques à la place.
Scripter des requêtes MySQL peut être fait de plusieurs manières. La réponse de PerlDuck concerne déjà le paramètre -e
ou --execute
. Une autre solution consisterait à utiliser la commande source
de MySQL elle-même pour exécuter un script SQL:
$ mysql -u root -p -e 'source foo.sql'
Enter password:
+------+-------------+
| a | b |
+------+-------------+
| 1 | hello world |
+------+-------------+
$ cat foo.sql
use foo_db;
SELECT * FROM foo_tb;
Une autre méthode consiste à rediriger le script dans mysql
's stdin
:
$ Sudo mysql -u root -p < foo.sql
Enter password:
a b
1 hello world
Notez la différence de formatage dans chaque cas. Bien sûr, vous pouvez aussi utiliser here-doc ou herestring pour obtenir les mêmes résultats, bien que l’utilisation d’un fichier texte permette d’exécuter de longues requêtes, tandis que la documentation ici et les chaînes ici sont plus utiles pour les instructions modérément courtes.