Config pour ne plus taper ses mots de passe MySQL et plus encore avec les Options file
Depuis quelques mois je suis devops à plein temps et je passe une bonne partie de mon temps à jongler entre les différents serveurs MariaDB. Du coup je dois constamment taper des commandes à rallonge avec le host, le user, le nom de la bdd pour me connecter aux différentes instances.
La connexion sur une base de dev va me donner cette commande.
~$ mysql -hsql.local.dev -uulrich -p blog
TIP: ne mettez jamais votre mot de passe dans la ligne de commande, il est exposé dans les logs ou via un simple "ps".
Mais il est possible de se simplifier la vie avec le fichier .my.cnf à la racine de votre compte linux.
[mysql] pager = grcat ~/.grcat [client] user = ulrich password = "aucun!pourquoi?" database = blog host = sql.local.dev
Si vous êtes curieux sur la première ligne, je vous invite à lire mon article pour avoir de la coloration dans le client mysql.
Le group "client" ne sera lu que par les clients mysql. Ainsi ma commande précédente devient:
~$ mysql
Ok facile, seulement j'ai dis en intro que j'étais constamment en train de jongler entre les serveurs et là ma configuration ne me permet pas d'avoir plusieurs configs. Faisons donc évoluer le fichier de .my.cnf
[mysql] pager = grcat ~/.grcat [clientdev_blog] user = ulrich password = "aucun!pourquoi?" database = blog host = sql.local.dev [clientprod_blog] user = ulrich password = "CaSertARien" database = blog host = sql.exemple.com
On voit ici qu'il y a 2 groupes qui sont préfixés par "client" pour être sûr que seul les clients les lisent. Et pour chaque groupe je définis le user, le mot de passe, le nom de la base et le host.
Pour utiliser cette configuration il faut utiliser l'option --defaults-group-suffix avec le nom du groupe. La commande au dessus va donc devenir:
~$ mysql --defaults-group-suffix=dev_blog
L'avantage ici, c'est que je n'ai pas besoin de me souvenir du nom du serveur, même si ma config ssh me simplifie le travail, idem pour le user associé à la base. Quant au mot de passe, il ne m'est pas demandé contrairement à la première commande.
C'est bien mais au final le gain n'est pas si énorme car l'option est tout de même assez longue.
J'ai résolu ce problème en ajoutant un alias dans mon .bashrc:
function mysqlgr { mysql --defaults-group-suffix="$1"; }
Du coup ma commande devient:
~$ mysqlgr dev_blog
C'est plutôt pas mal, mais j'ai tout de même quelques limitations, il m'est impossible de chaîner les commandes avec mon alias ou de rajouter des options. Typiquement la commande ci dessous me connectera sur MySQL et ne fera rien d'autre:
~$ mysqlgr dev_blog -e "show create table test;"
Il reste encore un point super gênant. Votre mot de passe est en clair dans un fichier. Il faut donc veiller à changer les droits du fichier .my.cnf avec un chmod 600 ou 400 pour le limiter à votre utilisateur.
Tout ce dont j'ai parlé est compatible avec MySQL et MariaDB.
Il existe une autre solution qui est l'utilitaire mysql_editor_config. Cet utilitaire va créer un fichier .mylogin.cnf à la raçine du home. Son avantage est que le mot de passe est crypté et ne sera donc jamais exposé, en contrepartie on ne peut pas spécifier la base de donnée associé à l'utilisateur. Et malheureusement il n'est pas pris en charge par MariaDB, mais si vous avez la chance d'utiliser MySQL essayez le. Il faut installer libmysqlclient-dev sur debian/ubuntu pour l'installer.
Si vous êtes root sur l'ensemble de votre infrastructure vous pouvez aussi vous connecter à MySQL/MariaDB via votre compte linux en passant par le socket auth.
Réponse de Ulrich le 18 févr. 2018