Blog

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.

Récupérer toutes ses données (photos) depuis Facebook

Vous souhaitez pouvoir récupérer vos photos, images, vidéos ou toute autre donnée que vous avez posté sur Facebook? Alors cet article est fait pour vous. Facebook a mis en place un mécanisme permettant de générer une archive (fichier zip) contenant la totalité de vos données afin de pouvoir les conserver sur votre ordinateur (ou ailleurs).

ATTENTION! La création et le téléchargement de l’archive ne sont pas immédiat, il y a un délai et l’opération se déroule en 2 étapes. Il peut se dérouler plusieurs minutes (environ 15 minutes pour moi) entre la demande et la création de l’archive. Le temps va dépendre de la quantité et de la qualité des fichiers présent sur votre compte Facebook.


1ere étape – Demander la création de l’archive

Pour commencer, vous devez accéder à vos Paramètres Facebook. Pour y accéder, cliquez sur la flèche située à côté du cadenas (en haut vers la droite de votre page Facebook). Ensuite, pour déclencher l’opération qui va générer l’archive (fichier zip), cliquez sur le lien marqué Télécharger une copie situé en bas de la liste des Paramètres généraux du compte.

Paramètres de Facebook

La page ci-dessous devrait apparaître avec le bouton Créer mon archive sur lequel vous devez cliquer afin de démarrer l’opération.

Télécharger vos données Facebook

Dans un premier temps, Facebook va vous demander de saisir le mot de passe de votre compte (celui que vous utilisez pour vous connecter sur Facebook).

Mot de passe Facebook

Une fois le mot de passe saisi, une fenêtre de confirmation va apparaître. Puis, une fois validée, vous allez recevoir un premier e-mail qui ressemble à celui en copie d’écran ci-dessous.

Premier mail de Facebook confirmant la demande de création de l'archive

2eme étape – Télécharger le fichier d’archive

Au bout de quelques minutes, vous allez recevoir un email de Facebook qui ressemble à la copie d’écran ci-dessous et dans lequel on vous précise que l’archive contenant toutes vos données est prête à télécharger.

2eme mail de Facebook avec le lien de téléchargement

Vous pouvez cliquer sur le lien indiqué en bas du mail pour télécharger le fichier d’archive sur votre ordinateur. Une fois téléchargé, vous pouvez l’ouvrir en double-cliquant dessus (si ça ne fonctionne pas, téléchagez grauitement 7zip pour ouvrir l’archive). Ci-dessous, voici à quoi devrait ressembler le contenu de votre archive. Vous devriez pouvoir retrouver l’ensemble de vos données (photos, vidéos et autres), chaque fichier étant identifié par un code arbitraire de Facebook (les noms d’origine ne sont pas conservés malheureusement).

Contenu de l'archive Facebook

J’espère que la lecture de cet article vous aura été utile…

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.

Exporter vos contacts LinkedIn

Vous souhaitez récupérer les adresses email (ou autres coordonnées) de vos contacts sur LinkedIn pour réaliser un mailing? Alors cet article est fait pour vous.

Lister et exporter vos contacts

cliquez sur le menu Réseau situé en haut de la page puis sur Contacts pour afficher la liste de vos contacts LinkedIn.

Export des contacts LinkedIn - étape 1

Une fois dans la liste de contacts, vous pouvez sélectionner Tous vos contacts (en haut du listing) ou seulement quelques uns (en cliquant sur chaque contact souhaité).
Lorsque votre sélection est faîte, rendez-vous en bas à droite du listing puis cliquez sur le lien Exporter vos relations.

Export des contacts LinkedIn - étape 2

LinkedIn vous propose de choisir le format du fichier à générer pour exporter vos contacts. (vous trouverez plus d’information sur les formats proposés en bas de cet article)
Faîtes votre choix puis cliquez sur le bouton Exporter. Au bout de quelques secondes, une fenêtre de téléchargement apparaîtra pour vous proposer d’enregistrer le fichier généré.
Il ne vous restera plus qu’à importer le fichier au choix dans votre client de messagerie ou un tableur.

