C'est en baillant que la loutre le dit:

Loutre avec écouteurs

Drupal : Récupérer facilement les infos de la base de données avec bash ?

mer, 29/06/2011 - 16:54 -- mzw
drupal ninja

Rien de plus facile. Enfin...

egrep -r '^\$db_url' * | grep -v username | cut -d'=' -f2

Regardons cette commande plus en détails :

  • Le egrep (en lieu et place de grep) va permettre de faire une recherche avec des expressions régulières (regexp) avancées sans avoir besoin d'échapper les caractères spéciaux.
  • L'option -r fait en sorte de rechercher recursivement dans tous les fichiers (signalés par l'étoile) à partir du répertoire courant.
  • L'expression ^\$db_url signifie que je veux trouver toutes les lignes qui commencent par un $ (le signe ^ définit le début de ligne,le \ permet d'échapper le $ qui veut dire fin de ligne en regexp) suivit d'un db_url
  • L'étoile * va chercher dans tout les fichiers (wildcard)

Si on tape cette commande comme ça, après s'être placé dans le répertoire Drupal ( cd /var/www/drupal && egrep -r '^\$db_url' * ), on trouve un résultat de ce type :

www/sites/default/default.settings.php:$db_url = 'mysql://username:password@localhost/databasename';
www/sites/default/settings.php:$db_url = 'mysqli://mysqldrupal:motdepasse@localhost/base_de_donnee_perso';

C'est déjà pas mal. Par contre, on a les résultats du fichier default.settings.php, on n'en veut pas. Et l'indication "www/sites/default/default.settings.php:$db_url" est inutile également. On va donc allonger la commande et utiliser la barre verticale (pipe ou |) pour enchaîner les executables.

Premièrement, on vire les résultats du fichiers default.settings.php. On utilise grep avec l'option -v qui permet d'inverser les résultats :

egrep -r '^\$db_url' * | grep -v databasename

Ici, j'enlève toutes les lignes contenant "databasename". Il ne faut donc pas que ta base de donnée s'appelle databasename, en toute logique.

Finalement, on veut enlever le nom du fichier pour plus de clarté. On utilisera cut qui permet de définir certaines colonnes (-d pour delimitor) et de les afficher (-f pour field).

egrep -r '^\$db_url' * | grep -v databasename | cut -d'=' -f2

On peut dès à présent définir un alias (à mettre dans le fichier .bash_aliases s'il existe ou dans le fichier .bashrc.

alias drupaldb="egrep -r '^\\\$db_url' * | grep -v databasename | cut -d'=' -f2"

Remarquez le triple \\\. Commençons à la fin : le dernier est utilisé pour échapper le $ pour éviter que la suite ne soit prise comme une variable bash, le second est utilisé en tant que caractère non interprété et le premier échappe le second pour éviter que le second soit interprété. Clair ?

Et maintenant, sans cut et avec en utilisant find

Voici une autre méthode :

find . -name settings.php -exec egrep -o [a-z_1-9]+:[a-z_1-9]+@[a-z_1-9]+/[a-z_1-9]+ {} \; | grep -v databasename

Si tu tapes ces commandes hors du répertoire Drupal, il va faire un grep sur les répertoires enfants, et ça risque de prendre du temps.

Quelqu'un aurait une solution plus effective et sans pipe ?