dotfree.sh: un script shell pour interroger la base whois

visuel dotfree

Voici un script bash dont la fonction est d'interroger la base de données Whois afin de savoir si un ou plusieurs noms de domaine sont disponibles.
En plus de l'affichage du résultat en console il est possible de garder une trace de toutes ses requêtes dans un fichier texte.

Installation

Il n'y a pas d'installation à proprement parler, téléchargez ou copiez puis collez l'intégralité du script ci-dessous dans un fichier que l'on enregistrera sous le nom dotfree.sh dans l'emplacement de votre choix. En fait vous pouvez le nommer comme vous voulez on s'en moque mais il faut bien lui donner un nom un alors pourquoi pas celui-là!

#!/bin/bash

################################
### INTERROGER LA BASE WHOIS ###
### ======================== ###
### Une aimable contribution ###
###      GOGOLPLEX.ORG       ###
################################

# enregistrer dans un fichier? : 0 = non 1 = oui
printfile=1
# si notavailable=1 écrire également les domaines non libres? :  0 = non 1 = oui
notavailable=1
# chemin et nom du fichier à enregistrer
pathrec="$HOME/whois.txt" 

# tableau des domaines à tester
tab_tld=( 
    '.com' 
    '.net' 
    '.org' 
    '.info'
    '.biz'
    '.edu'
    '.mobi'
    '.name'
    '.eu'
    '.fr' 
    '.be'
    '.ca'
    )
# /!\ attention: les cles des tableaux tab_tld et tab_msg doivent correspondre
# tableau des retours whois en cas de succès
tab_msg=(
    'No match for'                      #.com
    'No match for'                      #.net
    'Domain not found'                  #.org
    'Domain not found'                  #.info
    'No Data Found'                     #.biz
    'NO MATCH'                          #.edu
    'Domain not found'                  #.mobi
    'No match for'                      #.name
    'AVAILABLE'                         #.eu 
    'NOT FOUND'                         #.fr
    'Status:    AVAILABLE'              #.be
    'Not found'                         #.ca
    )

# compter les entrées des tableaux (-1 pour index 0)
let "n=${#tab_tld[*]} -1"

# tester si un paramètre existe
if [ -z $1 ] ; then
    echo -e "\033[1;41;37mLa commande doit être appelée avec une chaîne de caractère en paramètre.\033[32m \nex: dotfree nom.tld\033[0m"