Export des contacts LinkedIn - étape 3
Export des contacts LinkedIn - Choix du format

Les formats d’export :

CSV : Comma Separated Values ou valeurs séparées par des virgules. Il s’agit d’un format de fichier très utilisé pour importer des données sous Excel (équivalent Libre Office: Calc) mais également certains clients de messagerie comme Outlook ou Gmail.

VCF : Virtual Card File ou fichier de carte virtuelle. C’est un format de fichier ouvert et utilisé par certains clients de messagerie comme Thunderbird. Ce format permet d’exporter et d’importer des fiches de contact.

Pour les exports vers Outlook, vérifiez bien le jeu de caractères (encodage), car c’est en général Windows-1252 / WinLatin1 qui est à privilégier. (en lieu et place de l’UTF8)

Si vous souhaitez réaliser cette même opération avec vos contacts Viadeo, cliquez ici

Exporter vos contacts Viadeo

Vous souhaitez récupérer les adresses email (ou autres coordonnées) de vos contacts sur Viadeo pour réaliser un mailing? Alors cet article est fait pour vous.

Lister et exporter vos contacts

Tout d’abord, cliquer sur le menu Contacts situé en haut de la page, puis sur Carnet d’adresses pour afficher la liste de vos contacts.

Première étape pour exporter ses contacts Viadeo

Sélectionnez ensuite les contacts souhaités puis cliquez sur Exporter mes contacts, la suite de l’opération se déroule dans la partie droite de la page qui vous propose de choisir le format souhaité. (vous trouverez plus d’informations à la fin de cet article à propos des formats proposés).

Enfin, cliquez sur le bouton Exporter pour lancer l’export. Soyez patient car l’opération peut prendre un petit moment (jusqu’à 10-15 secondes).
Au bout d’un moment, vous devriez voir apparaître une fenêtre de téléchargement qui vous proposera d’enregistrer le fichier d’export dans le format souhaité.
Il ne vous restera plus qu’à importer le fichier au choix dans votre client de messagerie ou un tableur.

Export des contacts viadeo - étape 2

Les formats d’export :

CSV : Comma Separated Values ou valeurs séparées par des virgules. Il s’agit d’un format de fichier très utilisé pour importer des données sous Excel (équivalent Libre Office: Calc) mais également certains clients de messagerie comme Outlook ou Gmail.

VCF : Virtual Card File ou fichier de carte virtuelle. C’est un format de fichier ouvert et utilisé par certains clients de messagerie comme Thunderbird. Ce format permet d’exporter et d’importer des fiches de contact.

Pour les exports vers Outlook, vérifiez bien le jeu de caractères (encodage), car c’est en général Windows-1252 / WinLatin1 qui est à privilégier. (en lieu et place de l’UTF8)

Si vous souhaitez réaliser cette même opération avec vos contacts LinkedIn, cliquez ici

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.

Qu’est-ce qu’un pare-feu (firewall)?

Un firewall signifie textuellement mur de feu en anglais et c’est très certainement le terme le plus approprié pour définir son action. On ne voit rien à travers un mur de feu. Qui oserait traverser un mur de feu? Voici donc un article consacré aux pare-feu. A quoi servent-ils? Comment fonctionnent-ils? Est-ce que vous en avez besoin?

Quelques définitions

On ne peut commencer cet article sans une petite liste de définitions des termes importants qui seront réutilisés tout au long de cet article.

