Scripting shell
M1 RÉSEAUX ET TELECOMS - RT0801
OLIVIER FLAUZAC
Scripts
Script shell
Fichier texte
Contenant une suite de commandes shell
Exécutable par un interpréteur
Retournant dans tous les cas une valeur
◦ Code de bon fonctionnement
◦ Code d’erreur
◦ Différenciation des erreurs !
Shell
Langage de commande et d’échange avec le système
Ensemble de commandes
Quelques shell
◦ bash : Bourne Again Shell : shell GNU
◦ csh, tcsh : shels proche du C de Berkeley)
◦ ksh : korn shell
◦ …
Scripts élémentaires
#!/bin/bash
# un commentaire
echo "Salut les amis"
exit 0
chmod u+x monScript.sh
./monScript.sh
Exécution d’une commande
Utilisation de $( ... )
Exploitation de la chaîne retournée
◦ Affichage
◦ Stockage
#!/bin/bash
echo "nous somme le " $(date)
exit 0
Les variables
Variables non types et non déclarées
Référencement de la valeur : $
Variable en lecture readonly
Exploitation des variables d’environnement
◦ $USER,$PWD,$HOME ...
Liste des variables d’environnement : env
var.sh
#!/bin/bash
variable="bonjour les amis"
echo $variable;
listeFic=$(ls)
echo $listeFic
echo Vous êtes : $USER
echo Répertoire d\'exécution : $PWD
echo Répertoire de base : $HOME
exit 0
Variables prédéfinies
$? valeur de sortie de la dernière commande
$0 nom du script
$n Nième argument passé au script
$# nombre d’arguments
$$ PID du processus courant
$* liste des arguments à partir de $1
Exemple : var2.sh
#!/bin/bash
echo "ce script s\'appelle" $0
echo "vous avez passé l’argument" $1
./var.sh
echo "la dernière commande a donné :" $?
exit 0
Opérations sur les variables
#!/bin/bash
var1=0
echo $var1 #0
let var1++
echo $var1 #1
let var1--
echo $var1 #0
var2=45
var2=$var2+359
echo $var2 #45+359
var3=4
var3=$(($var3+359))
echo $var3 #363
var4=7
var4=$[$var4+3]
echo $var4 #10
Tableaux
Déclaration globale ou individuelle
tab = ("toto" "titi")
tab1[0] = "bob"
tab1[1] = "alice"
Affichage
echo ${tab1[0]}
echo ${tab[@]}
Taille
echo ${#tab1[*]}
len= ${#tab1[*]}
Tests
Deux syntaxes
◦ test expression
◦ [ expression ]
Tests sur les types de fichiers
Tests sur les valeurs (chaînes, numériques)
Tests sur les fichiers
-e le fichier existe
-f c’est un fichier
-d c’est un répertoire
-r | -w | -x propriété du fichier
-s non vide
f1 –nt f2 Plus récent que
f1 –ot f2 Plus vieux que
Expressions logiques
expr1 –a expr2 Et
expr1 –o expr2 Ou
! Expr Négation
Test des valeurs
Chaines de caractères
-z / -n Chaîne vide / non vide
!= / n Différentes identiques
Valeurs numériques
-eq / -ne Égal / différent
-lt / -gt Strictement inférieur / strictement supérieur
-le / -ge Inférieur ou égal/ supérieur ou égal
Structure conditionnelle : if
if commande1 #!/bin/sh
then
instructions if [ $# -ne 1 ]
elif commande2 then
then echo usage : $0 argument
instructions exit 1
else fi
instructions echo Le paramètre est : $1
fi exit 0
Structures conditionnelles : case
case valeur in
expr1) commandes ;;
expr2) commandes ;;
...
esac
#!/bin/sh #!/bin/sh
case $# in case $USER in
0) echo aucun paramètre ;; root) echo hello root ;;
1) echo 1 paramètre $1 ;; olivier) echo bonjour olivier ;;
2) echo 2 paramètres $1 - $2 ;; esac
3) echo 3 paramètres $1 - $2 - $3 ;; exit 0
esac
exit 0
Structures itératives : for
for variable [in liste] #!/bin/bash
do if [ $# -ne 1 ]
commandes then
done echo usage $0 repertoire
exit 1
#!/bin/sh fi
if [ $# -le 3 ] for f in $(ls $1)
then do
echo au moins 4 arguments if [ -f $1/$f ]
exit 1 then
fi echo $f est un fichier
echo Les paramètres sont : elif [ -d $1/$f ]
for var in $* then
do echo $f est un répertoire
echo $var fi
done done
exit 0 exit 0
Structures itératives : while / until
while [test] until [test]
do do
commandes commandes
done done
#!/bin/bash #!/bin/bash
cpt=0 cpt=0
until [ $cpt -eq 10 ] while [ $cpt -le 10 ]
do do
echo "encore 1 : " $cpt echo "encore 1 : " $cpt
let cpt++ let cpt++
done done
La gestion des flux
En UNIX tout est fichier
Utilisation des flux
◦ < entrée standard depuis un fichier
◦ > ou 1> flux standard
◦ 2> flux d’erreur
◦ 2>&1 redirection de la sortie d’erreur vers la sortie standard
Redirection dans un fichier
◦ > écriture et création du fichier
◦ >> ajout à un fichier
Le cas du clavier
Ecriture de scripts interactifs
Lecture au clavier
Utilisation de read
Affectation d’un liste de variables
#!/bin/bash
read v1 v2 v3
echo "vous avez entré $v1"
echo "vous avez entré $v2"
echo "vous avez entré $v3"
Exploitation d’un fichier en sortie
Exploitation de la redirection
Ecriture avec echo dans le fichier
#!/bin/bash
list=$(ls)
for element in $list
do
echo $element >> ./toto.txt
done
Lecture d’un fichier
Lecture de la totalité d’un fichier dans une variable
◦ Exploitation de cat
◦ Exploitation de la redirection
#!/bin/bash #!/bin/bash
list=$(<toto.txt) list=$(cat toto.txt)
for element in $list for element in $list
do do
echo $element >> ./toto.txt echo $element >> ./toto.txt
done done
Lecture ligne à ligne
Utilisation de
◦ Boucle while
◦ read
◦ redirection
#!/bin/bash
cpt=1
while read LINE
do
echo $cpt ":" $LINE
let cpt++
done < toto.txt
Fonctions
Eléments de structuration de programmes
Pas toujours ( bien ) utilisées
Script souvent == programmation « sale »
Exploitation standard
◦ Déclaration
◦ Paramétrage
◦ Appel
Fonctions : déclaration et appel
#!/bin/bash
#déclaration
listFic(){
echo la liste des fichiers est :
ls -l
}
echo appel à la fonction
#appel
listFic
Fonction : paramètres
Pas de déclaration dans le prototypage
Exploitation des paramètres comme pour les scripts $1 , $2 …
#!/bin/bash
listFic(){
echo la liste des fichiers dans $1 est :
ls -l $1
}
echo Donnez le chemin à explorer :
read path
echo appel à la fonction
listFic $path
Travail sur les chaînes
Possibilité de réaliser des opérations spécifiques
◦ Extraction directe
◦ Modification du symbole délimiteur
Simplification des programmes
◦ Evite l’usage d’expressions régulières
Attention dans le cas des séparateurs
◦ Persistance de la modification
Extraction
Extraction
◦ Dans un chaine
◦ À partir d’un position
◦ Un nombre définit de caractères
${ chaine : position : nombre_de_caractères }
Troncature
◦ Dans un chaine
◦ Un nombre définit de caractères
${ chaine : nombre_de_caractères }
Extraction exemple
#!/bin/bash
chaine="salut à vous tous"
chaine2=${chaine:8:4}
echo $chaine #salut à vous tous
echo $chaine2 #vous
chaine3=${chaine:5}
echo $chaine3 #à vous tous
Notion de séparateur
Définition de la variable spéciale $IFS
Internal Field Separator
Utilisé pour effectuer les opérations standard de lecture
Valeur par défaut (configurable et dépendante du système)
◦ newline
◦ newline , tab , space
Redéfinition possible de l’IFS
◦ Permet le split implicite
Exemple
#!/bin/bash
oldIFS=$IFS
toto="oli;vier;toto"
echo $toto
echo "**************"
IFS=';' oli;vier;toto
echo $toto **************
for var in $toto oli vier toto
do oli
echo $var vier
done toto
echo "**************" **************
IFS=$oldIFS oli;vier;toto
echo $toto
IFS et fichier
#!/bin/bash olivier;flauzac;azerty olivier
florent;nolot;kkjgg flauzac
affich(){ hacene;fouchal;pjhgbvc azerty
oldFS=$IFS
---------
IFS=';’
for var in $1 florent
do nolot
echo $var kkjgg
done ---------
IFS=$oldIFS hacene
echo "---------" fouchal
} pjhgbvc
while read LINE
---------
do
affich $LINE
done < mdp.txt
Autour du réseau
Commandes réseau
Commandes respectant les protocoles réseau
Intégrable dans des scripts
Définition de l’ensemble des éléments de commandes
◦ En ligne de commande
◦ Dans des fichiers de configuration
Eléments définis
◦ Adresse de destination
◦ Fichier source
◦ Fichier destination
◦ Login / mot de passe
◦ …
Wget
Outil lié au requêtes
◦ Téléchargement
◦ Test d’existence
Permet
◦ De télécharger en ligne de commande
◦ D’intégrer le téléchargement dans les scripts
Permet «l’aspiration»
Exploitation des protocoles
◦ FTP
◦ HTTP
◦ HTTPS
Chargement et test
wget –-spider URL
wget URL
wget –O fichier URL
wget –-continue –O fichier URL
wget –-ftp-user=XXX –-ftp-password=YYY –O fichier URL
wget –-limitrate=512k –O fichier URL
wget –-mirror –-convert-links –P ./dir URL
wget –-user-agent= "xxx " –O fichier URL
Codes de sortie
0 Succès
1 Erreur générique
2 Parse error
3 Erreur d’entrée / sorti fichier
4 Erreur réseau
5 Erreur d’authentification SSL
6 Erreur d’authentification
7 Erreur de protocole
8 Erreur retournée par la serveur
Curl
Bibliothèque de requête pour les URL
◦ commande de transfert de et vers un serveur
Accès et création de ressource sur un serveur
◦ Exploitable en environnement REST
Protocoles supportés : FTP(S) , HTTP(S), SMPT(S), POP(S), IMAP(S), SCP, SFTP, SMB ...
Conçu pour fonctionner sans inter-actions
Basé sur libcurl
◦ intégration dans les langages de script
Utilisation HTTP
curl http://www.toto.com
curl –o toto.html http://www.toto.com
curl –L http://www.toto.html
curl –c –o toto.html http://www.toto.com
curl --limit-rate 10MB –o toto.html http://www.toto.com
curl -z 15-Jan-19 –o toto.html http://www.toto.com
curl –u login:password –o toto.html http://www.toto.com
Utilisation HTTP
curl –V http://www.toto.com
curl –I http://www.toto.com
curl –trace http://www.toto.com
curl –x http://www.toto.com
curl --data "txt=letexte" http://addr/form.php
curl --data-urlencode "txt=ici un texte" http://addr/form.php
curl --cookie "cook=lecookie" http://addr/cook.php
Utilisation FTP
curl –u ftpuser:ftppass –O ftp://ftp_server/file
curl –u ftpuser:ftppass –O ftp://ftp_server/
curl –u ftpuser:ftppass –T ./myLocalFile ftp://ftp_server/file
curl –u ftpuser:ftppass –T "{./myLocalFile1 , ./myLocalFile2} " ftp://ftp_server/file
Quelques scripts
Récupération d’informations sur un
utilisateur
Pas de paramètres
Création d’un fichier à chaque utilisation
Affichage et enregistrement
◦ de l’utilisateur
◦ l’id de l’utilisateur
◦ des groupes de l’utilisateur
Sauvegarde
Plusieurs paramètres
◦ le nom de l’archive
◦ nom du répertoire à sauvegarder
◦ adresse du serveur de sauvergarde
◦ login et password du compte
Archive réalisée avec tar
copie à travers du réseau de l’archive
Un script d’installation
Paramètres
◦ le nom de l’archive
◦ le répertoire de base d’installation
Vérification des existences et des droits
Test du type d’archive (zip, tar, tgz)
◦ Uniquement sur l’extension
Utilisation de l’archiveur