Initiation aux scripts shell pour automatiser des tâches – Structures de contrôle

Après avoir survécu à la canicule, nous repartons en quête de l’automatisation de tâches avec notre fidèle ami le Shell. Dans les articles précédents, nous avons vu comment créer un script Shell, puis la création et consultation de variables. Maintenant, afin de pouvoir analyser et réagir avec les données contenues dans ces variables, nous allons avoir besoin de structures de contrôle.

Les structures de contrôle sont le pilier fondamental de la programmation. Ce sont ces structures qui vont nous permettre de prendre une décision si une valeur spécifique a été atteinte. A nous de bien préciser laquelle (lesquelles). Avec les structures de contrôle dont nous allons parler ci-dessous et qui ont déjà été vues dans d’autres langages (voir article), il est possible de traiter la plupart des cas de figures connus en Shell.

Bonnes pratiques

Voici un petit rappel sur les bonnes pratiques à respecter lorsque vous faîtes de la programmation (peu importe le langage).

Bien commenter son code

En Shell, tout ce qui suit un # jusqu’à la fin de la ligne est considéré comme un commentaire. Un commentaire c’est du texte qui n’est pas interprété mais dont la présence doit être utile au lecteur pour bien comprendre le code. Même si vous ne le faîte pas pour les autres, faîtes le au moins pour vous, car relire son propre code 6 mois après peut s’avérer parfois compliqué.

La condition if

La condition if (SI) est une structure de contrôle indispensable à tout langage de programmation. C’est une base pour d’autres structures plus complexe et permet de prendre une décision face à un cas de figure défini.

SI [ $ELEMENT = VALEUR ]
ALORS
    # Instruction à exécuter
SINON
    # Instruction à exécuter
FIN

Pour la suite de cet article, nous aurons besoin de vérifier si un dossier est vide ou pas. Une commande et un if vont nous permettre d’y parvenir simplement.

#!/bin/sh
 
dossier="/tmp/mon_dossier"
# Cette méthode permet d'obtenir le nombre de fichiers présent dans $dossier
# La variable $# contient normalement le nom d'argument passé au script, ici il s'agit du nombre d'éléments retournés
set - ls $dossier
# Si il y a 0 fichier, le dossier est vide
if [ $# = 0 ]
then
    echo "$dossier est vide"
else
    echo "$dossier non vide"
fi

La structure case (switch)

Cette structure particulière, permet d’écrire simplement des instructions pour chaque cas de figure à traiter. Attention toutefois, ce n’est qu’une facilité d’écriture, car dans les faits, cette structure se comporte comme un if, else if, else.

Une petite représentation logique pour case

CAS $variable POUR
    Valeur1)
        # Instructions spécifiques si $variable = Valeur1
        # Ne pas oublier de terminer chaque condition par un ;; (break dans les autres langages) sinon les autres conditions seront exécutées aussi.
        ;;
    ValeurX)
        # Instructions spécifiques si $variable = ValeurX uniquement
    ValeurY)
        # Instructions spécifiques si $variable = ValeurX et ValeurY
        ;;
    *)
        # Instructions à exécuter pour tous les autres cas de figure
FIN

Voici un exemple d’utilisation de la structure case en shell. On retrouve très souvent cette structure dans les scripts de lancement et d’arrêt des services dans /etc/init.d sur Linux.

#!/bin/sh
 
# On prend une décision en fonction du premier argument passé au script
case $1 in
    start)
        echo "Démarrage du service"
        ;;
    stop)
        echo "Arrêt du service"
        ;;
    reload)
        reload=1
    restart)
        if [ reload = 1 ]
        then
            echo "Rechargement du fichier de configuration"
        else
            echo "Redémarrage du service"
        fi
        ;;
    *)
        echo "Erreur! Les argument autorisé en paramètres sont : start, stop, reload, restart"
esac

La fonction

En shell, la fonction est une structure de contrôle qui se comporte comme l’appel à un script externe. Il faut voir ça comme un script dans un script. Un fonction est une série d’instructions regroupées dans un espace logique que nous pouvons exécuter avec des arguments et qui peut retourner une valeur.

Voici la représentation logique d’une fonction

function nom_fonction {
    # Instruction à exécuter
    return code_retour
}

# Pour appeler la fonction
nom_fonction arg1 arg2
# Afficher le code retour de la fonction
echo $?

Voici une petite fonction en shell qui traite des arguments et retourne une valeur.

#!/bin/sh
 
function multiplie {
    ret=`expr $1 "*" $2`
 
    return $ret
}
 
echo -en "2 multiplié par 3 = "
multiplie 2 3
# Affiche le code retour de la fonction appelée
echo $? # Affichera 6

La boucle while

Si vous devez traiter un fichier texte par ligne, alors cette boucle sera sans doute votre meilleure amie. En effet, la boucle while (TANT QUE) répète les mêmes instructions tant qu’une condition est vraie. Plutôt que de réécrire les mêmes instructions pour traiter (par exemple) chaque ligne d’un fichier, while vous propose de les réutiliser tant qu’il y a des lignes à traiter.

Voici ce que donne une boucle while logiquement.

TANT QUE condition vraie
ALORS
    # Instructions à exécuter
FIN

Afin d’illustrer l’utilisation de cette boucle, nous allons traiter un fichier texte ligne par ligne en shell.

#!/bin/sh
 
# Le fichier à traiter est passé en argument
$fichier = $1
# On définit le symbole séparateur de champs
IFS=';'
# Numéro de ligne courant
nl=1
 