Il faut voir un ordinateur comme un centre de services. Pour communiquer sur un réseau informatique, il faut être en mesure d’identifier l’ordinateur (centre de services) et chacun des services qu’il propose.Adresse IPNuméro permettant l’identification de votre ordinateur sur un réseau informatique.Dans cet article, nous allons comparer l’adresse IP à un numéro de téléphone. Quand vous avez besoin d’appeler quelqu’un, vous prenez votre téléphone et composez le numéro de votre interlocuteur. L’adresse IP c’est à peu près la même chose.Numéro de portNuméro permettant l’identification du service souhaité.Pour rester dans l’exemple du téléphone, lorsque vous téléphonez à une société, vous devez savoir à quel service vous adresser. Le numéro de port correspondra au service souhaité (comptabilité, RH, atelier, direction etc…)LANLocal Area Network ou réseau local en français.Le réseau local est un réseau informatique à petite échelle. Par exemple chez vous, votre box internet, vos iPhones, iPad ou tablettes, smartphone et ordinateurs divers forment lorsqu’ils sont tous en service et connectés un réseau local. Ils communiquent tous au travers d’un même réseau, le votre qui est généralement géré par votre box. Une société peut avoir un réseau local également.WANWide Area Network ou réseau étendu en français.Un réseau étendu couvre une zone géographique plus grande. Cela peut être un département, une région, un pays ou la planète entière. Internet est un réseau étendu. Certaines sociétés possèdent des réseaux étendu comprenant des réseaux locaux dispersé dans les pays où sont installée les agences.

Par exemple, si vous souhaitez accéder aux pages web (site internet) proposé par l’ordinateur (centre de services) nommé www.andee.fr

Votre ordinateur va d’abord déterminer le numéro (adresse IP) de l’ordinateur (centre de service) www.andee.fr en interrogeant un service d’annuaire (DNS) qui répondra que www.andee.fr est à l’adresse 37.187.7.83.

Après, pour accéder aux pages web, votre ordinateur sait que le service concerné porte le numéro 80. Il interrogera donc le port 80 de la machine portant l’adresse 37.187.7.83 et obtiendra le service demandé si le service est bien actif.

Pour connecter votre réseau local (LAN) à un réseau étendu (WAN) il est nécessaire d’avoir un compte chez un FAI (Orange, Free, Numericable etc…) qui vous fournira un routeur. Le routeur s’occupe de vous identifier auprès du fournisseur d’accès et vous permet d’accéder au réseau WAN (en l’occurrence internet).

Le pare-feu (firewall)

Toujours pour rester dans la simplicité, restons avec notre ordinateur qu’on représente sous la forme d’un centre de services. Je vais tenter de vous résumer ce qu’est un pare-feu et à quoi il sert.

Le pare feu va se placer généralement entre deux réseaux (LAN ou WAN) afin de mettre en place un filtrage ou des redirections. Notre centre de services n’accepte pas au premier venu d’accéder à ses pages web car leur contenu est privé et réservé à l’usage seul de ses employés. Le pare feu est comme un mur de briques, il va cacher le service 80 de la vue des personnes qui arrivent depuis un réseau externe (WAN) et donc bloquer toutes les tentatives de communication avec ce service. Vous avez déjà essayé de parler à un service à travers un mur de briques? Efficacité garantie.

Par contre, l’accès à ce service est possible pour les personnes qui sont autorisées. Le personnel du centre par exemple possède la clé qui permet d’ouvrir la porte et de rentrer dans le centre de service. Ces personnes là auront donc accès au service 80.

Un autre usage du pare feu est de rediriger les requêtes. Par exemple, la personne de l’extérieur souhaite communiquer avec le service des pages web (port 80), le pare feu propose une entrée dédiée à ce service avec un agent d’accueil qui va s’occuper d’acheminer la personne dans un autre bureau qui se chargera de répondre à sa demande. Du point de vue de la personne extérieur, c’est l’entité du centre de service qui lui aura apporté réponse. On parle de redirection, MASQUERADE ou NAT.

Certains pare-feu proposent également de limiter / contrôler le débit. On parle alors de traffic shaping. Notre centre de services gère énormément de choses et ses locaux sont de taille restreinte. Impossible d’autoriser tout le monde à rentrer en même temps dans le bâtiment. La fonction correspondrait à du personnel situé à l’entré du mur et qui fermerai la porte dès que le quota est atteint et la rouvrirait lorsque les premières personnes sortent pour faire place aux suivantes.

