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.