# On teste si le fichier existe
if [ -f $fichier ]
then
    # Pour chaque ligne du fichier lue, on applique le séparateur de champs ; qui sera remplacé par un espace afin de séparer les champs
    cat $fichier | while read ligne
    do
        # ajout.pl ajoute la ligne avec les champs à une base de données existante
        ajout.pl $ligne
        # Cas d'erreur
        if [ $? = 1 ]
        then
            echo "Erreur de traitement à la ligne $nl du fichier $fichier"
        fi
        # Incrémentation de la ligne en cours
        nl=expr $nl "+" 1
    done
else
    echo "Le fichier $fichier n'existe pas"
    return 1
fi

La boucle for

La boucle for va nous permettre comme son nom l’indique, d’exécuter en boucle la même série d’instructions pour tous les éléments d’une liste. Autrement dit, plutôt que de réaliser le même travail pour les 10 éléments d’une liste, nous allons l’écrire une fois et la structure l’appliquera à chacun des éléments.

Voici à quoi ressemble une boucle for d’un point de vue logique

POUR $ELEMENT DANS $LISTE
    FAIRE
    # Instructions à exécuter
FIN

Un petit exemple pour illustrer son utilité. Nous avons des agences situées dans différentes villes en France : Auxerre, Beauvais, Bordeaux, Grenoble, Lyon, Nantes, Paris, Valence qui déposent des fichiers sur notre serveur. Tous les soirs à 19h, un script planifié (par Cron) s’exécute pour traiter les fichiers envoyés par les agences puis les supprime après traitement. On part du principe que le traitement archive les fichiers.

Voici en Shell ce que cela pourrait donner… Bien entendu, il est possible de faire mieux (autrement), mais c’est pour illustrer un exemple d’utilisation.

#!/bin/sh
 