Les systèmes d’exploitations modernes (Windows / UNIX Linux) sont normalement équipés d’un pare-feu et ceci même sur les postes utilisateur. Leur paramétrage demandent toutefois des connaissances techniques sans quoi vous pourriez bien bloquer l’accès à un service pourtant utile ou inversement autoriser tout et n’importe quoi et prendre le risque de voir des personnes s’introduire sur votre machine en exploitant des failles de sécurité sur certains services.

Pas de panique en ce qui concerne votre réseau domestique, les box aujourd’hui se comportent en général comme un routeur et empêche les personnes de l’extérieur d’accéder directement à votre réseau local (LAN) sauf demande particulière émanant de vous. Les pare-feu sur les ordinateurs fixes sont donc peu utiles aujourd’hui, ceci est moins vrai avec les ordinateurs portables qui sont susceptibles de se retrouver sur des réseaux publics (gares, aéroports, grandes surfaces). Soyez donc très prudent avec les ouvertures de port et n’activez jamais une DMZ sur une machine à moins d’être bien sûr de ce que vous faîtes.

Je vous ai fait un petit schéma qui, je l’espère vous aidera à mieux comprendre le rôle du pare-feu.

PareFeu

Liens et références

Je vous laisse avec quelques liens pour compléter cet article qui je l’espère vous aura aidé à comprendre ce qu’est un pare-feu et son utilité.

Virus, trojan, spyware, malware

Votre ordinateur est anormalement lent? Des fenêtres s’ouvrent toute seules et de manière intempestive? Votre souris bouge sans votre consentement? Vos comptes sur les réseaux sociaux publient des choses sans que vous n’ayez saisi quoi que ce soit? Il est très probable que votre ordinateur soit victime d’un logiciel malveillant. Dans cette article, nous allons apprendre à les différencier et à les éviter.

Quelques définitions

  • Logiciel: Un logiciel est un ensemble d’instruction logiques interprétées par une machine en vue d’automatiser la réalisation de certaines tâches.
  • Maliciel (malware): Logiciel dont la finalité est de au bon fonctionnement ou aux données d’un système informatique.
    • Le terme de Malware englobe les virus, chevaux de Troie, logiciels espions et vers.

Virus

Un virus est un logiciel ayant la capacité de se répliquer sur des supports divers (disquettes, CD-ROM, Clé USB, disques dur, autres logiciels) de manière à se propager sur d’autres ordinateurs. Il peuvent être parfois dormants, c’est à dire qu’ils ne seront pas actifs avant une date donnée ou un signal spécifique. Par analogie avec les virus biologiques, le virus informatique doit son nom à sa capacité de réplication.

En règle générale, les virus sont des logiciels malveillants dont le but est de détériorer l’ordinateur ou d’altérer son fonctionnement. Ceux ci sont écris en assembleur ou C puis compilé de façon à être performant et indétectable.

Macrovirus

Il s’agit d’un virus qui ne fonctionne pas avec du code compilé et interprété par la machine mais avec des Macros (comme dans les suites logicielles d’Office). Ce type de virus se transmet généralement par l’intermédiaire de documents infectés.

Cheval de Troie (ou trojan)

Le cheval de Troie (trojan en anglais) est un logiciel malveillant qui laisse une porte ouverte sur votre ordinateur pour une personne mal intentionnée qui peut ainsi espionner ou contrôler à loisir votre ordinateur. Ce type de logiciel est assez dangereux puisqu’il permet d’observer l’intégralité de votre ordinateur. Ainsi, quelqu’un peut savoir ce que vous tapez au clavier, connaître votre numéro de CB, votre code d’accès pour votre compte bancaire, les adresses de vos amis, quels sites vous visitez et bien d’autres choses encore.

Ces informations récupérées peuvent être commercialisées ou utilisées à d’autres fins obscures. Cela peut aller de l’espionnage au détournement de fonds.

Une fois infecté par un cheval de Troie, votre ordinateur peut servir de relais pour des attaques informatique de masse afin de cacher l’identité véritable de la personne.

Logiciel espion (ou spyware)

