BASH : exécuter une requête MySql et exploiter le résultat
Il est possible d'exécuter une requête MySql en BASH grâce à la commande echo et au client MySql.
Inconvénient
Mot de passe en clair dans la commande.
Avantage
Automatisation possible avec crontab.
Pré-requis
Un client MySql installé sur la poste
$ apt-get install mysql-client
Au préalable
En fonction de l'inconvénient cité ci-dessus, il est conseillé de créer un utilisateur MySql spécifique pour l'occasion. C'est à dire, un utilisateur ayant uniquement le privilège "SELECT" sur la base à utiliser. Affiner les privilèges sur les champs d'une table de la base pour plus de sécurité.
Pour cela, plusieurs solutions :
- avec phpmyadmin
- en ligne de commande
Exemple en ligne de commande :
Dans l'exemple, je souhaite utiliser les champs "champ1", "champ3" et "champ6" de la table "ma_table" de la base "ma_base". Je créé un user "toto" avec le mot de passe "pass" ayant le privilège "SELECT" sur les champs "champ1", "champ3" et "champ6" de la table "ma_table" de la base "ma_base". Pour terminer, je recharge les privilèges.
$ mysql -u root -p
mysql> CREATE USER 'toto'@'%' IDENTIFIED BY 'pass';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT SELECT ( `champ1` , `champ3` , `champ6` ) ON `ma_base`.`ma_table` TO 'toto'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES ;
Query OK, 0 rows affected (0.00 sec)
mysql> Bye
$
Exemple
Dans l'exemple ci-dessous, je vais donc effectuer une requête avec echo et le client MySql sur les champs "champ1", "champ3" et "champ6" de la table "ma_table" de la base "ma_base" sur mon serveur MySql avec l'utilisateur toto, mettre le résultat en forme grâce à awk et à la commande pr et enfin, envoyer le résulat par mail avec la commande mail.
$ echo "select champ1, champ3, champ6 from ma_base.ma_table order by 3 desc;" | mysql -h mon_serveur_mysql -u toto -ppass | awk 'BEGIN{printf("%-15s %-35s %-5s\n","COL1","COL2","COL3")}NR>1{printf("%15d %-35s %5d\n",$1,$2,$3)}' | pr -h "Le resultat de ma requete SQL" | mail -s "Le resultat de ma requete SQL" moi@domaine.fr
Avec la commande awk, j'ajoute des en-têtes de champs personnalisés dans la section BEGIN et je récupère uniquement les données de la requête en supprimant la première ligne qui contient les noms des champs MySql (NR>1) et le tout mis en forme avec la fonction printf.
Pour ne pas afficher la première ligne contenant le nom des champs, il est également possible d'utiliser la commande mysql avec l'option -N.
Avec la commande pr et l'option -h, j'ajoute un titre à mon rapport.
Commentaires
Philippe (non vérifié)
jeu, 11/05/2017 - 17:10
Permalien
Mise à jour
Depuis la version 5.6 de MySQL, il est conseillé de sécuriser les connexions MySQL dans les scripts grace à mysql_config_editor.
Le mot de passe n'est donc plus visible dans le script bash ;).
ronan
ven, 12/05/2017 - 09:19
Permalien
Super
Merci pour l'info
Ajouter un commentaire