else
    # tester si la syntaxe est correcte
    b=`expr match "$1" '\([a-zA-Z0-9.-]*\)'`
    if [ $1 == $b ]; then
        # la syntaxe est bonne on regarde si il y a une extension tld
        tld=${b#*.}
        nom=${b%%.*}
        # si tld == nom c'est qu'il n'y a pas d'extension on test donc avec tous les tld connus
        if [ $tld == $nom ]; then
            for i in `seq 0 $n`
            do
                tld_name="$1${tab_tld[$i]}"
                # enfin on regarde si le domaine est libre pour ces extensions
                if [ -z "`whois $tld_name | grep "${tab_msg[$i]}"`" ]; then
                    echo -e "\033[1;41;37m \033[0m $tld_name est déjà enregistré"
                    #écrire dans le fichier
                    if [ $printfile == 1 ] && [ $notavailable == 1 ]; then
                        echo "-- $tld_name" >> "$pathrec";
                    fi
                else
                    echo -e "\033[1;42;37m \033[0m $tld_name est libre"
                    # écrire dans le fichier
                    if [ $printfile == 1 ]; then
                        echo "++ $tld_name" >> "$pathrec";
                    fi
                fi
            done
            # écriture du séparateur
            if [ $printfile == 1 ]; then
                echo "=======================================================" >> "$pathrec";
            fi

        # si tld != nom alors il y a une extension.???
        else
            # on regarde si cette extension est connue dans tab_tld
            ext=".$tld"
            id="not"
            for i in `seq 0 $n`
            do
                if [ ${tab_tld[$i]} == $ext ];then
                    id=$i
                fi
            done
            # si l'extension à été trouvée alors id correspond à la clé des tableaux tab_tld et tab_msg sinon id vaut "not"
            if [ $id == "not" ];then
                echo -e "\033[1;41;37mTLD \"$ext\" inconnue.\033[0m"
            else
                # enfin on regarde si le domaine est libre pour cette extension
                if [ -z "`whois $1 | grep "${tab_msg[$id]}"`" ]; then
                    echo -e "\033[1;41;37m \033[0m $1 est déjà enregistré"
                    # écrire dans le fichier
                    if [ $printfile == 1 ] && [ $notavailable == 1 ]; then
                        echo "-- $1" >> "$pathrec";
                    fi
                else
                    echo -e "\033[1;42;37m \033[0m $1 est libre"
                    # écrire dans le fichier
                    if [ $printfile == 1 ]; then
                        echo "++ $1" >> "$pathrec";
                    fi
                fi
                # ecriture du séparateur
                if [ $printfile == 1 ]; then
                    echo "=======================================================" >> "$pathrec";
                fi
            fi
        fi
    else
        # mauvaise syntaxe 
        echo -e "\033[1;41;37mErreur de syntaxe pour \"$1\":\033[0m\033[1;37m seuls les caractères alphanumériques et le tiret peuvent former un nom de domaine correcte.\033[0m"
    fi;
fi;

Rendez vous dans le répertoire où vous avez placé ce fichier et rendez le exécutable.

$ chmod +x dotfree.sh

Modifier quelques paramètres

Comme mentionné ci-dessus, le script permet d'écrire un résumé des requêtes dans un fichier texte. C'est ce qu'il fera si vous ne le modifiez pas.
Si vous ne souhaitez pas utiliser cette option, modifiez la valeur de la variable "printfile" en lui donnant comme valeur 0.

printfile=0

Si vous souhaitez sauvegarder uniquement les retours avec des domaines libre dans ce fichier, modifiez la valeur de la variable "notavailable" en lui donnant comme valeur 0.

notavailable=0

Par défaut le script enregistrera un fichier whois.txt dans le répertoire personnel de l'utilisateur courant, modifiez la valeur de la variable "pathrec" si vous souhaitez enregistrer les retours vers un autre emplacement et/ou sous un nom différent.

pathrec="autre/chemin/autre_nom.txt"

Utilisation

Lancer le script avec en argument un nom de domaine et une extension effectuera une recherche whois uniquement sur ce critère.

$ ./dotfree.sh gogolplex.org
gogolplex.org est déjà enregistré

Lancer le script avec en argument un nom de domaine sans suffixe effectuera une recherche whois avec toutes les extensions déclarées dans le script.

$ ./dotfree.sh gogolplex
 gogolplex.com est déjà enregistré
 gogolplex.net est déjà enregistré
 gogolplex.org est déjà enregistré
 gogolplex.info est libre
 gogolplex.biz est libre
 gogolplex.edu est libre
 gogolplex.mobi est libre
 gogolplex.name est libre
 gogolplex.eu est déjà enregistré
 gogolplex.fr est libre
 gogolplex.ch est libre
 gogolplex.be est déjà enregistré
 gogolplex.ca est libre

Placer le script dans un répertoire du $PATH vous permettra de l'appeler de n'importe où.

Ajouter des suffixes (tld)

Tel qu'il est, le script ne propose qu'une liste non exhaustive des extensions tld disponibles mais rien n'empêche d'en ajouter (ou d'en enlever).

Supposons que l'on souhaite ajouter à la liste des tld les domaines ayant pour extension .co.uk.
Dans une console tapez la commande suivante:

$ whois xbnvxnbvxnbxvnxvxn.co.uk

j'ai choisi volontairement un nom de domaine absurde (xbnvxnbvxnbxvnxvxn.co.uk) afin d'être certain qu'il soit libre.

Voici ce que whois me répond:

No match for "xbnvxnbvxnbxvnxvxn.co.uk".

    This domain name has not been registered.

    WHOIS lookup made at 19:42:40 20-Feb-2013

-- 
This WHOIS information is provided for free by Nominet UK the central registry
for .uk domain names. This information and the .uk WHOIS are:

   Copyright Nominet UK 1996 - 2013.

You may not access the .uk WHOIS or use any data from it except as permitted
by the terms of use available in full at ...
...

les réponses sont différentes selon le tld interrogé et peuvent changer au fil du temps.

Ici la ligne qui nous intéresse est la première, No match for "xbnvxnbvxnbxvnxvxn.co.uk"..
On copiera juste No match for qui sera l'élément commun à toutes les requêtes fructueuses pour un tld .co.uk.

No match for signifie qu'aucun enregistrement pour ce domaine n'a été trouvé et que ce dernier est donc libre.

Au début du script on peut voir 2 tableaux:
* tab_tld qui contient la liste des tld (.com .net ...)
* tab_msg qui contient une chaîne de caractère présente dans les retours fructueux d'une requête whois (No match for dans notre exemple).

Vous l'aurez compris il suffit d'ajouter ".co.uk" au tableau "tab_tld" et "No match for" au tableau "tab_msg".

Toutefois attention, à chaque entrée du tableau tab_tld correspond une entrée du tableau tab_msg au même index. Ainsi si l'on souhaite placer le tld ".co.uk" entre le ".eu" et le ".fr" dans le tableau tab_tld, il faudra impérativement placer la chaine "No match for" entre les entrées "AVAILABLE" et "NOT FOUND" dans le tableau tab_msg.

Bug possible

J'ai eu quelques soucis avec le domaine .be. Le script refusait obstinément de reconnaître l'expression Status: AVAILABLE. Il m'a fallu quelques minutes avant de comprendre que mon éditeur changeait les tabulation par quatre espaces. Veillez donc à ce que les entrées du tableau tab_msg soient cohérentes avec les retours de la commande "whois".

Il existe sans doute une manière plus élégante de se prémunir de ce genre de problème sur le quel je me pencherai tôt ou tard.

23-Apr-2023
^