Il s’agit de petit logiciels qui espionnent l’environnement dans lequel ils ont été installés. Leur mode de propagation est en général d’autres logiciels gratuits comme des logiciel freeware ou shareware mais également des crack ou keygen pour les jeux vidéos.

Tout comme les chevaux de Troie, les logiciels espions permettent de récupérer des informations confidentielles telles que vos mots de passe, numéros de CB etc, mais aussi installer d’autres logiciels malveillants ou afficher des offres publicitaires sans aucune intervention de votre part.

Ver (Worm)

Le ver (worm en anglais) un est un logiciel malveillant similaire aux virus sauf qu’il se propage par les réseaux informatiques (e-mail, messagerie instantanée, partage de fichiers).

Comment lutter contre ces menaces?

La première méthode et aussi la plus simple consiste à être prudent et à être attentif. Oui c’est tout… On ne le dira jamais assez, mais lire ce qui apparaît à votre écran avant de cliquer sur un bouton vous évitera bien souvent des heures de galère et des dépenses inutiles. Ne pas avoir de logiciels malveillant est encore le moyen le plus efficace pour ne pas avoir à lutter contre eux. N’installez pas un logiciel dont vous n’êtes pas sûr de connaître l’origine. Le branchez pas une clé USB ou un CD-ROM dont l’origine est inconnue.

Par exemple: Un inconnu vous envoi un mail en anglais avec un pièce jointe? Ne l’ouvrez pas, il ne vous veut certainement pas du bien. Vous naviguez sur un site internet qui vous dit que votre ordinateur est infecté? Il vous propose de télécharger un logiciel pour éradiquer la menace, ne le téléchargez surtout pas! Rappelez vous la raison qui vous a amené sur ce site. Vous n’étiez certainement pas venu ici pour télécharger un antivirus. Ne possédez-vous pas déjà un antivirus?

Si ce n’est pas déjà fait, installez un logiciel antivirus. Il en existe plein et certains sont même gratuits pour un usage privé (hors société). Par exemple: AVIRA ou AVG.

Si ce n’est pas déjà fait, installez un logiciel pour bloquer ou supprimer les spywares comme par exemple Spybot.

Il est important de se poser les bonnes questions. Partez du principe que dans un environnement anonyme et non contrôlé, les gens ne vous veulent pas du bien. Internet c’est le far west et pas le pays des bisounours.

Si vous vous rendez sur des sites dont le contenu est illégal (films ou logiciels) attendez vous à ce que tout soit mis en oeuvre pour s’introduire sur votre ordinateur. Redoublez de vigilance et évitez autant que possible ce type de site.

Scannez systématiquement avec votre antivirus les clés USB, disques dur, DVD-ROM ou carte mémoire qui proviennent de quelqu’un d’autre avant de les utiliser. Cela permet d’éviter les proliférations de logiciels malveillants.

Liens et références

Des bases de données publiques et libres

Vous êtes webmaster ou concepteur d’applications et vous avez besoin d’informations publiques, comme les codes postaux des communes de France ou encore une liste des hotspots wifi d’une ville? Avant de courir acheter ces données sur un site qui vous les vendra sans scrupule, assurez vous que ces données ne soient pas déjà disponibles dans le domaine publique et libre d’accès.

Les données sont classées dans les 9 grandes catégories définies ci-dessous:

  • Agriculture et alimentation
  • Culture
  • Économie et Emploi
  • Éducation et Recherche
  • International et Europe
  • Logement, Développement Durable et Énergie
  • Santé et Social
  • Société
  • Territoires et Transports

Pour chacune de ces catégorie il existe de nombreux fichiers recouvrant des données financières, sociales, géographiques ou technologiques détaillées par région, département ou communes de France. Certaines informations recoupent même des données à l’échelle européenne ou mondiale.

Les formats de données disponibles sont: api, csv, gzip, html, json, ods, odt, pdf, pi, shp, tsv, txt, url, viz, xls, xml, zip

L’intégralité des données est librement disponible à l’adresse suivante: https://www.data.gouv.fr/fr/