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.

Etiquettes: 

Commentaires

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 ;).

Merci pour l'info

Ajouter un commentaire

Filtered HTML

  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plain text

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
CAPTCHA
Cette question permet de s'assurer que vous êtes un utilisateur humain et non un logiciel automatisé de pollupostage.
CAPTCHA visuel
Entrez les caractères (sans espace) affichés dans l'image.