Master 1ère année Sécurité des Systèmes d’Information 1 Programmation en shell
Master 1ère année Sécurité des Systèmes d’Information 2 Shell Pourquoi la programmation Shell ? Une connaissance fonctionnelle de la programmation shell est essentielle à quiconque souhaite devenir efficace en administration de système, même pour ceux qui ne pensent pas avoir à écrire un script un jour. Pensez qu'au démarrage de la machine Linux, des scripts shell du répertoire /etc/rc.d sont exécutés pour restaurer la configuration du système et permettre la mise en fonctionnement des services. Une compréhension détaillée de ces scripts de démarrage est importante pour analyser le comportement d'un système, et éventuellement le modifier.
Master 1ère année Sécurité des Systèmes d’Information 3 Shell Par convention les scripts shell se terminent généralement (pas obligatoirement) par : «.sh » pour le Bourne Shell et le Bourne Again Shell, «.ksh » pour le Korn Shell, «.csh » pour le C Shell, «.tcl » pour le Tcl/Tk. Commencer un programme
Master 1ère année Sécurité des Systèmes d’Information 4 Shell La première ligne a une importance particulière car elle permet de préciser quel shell va exécuter le script #!/bin/sh Exemple. #!/bin/sh # # Premier script # echo Hello World # Premier script
Master 1ère année Sécurité des Systèmes d’Information 5 Shell La commande exit permet de mettre fin à un script. Par défaut la valeur retournée est 0 (pas d'erreur) mais n'importe quelle autre valeur de 0 à 255 peut être précisée. On récupère la valeur de sortie par la variable $?. On utilise plusieurs codes (1, 2, 3, etc…) différents de 0 pour indiquer un niveau d’erreur. Sortie de script
Master 1ère année Sécurité des Systèmes d’Information 6 Shell Exemple: #!/bin/sh # # Deuxième exemple de script shell # ERREURGRAVE=2 # erreur ERREURSIMPLE=1 # warning echo "Hello World" TOTO="bon" if [ $TOTO == "erreurgrave" ]; then exit $ERREURGRAVE elif [ $TOTO == "erreursimple" ]; then exit $ERREURSIMPLE fi exit 0 # Deuxième script
Master 1ère année Sécurité des Systèmes d’Information 7 Shell Variables On en distingue trois types : Utilisateur Système et spéciales. Le principe est de pouvoir affecter un contenu à un nom de variable, généralement un chaîne de caractères, ou des valeurs numériques.
Master 1ère année Sécurité des Systèmes d’Information 8 Shell Variables: nomenclature Un nom de variable obéit à certaines règles : Il peut être composé de lettres minuscules, majuscules, de chiffres, de caractères de soulignement Le premier caractère ne peut pas être un chiffre La taille d'un nom est en principe illimité Les conventions veulent que les variables utilisateur soient en minuscules pour les différencier des variables système. Au choix de l'utilisateur.
Master 1ère année Sécurité des Systèmes d’Information 9 Shell Variables: Déclaration et affectation Une variable est déclarée dès qu'une valeur lui est affectée. L'affectation est effectuée avec le signe « = », sans espace avant ou après le signe. var=Bonjour On peut aussi créer des variables vides. Celle-ci existera mais sans contenu. var=
Master 1ère année Sécurité des Systèmes d’Information 10 Shell Variables: Accès et affichage On accède au contenu d'une variable en plaçant le signe « $ » devant le nom de la variable. Quand le shell rencontre le « $ », il tente d'interpréter le mot suivant comme étant une variable. Si elle existe, alors le $nom_variable est remplacé par son contenu, ou par un texte vide dans le cas contraire.
Master 1ère année Sécurité des Systèmes d’Information 11 Shell Variables: Accès et affichage Pour afficher la liste des variables on utilise la commande set. Elle affiche les variables utilisateur et les variables système, nom et contenu. La commande echo permet d'afficher le contenu de variables spécifiques.
Master 1ère année Sécurité des Systèmes d’Information 12 Shell Variables: contenu Une variable peut contenir des caractères spéciaux, le principal étant l'espace. Pour cela il faut soit verrouiller les caractères spéciaux un par un, soit les mettre entre guillemets ou apostrophes. c=Salut\ les\ Copains # Solution lourde c="Salut les copains" # Solution correcte c='Salut les copains' # Solution correcte
Master 1ère année Sécurité des Systèmes d’Information 13 Shell Variables: contenu Une variable peut contenir des caractères spéciaux, le principal étant l'espace. Pour cela il faut soit verrouiller les caractères spéciaux un par un, soit les mettre entre guillemets ou apostrophes. c=Salut\ les\ Copains # Solution lourde c="Salut les copains" # Solution correcte c='Salut les copains' # Solution correcte
Master 1ère année Sécurité des Systèmes d’Information 14 Shell Variables spéciales Les options du shell$- PID du dernier processus lancé en arrière-plan $! PID du shell actif$$ Code retour de la dernière commande exécutée $? ContenuVariable Il s'agit de variables accessibles uniquement en lecture et dont le contenu est généralement contextuel.
Master 1ère année Sécurité des Systèmes d’Information 15 Shell Variables spéciales Exemple: #!/bin/sh TMP=$$.tmp echo contenu > $TMP xterm & PID=$! sleep 5 kill -0 $PID sleep 1 kill -9 $PID
Master 1ère année Sécurité des Systèmes d’Information 16 Shell export export FICHIER=$HOME/monfichier ou bien FICHIER=$HOME/monfichier export FICHIER Exportation
Master 1ère année Sécurité des Systèmes d’Information 17 Shell Les accolades de base « {} » permettent d'identifier le nom d'une variable. Imaginons la variable fichier contenant le nom de fichier 'liste'. On veut copier liste1 en liste2. fichier=liste cp $fichier2 $fichier1 Accolades
Master 1ère année Sécurité des Systèmes d’Information 18 Shell Ça ne fonctionne pas car ce n'est pas $fichier qui est interprété mais $fichier1 et $fichier2 qui n'existent pas. cp ${fichier}2 ${fichier}1 Dans ce cas, cette ligne équivaut à fichier=liste cp liste2 liste1 Les accolades indiquent que fichier est un nom de variable Accolades
Master 1ère année Sécurité des Systèmes d’Information 19 Shell Les accolades disposent d'une syntaxe particulière. {variable:Remplacement} Selon la valeur ou la présence de la variable, il est possible de remplacer sa valeur par une autre. Accolades et remplacement conditionnel
Master 1ère année Sécurité des Systèmes d’Information 20 Shell Accolades et remplacement conditionnel le script est interrompu et le message texte s'affiche. Si texte est absent un message d'erreur standard est affiché. {x:?texte} le texte prendra sa place. Dans le cas contraire une chaîne vide prend sa place. {x:+texte} le texte prendra sa place et deviendra la valeur de la variable. {x:=texte} le texte prendra sa place. Sinon c'est le contenu de la variable qui prévaudra. {x:-texte} Si la variable x est vide ou inexistante, SignificationRemplacement
Master 1ère année Sécurité des Systèmes d’Information 21 Shell ~]# echo $nom ~]# echo ${nom:-Jean} Jean ~]# echo $nom ~]# echo ${nom:=Jean} Jean ~]# echo $nom Jean ~]# echo ${nom:+"Valeur définie"} Valeur définie ~]# echo $nom Jean ~]# unset nom ~]# echo $nom ~]# echo ${nom:?Variable absente ou non définie} bash: nom: Variable absente ou non définie ~]# echo ${nom:?Variable absente ou non définie} bash: nom: Variable absente ou non définie ~]# echo $nom ~]# echo ${nom:=Jean} Jean ~]# echo $nom Jean ~]# echo ${nom:?Variable absente ou non définie} Jean ~]# echo $nom Jean ~]# echo ${nom:?Variable absente ou non définie} Jean Accolades et remplacement conditionnel
Master 1ère année Sécurité des Systèmes d’Information 22 Shell export Par défaut une variable n'est accessible que depuis le shell où elle a été définie. La commande export permet d'exporter une variable de manière à ce que son contenu soit visible par les scripts et autres sous- shells. Les variables exportées peuvent être modifiées dans le script, mais ces modifications ne s'appliquent qu'au script ou au sous-shell. Exportation
Master 1ère année Sécurité des Systèmes d’Information 23 Shell exemple: Exportation
Master 1ère année Sécurité des Systèmes d’Information En plus des variables que l'utilisateur peux définir lui- même, le shell est lancé avec un certain nombre de variables prédéfinies utiles pour un certain nombre de commandes et accessibles par l'utilisateur. Le contenu de ces variables système peut être modifié mais il faut alors faire attention car certaines ont une incidence directe sur le comportement du système. Variables système Shell
Master 1ère année Sécurité des Systèmes d’Information Variables système Shell Chemin d'accès aux bibliothèques statiques ou partagées du système. LD_LIBRARY_PATH Chemin d'accès aux pages du manuel MANPATH Définition de la langue à utiliser ainsi que du jeu de caractères. LANG Chemin complet du shell en cours d'exécution. SHELL Prompt String 2, chaîne représentant un prompt secondaire au cas où la saisie doit être complétée. PS2 Prompt String 1, chaîne représentant le prompt standard affiché à l'écran par le shell en attente de saisie de commande. PS1 Liste de répertoires, séparés par des « : » où le shell va rechercher les commandes externes et autres scripts et binaires. La recherche se fait dans l'ordre des répertoires saisis. PATH Chemin d'accès du répertoire utilisateur. Répertoire par défaut en cas de cd. HOME ContenuVariable
Master 1ère année Sécurité des Systèmes d’Information 26 Shell exemple: bin]# echo $PS1 \W]\$ bin]# echo $PS2 > bin]# PS1='\s-\v\$ ' bash-3.00# \W]\$ ' bin]# bin]# echo $LANG fr_FR.UTF-8 bin]# MANPATH=$MANPATH:/usr/local/man Variables système
Master 1ère année Sécurité des Systèmes d’Information 27 Shell if... then... else La structure « if then else fi » est une structure de contrôle conditionnelle. if then else fi Structure de contrôle conditionnelle
Master 1ère année Sécurité des Systèmes d’Information 28 Shell exemple: Structure de contrôle conditionnelle
Master 1ère année Sécurité des Systèmes d’Information 29 Shell if... then... else La structure « if then else fi » est une structure de contrôle conditionnelle. if then else fi Structure de contrôle conditionnelle
Master 1ère année Sécurité des Systèmes d’Information 30 Shell exemple: Structure de contrôle conditionnelle