# La fonction liste le dossier passé en argument
# Retourne 0 si le dossier est vide, sinon, retourne la liste des fichiers
function liste_dossier {
    # Le premier argument de la fonction est le dossier à contrôler
    set - ls $1
    # Si il y a 0 fichier, le dossier est vide
    if [ $# = 0 ]
    then
        return 0
    # Si il y a des fichiers, on retourne la liste
    else
        return $*
    fi
}
 
# On définit la liste des agences (attention au respect des majuscules/minuscules dans le nom des dossiers)
agences='Auxerre Beauvais Bordeaux Grenoble Lyon Nantes Paris Valence'
# on définit le dossier racine des agences
racine='/var/www/data/agences'
# Pour chaque agence
for $a in $agences
do
    # Constitution du chemin vers le dossier de l'agence
    dossier=${racine}"/"{$a}
    # Analyse du dossier de l'agence
    $fichiers=liste_dossier $dossier
    if [ $fichiers = 0 ]
    then
        # Un peu d'affichage à titre informatif
        echo "Pas de fichier à traiter pour l'agence $a"
    else
        # Pour chaque fichier de l'agence, on exécute le traitement: traitement.pl (script en perl)
        for $f in $fichiers
        do
            echo "Traitement du fichier $f de l'agence $a"
            # On concatène (assemble) les variables afin de générer le chemin vers le fichier à traiter
            /home/spec/bin/traitement.sh $dossier"/"$f
            # Contrôle d'erreur du traitement
            if [ $? = 0 ]
            then
                echo "Traitement sans erreur pour le fichier $f de l'agence $a"
            else
                echo "Le traitement a rencontré des erreurs dans le fichier $f de l'agence $a"
            fi
        done
    fi
done

Astuce : Ne cherchez pas d’information sur les conditions possibles dans man if ou man while, mais dans man test, toutes les conditions applicables aux structures étudiées plus haut (if, while) sont représentées dans cette manpage.

Dans les prochains articles consacrés au shell, nous ferons le tour de quelques commandes utiles pour vos scripts.

Initiation aux scripts shell pour automatiser des tâches – Les variables

Vous en avez marre de taper les mêmes commandes tous les jours pour réaliser une opération quelconque qui pourrait très bien se passer de vous? Marre d’être esclave de la machine alors cela devrait être le contraire? Dans cette série d’articles consacrée aux scripts shell, nous mettons au travail nos neurones pour déléguer une partie (la moins intéressante) de nos tâches afin de rendre notre quotidien plus intéressant.

Dans l’article précédent, nous avons vu comment créer notre premier script shell, le rendre exécutable et enfin comme lui faire prendre en compte des arguments. Dans cet article, nous allons parler des variables.

Avant d’aller plus loin, si vous ne savez pas qu’est une variable ou que vous souhaitez en savoir plus, je vous invite à lire cet article d’initiation à la programmation consacré aux variables.

Les variables

En shell une variable se défini comme suit:

variable=valeur
 

variable est le mot qui, à chaque appel précédé d’un dollar $, vous permettra d’accéder à la valeur. En shell, une variable peut contenir les données ci-dessous:

# Le résultat d'une commande (liste ou chaîne de caractères)
resultats=`commande`
# Une liste, qui, traité par la structure de contrôle adaptée se comportera un peu comme une variable tableau
# Chaque élément de la liste est séparé de l'autre par un espace
liste="elem1 elem2 elem3 elem4 elem5 elem6"
# Une valeur numérique
nombre=123
# Une chaîne de caractère
chaine="blablabla"
# La valeur d'une autre variable (ne pas oublier de placer un dollar <strong>$</strong> devant le nom de la variable appelée)
# Ici copie contiendra la liste de valeurs "elem1 elem2 elem3 elem4 elem5 elem6"
copie=$liste

Les variables d’environnement

Les variables d’environnement sont propres à chaque système d’exploitation. Elles sont en général définies dans des scripts au démarrage du système et seront indispensables bon fonctionnement de ce dernier. A chaque lancement de terminal ou d’un script shell, les variables d’environnement seront chargées à partir de scripts existants. (/home/user/.bashrc, /home/user/.profile, /etc/environment)

Voici quelque exemples de variables d’environnement (la commande printenv permet d’afficher les variables d’environnement):

  • PATH : Chemin de recherche pour les commandes (à la saisie d’une commande, le shell partira à sa recherche dans les chemins définis)
  • SHELL : Contient le chemin vers l’interpréteur de commandes utilisé.
  • SSH_TTY : Chemin vers le numéro de terminal utilisé
  • HOME : Dossier utilisateur (home directory)

Pour définir une variable d’environnement, il suffit de saisir la commande export NomVariable (où NomVariable est à remplacer par le nom de votre variable).

Les variables spéciales

Comme dans la plupart des système de programmation, il existe un certain nombre de variables spéciales qui sont prédéfinies.

  • $@ : Liste des paramètres (séparés par des espaces) passés au script lors de son exécution
  • $* : Liste des paramètres (séparés par le caractère défini dans la variable spéciale IFS) passés au script lors de son exécution (dépend de l’interpréteur utilisé)
  • $# : Affiche le nombre de paramètres passés au script lors de son exécution
  • $? : Contient le code retour de la dernière commande exécutée. Permet de contrôler le déroulement d’une commande afin de réaliser des traitements conditionnels
  • $$ : Contient le numéro du processus du script en cours d’exécution. Programmes ou scripts, chaque processus possède un numéro unique pour l’identifier (voir commande ps)

Bien entendu il existe d’autres variables prédéfinie mais elles sont réservées à des utilisations spécifiques que nous ne verrons pas dans cet article. Ici nous parlons du shell en général (sh), mais certains shell très aboutis comme BASH possèdent de nombreuses variables spéciales et permettent de réaliser des opérations complexes sur les variables (découpage et traitement des mots).

Quelques exemples

Stocker le résultat d’une commande dans une variable

# Resu va contenir le résultat de la commande ls /tmp
resu=`ls /tmp`
# On appelle le contenu de la variable avec la commande echo et en précédant son nom d'un dollar <strong>$</strong>
echo $resu
# Le résultat affiché devrait ressembler à quelque chose comme ça (une liste dont chaque élément est séparé par un espace)
hsperfdata_root lost+found mc-root wsdl-jmch-c392d33ea3aa33c8796f5613216f2edb

Enrichir une variable existante

#Ajoute un dossier au PATH (chemin de recherche pour l'éxécution des commandes)
PATH=$PATH:/home/dir/bin
 
# Affiche le résultat
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/dir/bin

Récupérer le code retour d’une commande

# Effectue une recherche de motClé dans tous les fichiers contenu dans /var/www/dossier
grep -r "motClé" /var/www/dossier
# Stocke le code retour de la commande dans la variable ctrl
ctrl=$?
# Affiche le code retour
echo "Le code retour de la commande grep est : " $ctrl

Substitutions

Certains traitement spéciaux permettent de découper ou remplacer le contenu des variables selon certaines conditions. Cela s’appelle la substitution. Une fois encore, certains interpréteur plus évolués permettrons des substitutions bien plus pratiques et nombreuses.

# Définition du contenu de la variable toto
toto="machin"
# Affiche le contenu de la variable toto
echo ${toto} # Affiche : machin
 
# Contenu de substitution si la variable titi est nulle (non définie). Ce qui est le cas ici présent
# Le contenu de la variable n'est pas affecté, c'est seulement une valeur de remplacement qui sera utilisé pour cet affichage
echo ${titi:-autrechose} # Affiche : autrechose
 
# Contenu de substitution si la variable titi est nulle (non définie). Ce qui est le cas ici présent
# Cette fois le contenu de la variable est remplacé
echo ${titi:=autrechose} # Affiche : autrechose
 
# Affiche un message sur la sortie d'erreur standard (stderr) si la variable n'est pas définie
toto={$titi:?Valeur absente} # Affiche : Valeur absente
 
# Contenu de substitution si la variable titi existe (contenu défini)
# N'affecte pas le contenu de la variable, il s'agit d'une valeur de remplacement utilisée pour cet affichage
echo ${titi:+remplacement} # Affiche : remplacement
 
# Découpage du contenu par caractère
# Au préalable on définit la valeur de titi avec un texte long
titi="total 4 -rw-r--r-- 1 jmch jmch 1749 Jun 29 02:44 out.txt"
# On commence l'affichage de la variable à partir du caractère n°48
echo ${titi:48} # Affiche : out.txt
# On commence l'affichage de la variable à partir du caractère n°48 et on le limite à 6 caractères seulement
echo ${titi:48:6} # Affiche : out.t

Nous venons de faire un bref tour des possibilités concernant les variables. Comme dit plus haut, il existe de nombreuses autres possibilités qui vont dépendre de l’interpréteur de commande utilisé. Dans les prochains articles nous allons parler des structures de contrôle qui nous permettront d’analyser des résultats afin de prendre des décision ou encore de traiter des listes de valeurs.

Initiation aux scripts shell pour automatiser des tâches sur Linux

Vous réalisez les mêmes tâches tous les jours ou de manière régulière (sauvegarder des fichiers ou une base de données, envoyer des emails de rappel ou d’alerte)? Savez vous que vous pouvez automatiser ces tâches? Les systèmes UNIX / Linux bien qu’austères en apparence, permettent d’exécuter des ensembles de tâches sous forme de script. Il s’agit de scripts shell, mais vous entendrez également parler de batch ou de traitement par lot. Dans cette série d’articles, je vais vous montrer combien il est simple de créer un script, de récupérer des arguments pour automatiser des tâches.

Automatiser des tâches c’est vous libérer du temps pour réaliser d’autres tâches plus valorisantes qui nécessitent la réflexion d’un humain.

Le shell n’est pas réellement un langage de programmation en soi (en tout cas pas comme le C ou le Perl). Il s’agit principalement de commandes qui sont appelées les unes à la suite des autres avec quelque structures de contrôles (pour ceux qui ne savent pas ce que ce c’est, je vous invite à lire mon article sur les structures de contrôle) qui permettent de traiter des conditions et des listes de données ou encore de récupérer des valeurs retournées par les commandes sous forme de code retour.

Choisir son terminal

Avant toute chose vous devez (si ce n’est pas déjà fait) utiliser un terminal pour accéder à l’interpréteur de commande. Pour ce faire, soit vous travaillez sur Linux dans quel cas la question ne se pose pas car il y a abondance de choix (xterm, gnome-terminal, konsole, etc…) soit vous êtes sur Windows et si vous n’avez pas d’émulateur de terminal je vous propose de télécharger et d’installer le logiciel libre Putty disponible sur http://www.putty.org/.

Choisir son éditeur de texte

Pour créer un script, vous devez d’abord utiliser un éditeur de texte. Attention! Pas Word ni Libre Office Writer sans quoi les scripts ne fonctionneront pas. Il faut un éditeur de texte pur. En fonction du système sur lequel vous travaillez voici des nom d’éditeurs qui peuvent faire l’affaire:

  • Notepad
  • Notepad++
  • Edit
  • Gedit
  • Kate
  • Vi
  • Vim
  • Emacs
  • nano

Notre premier script

Maintenant que nous avons notre émulateur de terminal et que nous sommes équipés d’un éditeur de texte, nous allons pouvoir commencer le travail. La première ligne à saisir dans un script qui sera exécuté en ligne de commande est le chemin et le nom de l’interpréteur de commande.

Une fois encore, en fonction du système sur lequel vous travaillez, il existe plusieurs interpréteurs qui possèdent chacun une racine commune (le shell ou sh) puis des spécificités. En voici quelques uns

  • bash (bash sera l’interpréteur utilisé)
  • csh
  • dash
  • ksh
  • sh
  • zsh

La première ligne d’un script doit commencer par un dièse # suivi d’un point d’exclamation ! puis l’interpréteur de commande choisi avec le chemin d’accès absolu soit dans notre cas:

#!/bin/bash
 
terminal vim

A partir de maintenant l’interpréteur va tenter d’exécuter toutes les lignes qui vont suivre à l’exception de celles qui débutent par un dièse # qui seront considérées comme des commentaires.

Pour afficher quelque chose (du texte ou une variable) vous devrez utiliser la commande echo. Par exemple pour afficher les arguments du script on va taper les lignes qui suivent:

#!/bin/bash
 
# Je suis un commentaire, donc je ne serai pas interprété
# Les commentaires servent à aider les personnes qui lisent le script
 
# L'argument 0 correspond au nom du script, cet argument s'appelle avec la variable $0
echo "Nom du script: $0"
 
# L'argument 1 correspond au premier argument passé au script, il s'appelle avec la variable $1
echo "Premier argument: $1"
 
# L'argument 2 correspond au premier argument passé au script, il s'appelle avec la variable $2 (etc pour tous les autres arguments)
echo "Second argument: $2"

Une fois que vous avez enregistré votre script, vous devez le rendre exécutable. Il s’agit d’une simple formalité sur UNIX qui indique au système que votre script doit être exécuté lorsqu’il est appelé dans un terminal. Cette action est réalisée avec la commande UNIX chmod.

chmod 755
 

Maintenant que nous avons rendu notre script exécutable, nous allons l’appeler comme suit (nous avons nommé notre script script.sh):

./script.sh arg_1 arg_2
Nom du script:  ./script.sh
Premier argument:  arg_1
Second argument:  arg_2
terminal shell

le ./ avant le nom du script précise que nous appelons ce dernier depuis le dossier dans lequel nous nous trouvons (dossier courant, variable $PWD, commande pwd).

Dans les prochains articles nous irons plus loin dans les mécanismes et fonctionnalités des scripts afin de réaliser des actions précises, de récolter les résultats (codes retour) puis de les traiter de manière conditionnelle.

Paramétrer un routeur sous Linux en ligne de commande

A tout ceux qui m’ont dit que « Linux c’est compliqué », je dédie cet article consacré au routage TCP/IP sur Linux. Dans cet article je démontre comment, en quelques lignes vous pouvez activer le routage sur votre machine Linux ainsi que le le NAT.

Définitions

Routeur : Un routeur peut être un ordinateur ou un système spécialisé et consacré uniquement à cette tâche (routeur Cisco, Box internet etc…). Un routeur doit avoir au minimum 2 interfaces réseau pour pouvoir réaliser du routage. L’action du routeur consiste à diriger les paquets (requêtes) d’un réseau vers un autre lorsque cela est nécessaire.

Lorsqu’un ordinateur souhaite se connecter sur un site web qui se trouve sur internet, le routeur (votre box par exemple) se charge de faire le lien entre votre réseau local et internet.

Voici un petit schéma pour résumer ce que nous venons de voir.

routeurNat

NAT : Network Address Translating, soit traduction d’adresse réseau. Il s’agit d’un service complémentaire aux routeurs (principalement pour ceux faisant le lien entre un réseau local et internet) qui transforme les paquets routés, de manière à remplacer l’adresse IP de l’ordinateur source par celle du routeur. Sur internet, les adresses IP de votre réseau domestique ne sont pas connues. La seule adresse IP connue sur internet est celle de votre routeur (box). Il s’agit de son adresse IP WAN.

Activation du routage

Pour réaliser les opérations ci-dessous il est impératif d’être connecté avec l’utilisateur root (administrateur).

Le routage est une valeur booléenne (0 ou 1, vrai ou faux, oui ou non, marche ou arrêt) qui est définie à 0 par défaut sur les systèmes Linux. Il existe plusieurs moyens de passer cette valeur à 1 et donc d’activer le routage.

1ère méthode, on envoie la valeur 1 directement dans l’entrée concernée du noyau (facile)

echo 1 > /proc/sys/net/ipv4/ip_forward

2ème méthode, on utilise la commande sysctl pour définir cette valeur à 1 dans le noyau.

sysctl -w net.ipv4.ip_forward=1

3ème méthode, on édite le fichier /etc/sysctl.conf en créant la ligne comme ci-dessous. L’avantage de cette méthode c’est qu’elle est définitive. A chaque redémarrage, le routage sera activé.

net.ipv4.ip_forward = 1

Pour que les changements soient pris en compte, il est nécessaire de taper la commande sysctl -p /etc/sysctl.conf après modification du fichier.

Paramétrage du NAT

Comme nous l’avons vu plus haut, le NAT est un service complémentaire au routage indispensable si nous voulons pouvoir faire sortir des paquets sur internet. Sur linux, cette partie est traitée par le pare-feu (Lire l’article consacré aux pare-feu) iptables.

La seule règle à paramétrer est la suivante

iptables -t nat -A POSTROUTING -o ethx -j MASQUERADE

Il sera nécessaire de remplacer ethx par le nom de l’interface réseau par laquelle vos paquets vont partir sur internet.-t nat indique la table du noyau sur laquelle on intervient, ici nat.-A POSTROUTING indique que nous intervenons après le routage des paquets.

Juste avant qu’ils ne soient renvoyé sur l’interface sélectionnée (ethx).-j MASQUERADE précise que nous souhaitons masquer l’origine des paquets. Cela correspond à remplacer l’adresse IP source du paquet par notre propre adresse.

Et voilà, le routeur/NAT est fonctionnel et vous n’avez pas eu besoin de lire une documentation de trois kilomètres pour en arriver là. Pour utiliser votre routeur, il ne vous reste plus qu’à configurer la passerelle par défaut (adresse IP côté réseau local du routeur) sur vos machines pour qu’elles utilisent votre routeur pour accéder à internet.

Définir une adresse IP sur Linux en ligne de commande

Même si il est vrai qu’aujourd’hui les systèmes Linux sont évolué et que bon nombre d’opérations se font automatiquement, il reste toujours les puristes et les curieux qui souhaitent savoir comment fonctionne le système. Nous vivons à l’époque de l’image, où les beaux bureau bourrés à craquer d’effets visuels et où on peut réaliser des actions en quelques clics de souris, mais dès qu’on parle d’optimisation ou d’automatisation, il n’y a pas d’autre choix que d’utiliser des batchs (batch processing en anglais), donc des lignes de commande.

Vous auriez bien tord de croire que c’est obsolète et qu’on peut aisément s’en passer. Au contraire, certains éditeur de système d’exploitation ont même réinvesti dans un langage de batch afin de combler ses lacunes par rapport à d’autres systèmes.

Aujourd’hui, je vais vous montrer comment attribuer une adresse IP à votre carte réseau en ligne de commande sous Linux. Je considère que vous savez ce que c’est qu’un réseau, une adresse IP et un serveur DHCP. Si toutefois ce n’était pas le cas, je vous invite à vous rendre directement dans la partie Liens et références de cet article. 

Les opérations décrites ci-dessous nécessitent les privilèges administrateur (root).

La commande ifconfig, lancée seule affichera seulement les interfaces (cartes) réseau qui ont été paramétrées. Cette même commande avec l’argument -a permet d’afficher toutes les interfaces (configurées ou non) reconnues par le noyaux (ou ses modules). Voici les résulats de la commande ifconfig -a sur notre machine de test :

root@crpfs2:~# ifconfig -a
eth0      Link encap:Ethernet HWaddr 08:00:27:fc:b5:25
            BROADCAST MULTICAST MTU:1500 Metric:1
            RX packets:0 errors:0 dropped:0 overruns:0 frame:0
            TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 lg file transmission:1000
            RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

eth1      Link encap:Ethernet HWaddr 08:00:27:31:b4:b9
            BROADCAST MULTICAST MTU:1500 Metric:1
            RX packets:0 errors:0 dropped:0 overruns:0 frame:0
            TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 lg file transmission:1000
            RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

lo          Link encap:Boucle locale
            inet adr:127.0.0.1 Masque:255.0.0.0
            adr inet6: ::1/128 Scope:Hôte
            UP LOOPBACK RUNNING MTU:16436 Metric:1
            RX packets:0 errors:0 dropped:0 overruns:0 frame:0
            TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 lg file transmission:0
            RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

Il n’est pas rare de nos jours d’avoir plusieurs cartes réseaux intégrées à la carte mère de votre ordinateur. Même pour un ordinateur portable, vous pouvez parfaitement avoir une interface en ethernet (filaire avec une prise RJ-45) et une autre en WIFI (sans fil). Cela ajoute un peu de difficulté à notre projet, mais je vais vous apprendre à déterminer la bonne carte (celle qui est branchée au réseau).

Les cartes se nomment respectivement eth0 eth1, un raccourci pour ethernet contrôleur 0 puis contrôleur 1. indique l’ordre dans lequel les cartes ont été détectées (reconnues) par le noyau. Pour une interface Wifi, le nom aurait pu être wlan0 ou ra0 si il s’agissait d’une carte avec un chipset Ralink ou ath0 pour un chipset Atheros.

Enfin, lo correspond à l’interface de loopback ou boucle locale est utilisée par le nom d’hôte localhost (127.0.0.1). Cette interface est indispensable pour le bon fonctionnement de la pile IP. Aussi je conseille de ne pas y toucher à moins que vous ne sachiez vraiment ce que vous faîtes…

Adresse dynamique avec DHCP

La commande dhclient fournie par défaut sur la plupart des distributions Linux modernes (paquet isc-dhcp-client sur Debian) permet d’envoyer une requête DHCP sur le réseau afin d’obtenir une adresse IP dynamique. Son usage est très simple, il suffit d’appeler la commande et de spécifier en argument l’interface réseau avec laquelle on souhaite travailler. Notez que cette dernière doit être connectée physiquement au réseau par l’intermédiaire d’un cable.

Au bout de quelque secondes, la commande doit vous rendre la main sans rien dire. En général c’est bon signe, cela veut dire qu’un serveur DHCP nous a attribué une adresse IP. Pour s’en assurer il suffit de rappeler la commande ifconfig seule (sans arguement) et de comtempler son affichage.

Copie d'écran sur Linux. Utilisation de la commande ifconfig après dhclient

Comme vous pouvez le constater, eth0 possède désormais l’adresse IP 192.168.20.20 attribuée par notre serveur DHCP.

Adresse statique (manuelle)

La commande dhclient vue plus haut n’est malheureusement utilisable que lorsque vous vous trouvez sur un réseau équipé d’un serveur DHCP. Ce qui est le cas dans la plupart des situations aujourd’hui notamment grâce aux box internet. Toutefois, il reste un certain nombre de cas où ce type de service n’existe pas et ou il est nécessaire de faire le travail soit même.

Tout d’abord, pour attribuer une adresse IP à notre carte, nous devons faire appel une nouvelle fois à la commande ifconfig comme suit:

ifconfig eth0 192.168.10.1 netmask 255.255.255.0

Ceci fait, nous venons d’attribuer une adresse IP à la carte eth0 et nous avons également spécifié la classe du réseau sur lequel nous travaillons (ici une classe C). Mais il reste une partie du travail normalement réalisé par le serveur DHCP. En effet, nous devons également spécifier une passerelle (gateway en anglais) pour accéder aux réseaux extérieurs et en l’occurrence, INTERNET…

route add default gw 192.168.10.254
Copie d'écran sur Linux. Résultat des commande ifconfig et route

Pour accéder à internet, il reste un dernier détail à régler. En effet, il nous faut un serveur de nom (DNS) qui se chargera de traduire les noms de domaine (ex: google.fr) en adresse IP. Attention! La commande ci-dessous peut détruire une configuration existante car elle écrase le fichier resolv.conf en charge de traiter les résolutions de nom.

echo "nameserver 8.8.8.8" > /etc/resolv.conf

Ceci fait, il ne nous reste plus qu’à vérifier que toute fonctionne. En faisant un ping google.fr, voici le résultat (Ctrl+C pour interrompre un ping sous Linux):

Copie d'écran sur Linux. Résultat de la commande ping après configuration du réseau

Liens et références

Voici un peu de lecture sur les réseaux ainsi que la manpage de la commande ifconfig sur UBUNTU. Je vous rappelle que vous pouvez trouver les manpages (pages de manuel) sur votre distribution Linux favorite en tapant:

man commande

Où commande est à remplacer par le nom de la commande concernée. Une fois dans la man page, vous pouvez vous diriger à l’aide des flèches directionnelles et sortir en tapant q.

Monter un partage Windows sur Linux

Dans cet article, je vais vous montrer comment vous pouvez monter un partage Windows sur un Linux dans un terminal en ligne de commandes.

Lancez votre terminal et créer un dossier à l’endroit où vous souhaitez créer le point de montage du partage. Pour rappel un point de montage, c’est un dossier qui après l’action dite de montage pointera vers le système de fichier spécifié dans la commande. Ce système de fichier peut être local, physique ou vitruel (voir ramfs) mais aussi distant à partir d’un réseau.

Vous devez préalablement connaître le nom réseau de l’ordinateur qui partage le dossier ou son adresse IP. En cas de doute, privilégiez l’adresse IP.

La commande df -h permet d’afficher les systèmes de fichiers montés ainsi que leur taille, l’espace utilisé et la place restante sur chacun d’eux. (très utile)

La commande mkdir /dossier/nom_dossier_a_creer permet, elle, de créer un dossier à l’emplacement souhaité.

La commande mount est la commande UNIX pour monter les systèmes de fichiers. Elle est indispensable au bon fonctionnement du système puisqu’elle permet l’accès aux partitions de vos disques et aux données qu’elle contiennent.

smb mount 01

L’option -o permet de spécifier des options à la commande mount. Pour ce type de partage, vous pouvez spécifier le nom d’utilisateur (si le partage est réservé exclusivement à cet utilisateur) sous la forme user=Nom_Utilisateur et le mot de passe de cet utilisateur comme suit password=MotDePasse. L’option rw spécifie que le montage se fera en lecture / écriture (à accorder avec les autorisations données sur le partage).

Si la commande ne retourne aucun message d’erreur alors c’est gagné! Le partage Windows est désormais accessible depuis le point de montage défini dans votre arborescence Linux.

Pour vérifier, vous pouvez utiliser la commande df -h. Vous pouvez également commencer à interagir avec le contenu du dossier, par exemple en listant son contenu avec la commande ls -l

smb mount 02

Si cela ne fonctionne pas : Comme sur windows, assurez vous de bien avoir noté l’adresse IP ou le nom de l’ordinateur correctement. Privilégiez l’adresse IP au nom d’ordinateur. Un pare feu (firewall) peut bloquer ce type d’accès. Une configuration réseau mauvaise ou absente peut empêcher ce type d’accès. En cas de doute, faîtes appel à un technicien.

Connaître son adresse IP sur Linux

Cet article est le premier d’une série d’articles très cours qui expliquent comment réaliser des actions sur un système Linux en ligne de commande. Vous découvrirez ainsi qu’il est possible de faire énormément de choses, bien plus qu’on ne pourrait le croire. Je reste ouvert aux suggestions d’articles et aux questions.

Dans cet article, je vais vous montrer comment obtenir l’adresse IP (ou les adresses) de votre machine Linux en ligne de commande.

Ouvrez votre terminal et tapez la commande ifconfig -a. Vous devriez obtenir un affichage comme suit:

eth0      Link encap:Ethernet  HWaddr 08:00:27:0c:2a:2a
          inet adr:192.168.20.25  Bcast:192.168.20.255  Masque:255.255.255.0
          adr inet6: fe80::a00:27ff:fe0c:2a2a/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:173 errors:0 dropped:0 overruns:0 frame:0
          TX packets:46 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000
          RX bytes:18314 (17.8 KiB)  TX bytes:7177 (7.0 KiB)

lo        Link encap:Boucle locale
          inet adr:127.0.0.1  Masque:255.0.0.0
          adr inet6: ::1/128 Scope:Hôte
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0
          RX bytes:560 (560.0 B)  TX bytes:560 (560.0 B)

Si vous ne savez pas quelle valeur prendre, sachez qu’en générale l’interface réseau par défaut se nomme eth0 sur un Linux et l’adresse IP est la valeur de inet adr: soit dans le cas présent 192.168.20.25.

Utiliser Linux sans réinstaller votre ordinateur

Linux c’est quoi ?

Linux est un système d’exploitation libre de droit. Libre de droit, ça veut dire qu’il n’appartient à personne. Il fait partie du domaine public.

D’ailleurs ce système est déposé sous la licence publique générale GNU (GPL).

Attention toutefois, même si c’est souvent le cas, cela ne rime pas automatiquement avec gratuité. Certaines distributions comme Red Hat sont payantes.

Vous devez certainement connaître des logiciels libres comme OpenOffice ou Libre Office, Firefox, Gimp, Inkscape ou encore VLC. Et ce ne sont là que quelques exemples parmi des bibliothèques entières de logiciels libres. Un système d’exploitation, c’est un ensemble de fonctionnalités qui permettent aux utilisateurs d’exploiter les capacités de leur machine. Cela peut être des utilitaires graphiques qui fonctionneront bien souvent avec des fenêtres et l’interaction de la souris, ou bien des commandes exécutées dans un terminal. Un terminal ??? Oui vous savez, ces écran noirs dans lesquels on voit les pirates taper des choses incompréhensibles à la télévision… Même si cela a été le cas pendant de nombreuses années, Linux n’est plus aujourd’hui un système exclusivement réservé à un public d’experts et de professionnels. Certains d’entre vous ont sans doute déjà utilisé des logiciels libres provenant du monde Linux sans le savoir. Sachez que vous retrouverez ces mêmes logiciels sur un système d’exploitation Linux et ils fonctionneront exactement de la même manière. En somme vous ne prenez aucun risque à essayer ce système.

De plus, je suis sûr que vous utilisez déjà Linux à votre insu. Quoi ? Oui vous monsieur ! Parfaitement madame ! Vous l’utilisez déjà et sans même le savoir. Vous possédez certainement un smartphone Androïd comme environ 44 % de la population française ? (Article sur Zdnet) Androïd est un système d’exploitation Linux remanié par les équipes de Google. (Hé oui !) Donc vous utilisez déjà Linux.

Voici quelques arguments qui devraient vous encourager à utiliser Linux:

  • Stabilité : Le serveur qui héberge ce blog n’a pas été redémarré depuis 498 jours. Il héberge de nombreux services de bases de données, d’accès distant et il exécute quotidiennement des dizaines de tâches planifiées comme des mises à jour ou encore des sauvegardes!
    • Linux doit sa stabilité à la simplicité de son architecture, mais également au savoir faire d’une armée de développeur travaillant pour la communauté.
  • Insensibilité aux virus : En effet, la plupart des virus sont développés pour Windows et même si quelques virus et autres logiciels malveillants existent aujourd’hui sur Linux, il est rare d’en attraper en navigant sur internet.
  • Gratuité : Cela va dépendre de la distribution que vous aurez choisi, mais sachez que même si vous optez pour une version payante du système, celle-ci vous coûtera toujours moins cher pour équiper votre parc que d’autres systèmes et d’autre part, vous bénéficierez sans aucun doute d’une excellent support technique qui vous assistera en cas de difficulté.
  • Documentation et support : Linux et chacun de ses élément est très bien documenté par une gigantesque communauté à l’échelle mondiale et dans toutes les langues. D’autre part, il existe des tonnes de sites techniques et de forums qui sont là pour vous porter assistance en cas de pépin ou d’incertitude.

Je ne vous ai pas convaincu ? Comme je vous comprends… Ce n’est jamais simple de remettre en cause ses habitudes, de quitter notre confort pour se lancer dans l’inconnu. Hé bien, j’ai justement pensé à vous et je vais vous proposer dans cet article des solutions pour vous permettre d’utiliser Linux sans prendre de risque, sans réinstaller tout votre ordinateur, sans rien casser. Impossible ? Non !

Utiliser Linux dans Windows avec Cygwin

Il s’agit en fait d’une bibliothèque de commandes, d’utilitaires et services propres à Linux et qui ont été portés sur Windows. Ils ont été réécris et recompilés pour fonctionner comme des exécutable Windows. En somme, Cygwin étend les capacités de votre Windows et vous permettra d’utiliser un panel important de commandes et services qui sont normalement réservés aux possesseurs de système Linux.

Le tout s’installe comme un logiciel que vous pourrez désinstaller à tout moment et ceci sans nuire au bon fonctionnement de votre PC. Vous pourrez lancer Cygwin chaque fois que vous en aurez besoin et l’éteindre à votre guise sans gêner le fonctionnement habituel de votre système Windows.

Attention! Cygwin est réservé à un public d’utilisateurs expérimentés. Ne vous attendez pas à vous retrouver avec un bel installeur pour vous guider et faire le travail pour vous ni à obtenir un bureau aussi classe que sur Ubuntu. Je l’ai particulièrement utilisé en milieu professionnel pour exécuter des batchs (scripts de commandes) UNIX sur des systèmes Windows mais également pour faire fonctionner des services de console à distance comme SSH ou de synchronisation comme RSYNC et plus occasionnellement pour compiler du code en C sur des systèmes Windows. Il s’est toujours avéré très utile et stable.

Cygwin est développé par l’équipe responsable de la distribution Red Hat Linux (http://www.redhat.com/). Une des plus anciennes distributions que je connaisse avec Debian.

Cygwin est disponible à l’adresse suivante : https://cygwin.com/

Cygwin s'installe comme un logiciel classique
Cygwin une fois lancé. Une invite de commande dans un terminal sur fond noir. La classe!

Utiliser un live-CD ou USB Ubuntu, Knoppix

Autrefois un live CD ou DVD permettait de démarrer un système d’exploitation au lancement de votre ordinateur. Aujourd’hui cette technologie existe toujours, mais il est plus intéressant d’utiliser une solution live USB qui fonctionne comme son nom l’indique à partir d’une clé ou d’un disque dur USB. La différence se fera sentir au niveau de la rapidité et de la capacité à écrire des données et une configuration utilisateur sur un support USB.

Aujourd’hui les deux distributions les plus complètes et les plus réputées au niveau des live CD sont Ubuntu et Knoppix (ces deux systèmes sont basés sur la distribution debian), mais il en existe pleins d’autres. Je vous invite à chercher Linux Live CD sur google, vous allez en avoir pour votre argent 🙂

Ces distributions sous forme de Live CD ou USB vous permettront d’exploiter Linux, ses bureaux et outils graphiques ou lignes de commandes comme si vous l’aviez installé sur votre ordinateur. Vous pouvez l’utiliser ainsi autant de fois que vous le souhaitez, c’est l’occasion de découvrir ce système petit à petit sans prendre de risque jusqu’au jour où vous franchirez le pas et l’installerez sur votre PC. Sauf si vous n’aimez pas et que vous ne souhaitez plus l’utiliser du tout.

Le live CD Ubuntu est orienté utilisateur et propose un bureau très agréable avec de nombreux logiciels de bureautique, retouche d’image et une bonne palette de commande.

Démarrage sur un live CD de Ubuntu. Choix de la langue.
Démarrage sur un live CD de Ubuntu. On vous propose de l'essayer sans l'installer.

 

Le live CD de Knoppix est orienté technique et maintenance. Il est équipé de logiciels pour partitionner, sauvegarder ou récupérer des données et comporte de nombreux logiciels et une bibliothèque de commandes impressionnantes.

écran de démarrage de Knoppix
knoppix3

 

Utiliser Linux au travers d’une émulation de PC : VirtualBox

Virtualbox est un logiciel libre sous licence GPL qui propose d’émuler (simuler) logiciellement le fonctionnement d’un ordinateur. L’intérêt de ce type de logiciel réside dans sa capacité à faire fonctionner des systèmes d’exploitation (Windows, Mac OS, Android, Linux et autres) dans une sorte de cocon qui peut être complètement fermé pour l’isoler de votre système et réseau existant ou au contraire le relier à votre réseau et système existant pour tester son comportement.

Il existe d’autres solutions libres moins facile à utiliser comme Qemu et des solutions commerciales comme VMWare.

Les solutions de virtualisation comme VirtualBox évitent d’acheter et d’utiliser une machine physique dédiée pour vos tests, mais vous propose également de bénéficier d’une architecture virtuelle incluant des réseaux et si vous avez beaucoup de mémoire, disque et CPU plusieurs machines virtuelles. Vous pouvez ainsi monter des maquettes avec des systèmes virtuels ou enregistrer des actions sur un système d’exploitation pour faire de la documentation ou des tutoriels. Les exploitations sont nombreuses. Je m’en suis également déjà servi pour transférer des logiciels vieillissants et fonctionnant avec MS-DOS sur des ordinateurs modernes permettant ainsi d’augmenter la longévité de certaines applications au delà de celle des machines qui supportaient ces logiciels (ex: 386 ou 486).

Ainsi en utilisant VirtualBox vous pouvez vous entraîner à installer n’importe quelle distribution Linux, mais également n’importe quel autre système d’exploitation qu’il soit Windows ou Mac OS sans prendre aucun risque, sans détériorer ou modifier le fonctionnement de votre ordinateur.

Dans le cas de figure qui nous intéresse, vous allez pouvoir utiliser Linux dans votre système Windows, sans changer brusquement vos habitudes et sans risquer d’endommager votre PC. Le top quoi ! Cette solution réclame toutefois d’avoir un ordinateur assez puissant avec assez de mémoire et d’espace disque, car si on parle bien de machine virtuelle, les données ne le sont pas et il faut des supports physiques pour les stocker et les traiter.

Fenêtre de gestion des machines virtuelles sur VirtualBox
Un bureau Ubuntu dans une machine virtuelle
Un bureau Ubuntu dans une machine virtuelle
Bureau Ubuntu

Liens et références

Voici une petite liste de liens en rapport avec l’article traité. Vous trouverez matière à vous renseigner sur les distributions Linux soulevées dans cet article, mais aussi certains logiciels.

Crédits

Image logo tux (pingouin) : http://fr.wikipedia.org/wiki/Tux