1. UNIX et Scripts
Transcription
1. UNIX et Scripts
EISTI 2000-2001 Département Informatique-SDE Script UNIX Edition: Responsable: 2002-2003 Nacéra Bennacer 1 18/10/02 EISTI 2000-2001 Département Informatique-SDE Table des matières 1. UNIX et Scripts .................................................................................3 1.1. Initialisation ................................................................................................... 4 1.2. Les variables d'environnement.................................................................... 4 1.3. Les caractères spéciaux du shell ................................................................ 5 1.3.1. La génération des noms de fichiers .....................................................................5 1.3.2. Les autres caractères spéciaux ............................................................................5 1.4. Le passage des paramètres ......................................................................... 6 1.5. Les entrées sorties ....................................................................................... 6 1.6. Les structures de contrôle ........................................................................... 6 1.6.1. La commande test .................................................................................................6 1.6.2. La commande expr................................................................................................7 1.6.3. La condition if .......................................................................................................7 1.6.4. La boucle until.......................................................................................................7 1.6.5. La boucle while......................................................................................................7 1.6.6. La condition for.....................................................................................................7 1.6.7. La condition d'aiguillage case..............................................................................7 1.6.8. Les directives break et continue ..........................................................................8 1.7. Les fonctions................................................................................................. 8 1.8. Les alias......................................................................................................... 8 1.9. Le job control: jobs, bg, fg, kill .................................................................... 8 2. Les principales commandes UNIX ................................................10 3. Exercices avec corrigé sur le shell (Mir:/corriges/SYSTEME/SCRIPT) ......................................................13 4. Exercices en complément .............................................................15 2 18/10/02 EISTI 2000-2001 Département Informatique-SDE 1. UNIX et Scripts Le shell est un langage de programmation interprété autorisant la récursivité; mais c'est avant tout l'interpréteur standard de UNIX. Lors de l'ouvertue d'une session, appelée login sous UNIX, un processus shell est crée qui permet à l'utilisateur de dialoguer avec le système. Trois types de commandes sont exécutées par le shell: • • • Les commandes externes qui sont contenues dans des répertoires définis dans la variable d'environnement PATH. Dans ce cas l'exécution de la commande est réalisé par un processus dédié créé par le processus shell. Les commandes internes qui font partie du shell dont l'exécution ne nécessite pas la création de nouveaux processus. Ces commandes peuvent être scindées en deux: - Les commandes d'usage fréquent: cd, pwd, umask, set, … - Les commandes composées de directives algorithmiques: if, then, else, while, case, for, … Les commandes définies par une fonction ou un alias (*) Priorité des commandes de même nom: d'abord les fonctions ensuite les commande internes et enfin les commandes externes Le bourne Shell est le premier shell crée et il reste celui dont tout système Unix a besoin pour lancer les outils de configuration au démarrage de la machine. ksh, bash et zsh sont plus enrichis mais restent compatibles avec le sh. Le csh et tcsh ont des syntaxes plus différentes de sh et très proches de celle du langage C. L'important est qu'au moins un shell compatible avec sh existe sur une machine UNIX. Bourne Shell /bin/sh C Shell /bin/csh Toronto C Shell /bin/tcsh Korn Shell /bin/ksh Bourne Again Shell /bin/bash Z Shell /bin/zsh 3 18/10/02 EISTI 2000-2001 Département Informatique-SDE 1.1. Initialisation Le shell exécute successivement deux fichiers avant d'afficher son caractère d'invite (par défaut $): /etc/profile et le fichier .profile (se trouvant dans le répertoire HOME de l'utilisateur). Si la variable ENV est définie (par un login korn shell) et si son contenu est la référence d'un fichier existant; ce fichier est exécuté. Exemple de .profile: ls() { /bin/ls –al $* } rm() { /bin/rm –i $* } logout() { exit } PS1= PS1="Mir[$LOGNAME]" set -o vi alias p='ps -ef |sort |pg' Export PS1 #fonction ls() redéfinit ls #fonction rm() redéfinit rm #fonction logout() redéfinit exit #commande interne de terminaison d'un shell #invite du shell #édition de l’historique en mode vi #alias redéfinissant ps #exportation de la variable d'environnement PS1 Il est très utile après une modification de .profile de faire prendre en compte son contenu sans fermer et réouvrir une session. Ce lancement force l'exécution par le shell courant. $. .profile Ce tableau récapitule les différentes façons pour lancer un script shell: Commande Conditions sur ref Effet ksh ref Fichier lisible Interprétation par un sous-processus ksh ref ou ./ref Fichier lisible et exécutable Interprétation par un sous-processus ksh . ref Fichier lisible Interpretation dans le ksh courant exec ref Fichier lisible et exécutable Recouvrement du ksh par un ksh non intéractif interprétant le fichier Les versions récéntes prennent en compte les premiers caractères de la procédure: #!/bin/sh ou #!/bin/csh suivant le shell utilisé. 1.2. Les variables d'environnement Elles sont utilisées par le shell ou le système. Certaines sont initialisées automatiquement et ne peuvent être modifiées: HOME, LOGNAME ou USER. D'autres sont initialisées automatiquement et peuvent être modifiées: PATH, TERM, SHELL. D'autres sont initialisées par l'utilisateur dans le fichier .profile. L'utilisateur a la possibilité de définir d'autres variables. Ces variables ne se déclarent pas et elles sont locales au shell. Si on lance un autre shell la variable n'existe plus. La commande set permet de visualiser toutes les variables d'un shell. 4 18/10/02 EISTI 2000-2001 NomVar=valeur $NomVar export NomVar Département Informatique-SDE affecte valeur à NomVar représente le contenu de la variable. export permet de répercuter une variable sur l'arborescence descendante (shell fils). Exemple: Affectation des variables $ var1=abc $ var2="abc*toto" $ var3=abc*toto Affichage de variables $ echo $var1 $var2 $var3 abc abc*toto abc*toto Portée du métacaractère $ : utilisation de {} $ var=toto $ echo $vartiti rien $ echo ${var}titi tototiti 1.3. Les caractères spéciaux du shell 1.3.1. La génération des noms de fichiers ? un caractère quelconque * une chaîne de caractères (éventuellement vide) [ début de définition d'un ensemble [! début de définition du complément de l'ensemble ] fin de définition d'un ensemble ou de son complément marque d'intervalle dans un ensemble Les caractères . en début de mot ou après un / ou / ne sont pas couverts par les abréviations. Les expréssions construites à partir des caractères * ? [] sont appelées des expressions régulières. [af69R] [A-T] un caractère de la liste énumérée un caractère de l'intervalle alphabétique 1.3.2. Les autres caractères spéciaux # $ & ; < > << >> | `` ' ' "" \ () {} Introduit un commentaire Introduit un nom de variable Termine une commande lancée en arrière plan Sépare des commandes se trouvant sur une même ligne Caractères de redirection Exécute une commande Délimite une chaîne de caractères où les caractères spéciaux perdent leur signification sauf lui-même Délimite une chaîne de caractères où les caractères spéciaux perdent leur signification sauf \ $ ` " Déspécilise le caractère qui le suit Exécuter une commande dans un shell fils Regroupe des commandes 5 18/10/02 EISTI 2000-2001 Département Informatique-SDE 1.4. Le passage des paramètres Le shell reçoit les arguments sur la ligne de commande sous la forme de variables $1 $2 $3 ... $9. $0 est le nom de la commande. La commande interne shift permet de décaler les arguments d'une position. p1 $1 shift p1 p2 $2 p3 $3 p4 $4 p5 $5 p6 $6 p7 $7 p8 $8 p9 p10 p11 p12 p13 p14 $9 p2 $1 p3 $2 p4 $3 p5 $4 p6 $5 p7 $6 p8 $7 p9 $8 p10 p11 p12 p13 p14 $9 Les autres variables du script correspondant à ces paramètres sont : $# le nombre de paramètres passés au script $* la liste des paramètres passés au script $$ le PID du processus exécutant la commande $! le PID du dernier processus asynchrone $? le dernier status 1.5. Les entrées sorties La commande read comme la commande echo peut recevoir pluseiurs arguments séparés par des espaces ou tabulations. 1.6. Les structures de contrôle 1.6.1. La commande test test expression ou [ expression ] Cette commande renvoie un code de retour égal à 0 si l'expression est vraie et une valeur différente de 0 dans cas contraire. [ -a fichier ] existence du fichier [ -s fichier ] existence du fichier + taille non nulle [ -d fichier ] existence + état de répertoire [ -f fichier ] existence + état de fichier [ -r fichier ] existence + autorisation de lecture [ -w fichier ] existence + autorisation d'écriture [ -x fichier ] existence + autorisation d'exécution [ -n chaîne ] chaîne non nulle [ -z chaîne ] chaîne nulle Les chaînes de caractères [ $var = chaîne ] égalité [ $var != chaîne ] différence Les expressions numériques [ $var = valeur ] 6 18/10/02 EISTI 2000-2001 Département Informatique-SDE [ $var != valeur ] [ $var -opérateur valeur ] opérateurs possibles : -lt < -le ≤ -gt > -ge ≥ 1.6.2. La commande expr Pour évaluer une expression numérique contenant une variable, il faut utiliser la commande expr . Les opérateurs autorisés sont + - * / %. exemple : remarque : [ `expr $var + 1` -gt 5 ] a= `expr $var + 1` expr $var : '.*' renvoie le nombre de caractères de var 1.6.3. La condition if if expression then commandes else commandes fi 1.6.4. La boucle until until expression do commandes done 1.6.5. La boucle while while expression do commandes done 1.6.6. La condition for for variable in liste de valeurs do commandes done 1.6.7. La condition d'aiguillage case case variable in cas1) commandes;; cas2 | cas3) commandes;; … Casn) commandes;; esac 7 18/10/02 EISTI 2000-2001 Département Informatique-SDE Les cas sont conformes à la syntaxe d'expressions régulières 1.6.8. Les directives break et continue Ces deux directives peuvent être utilisées à l’intérieur des boucles for, while et until. Elles peuvent être suivies d’un nombre qui correspond au nombre de niveaux d’imbrication pour lequel les directives sont appliqués. 1.7. Les fonctions Il est possible de déclarer une fonction dans le shell intéractif ou à l’intérieur d’un script shell. Elles peuvent renvoyer un code de retour. A l’aide de la commande interne return. La syntaxe: Nom_fonction() { liste de commandes }. Exemple: isfile() { if [ -f $f ] then return 0 else return 1 fi } for i in $* do f=$i if [ isfile ] then echo "$i est un fichier" else echo "$i n'est pas un fichier" fi done 1.8. Les alias En ksh , on peut renommer une commande: alias nom=valeur unalias nom La commande alias sans arguments liste les alias déclarés. L'option –t liste ceux crées automatiquement lorsqu’on utilise des commanes externes. 1.9. Le job control: jobs, bg, fg, kill Ce mécanisme permet aux utilisateurs de ne voir que les processus lancés sous le shell intéractif. Chaque commande analysée par le shell s'appelle tâche ou job. Il peut s'agir d'un groupe de processus. Toute tâche possède un numéro. L'avantage d'un tel mécanisme est que la consultation des tâches peut se faire sans solliciter le noyau (ps est gourmand). De plus le numéro d'identification est un petit nombre. Le Korn shell permet le contrôle des processus d'une manière fine. $ jobs Cette commande fournit la liste des tâches créées par le shell, sous la forme : [1] état tâche1 8 18/10/02 EISTI 2000-2001 Département Informatique-SDE [2] + état tâche2 Le caractère + signale la tâche courante, - la tâche courante précédente. $kill tâche Pour tuer le processus, le job peut être désigné de plusieurs façons %nombre Le nombre entre crochets %chaîne Le job dont le nom commence par chaîne %?chaîne Le job dont le nom contient chaîne %% ou %+ Le job courant %Le job précédent $ commande $ commande & fg processus en avant plan processus en arrière plan fg bg Ctrl-z stop processus suspendu 9 18/10/02 EISTI 2000-2001 Département Informatique-SDE 2. Les principales commandes UNIX Gestion de session, de compte, informations générales: login passwd logname who [am i] id [a,u,g] groups uname[-a] tty stty clear date cal i j du quota [-v] création d'une session de travail changer le mot de passe afficher le login de l'utilisateur liste des utilisateurs connectés à la machine numéros et les noms d'identification de l'utilisateur et de son groupe liste des groupes auxquels appartient l'utilisateur nom de la machine, nom du système d'exploitation afficher la référence absolue du terminal associé à l'entrée standard visualiser et modifier la valeur de paramètres de communication entre le système et le terminal effacer l'ecran du terminal date du jour et l'heure courante calendrier du mois i (de 1 à 12) de l'année j (de 1 à 9999) par défaut le mois de l'année courant fournit l'espace alloué (en nombre de blocs de 512 octets) aux différents fichiers indique à l'utilisateur s'il est contrôlé par quotas et dans l'affirmative les valeurs limites Gestion des processus: ps [-e, a, d, g, p, t, u] kill fournit des informations sur les processus en cours envoie un signal à un processus Gestion de fichiers: pwd référence du répertoire de travail cd changement de répertoire de travail (~, ., ..) ls [-l,a,i,d] contenu d'un répertoire ou caratéristiques d'un fichier cat contenu d'un fichier more contenu par page touch modifier les dates de dernier accès en lecture et/ou écriture cp[-i, r] copie physique d'un fichier cp ref_source ref_dest (les deux fichiers référencent un fichier ordinaire) cp ref_source1 … ref_dest (les sources référencent des fichiers ordinaires et la destination référence un répertoire) cp –r ref_source1 … ref_dest (si l'un des sources et la destination référencent un répertoire) ln création de liens ln ref_source ref_dest (les deux fichiers référencent un fichier ordinaire) ln ref_source1 … ref_dest (les sources référencent des fichiers ordinaires et la destination référence un répertoire) mv changement d'un nom de lien mv ref_source ref_dest (les deux fichiers référencent un fichier ordinaire) mv ref_source1 … ref_dest (les sources référencent des fichiers ordinaires et/ou répertoires et la destination référence un répertoire) rm [-r] suppression de liens mkdir création d'un répertoire rmdir suppression d'un répertoire chmod, chown, chgrp modification de caratéristiques d'un nœud D'autres commandes: sort uniq [-c, -u] paste tr compress uncompress trier un fichier comparer des lignes de fichiers et ne conserver qu'un exemplaire de chaque ligne juxtaposer des lignes correspondantes de deux ou plusieurs fichiers copie sur la sortie standard les caractères lus sur l'entrée standard après avoir réalisé des susbstitutions ou des suppressions de caractères définies dans les arguments compression de fichiers décompression de fichiers 10 18/10/02 EISTI 2000-2001 find file Département Informatique-SDE rechercher dans un répertoire les fichiers d'un nom, d'un type , d'un user, … classer le fichier ASCII, binaire, répertoire, source C, … fc –l[r, n] fc –s chaîne liste le contenu du fichier .history. réexécute la commande la plus récente commençant par chaîne par défaut de chaîne, la dernière commande est exécutée. Sous ksh: l'alias r est défini r p (numéro de la commande ou une chaîne) pour rappeler la commande Fichiers administration utilisateurs: Le fichier /etc/passwd a la structure suivante: nom_login:x:UID:GID:commentaire:chemin_repertoire_login:chemin_shell Le fichier /etc/group a la structure suivante: nom_group::GID:liste_autres_utilisateurs_ayant_acces Opérations sur les contenus de fichiers: Sélection "verticale" head [ -n ] fichier Ecrit sur la sortie standard les n premières lignes du fichier tail [ -nlcb ] fichier Ecrit sur la sortie standard les n dernières lignes ou les n derniers caractères ou les n derniers blocs. grep [-v] pattern fichier Récupère les lignes du fichier contenant pattern (une expression régulière). L'option -v permet de récupérer les lignes du fichier ne contenant pas le pattern. ^pattern permet de spécifier une recherche en début de ligne. pattern$ permet de spécifier une recherche en fin de ligne. Sélection "horizontale" cut [ -ddélimiteur -fi,j ] fichier Récupère les champs i et j séparés par le délimiteur indiqué après -d. cut [ -ci-j ] fichier Récupère les caractères i à j de chaque ligne : option -c. Comptage wc [ -lwc ] fichier wc -l wc -w wc -c wc compte le nombre de lignes compte le nombre de mots compte le nombre de caractères équivalent à wc –l 11 18/10/02 EISTI 2000-2001 Département Informatique-SDE Exemples récapitulatifs: Stocker dans le fichier toto tous les login des utilisateurs du système $ cut -d: -f1 /etc/passwd > toto Afficher le nombre d'utilisateur du système $ wc -l /etc/passwd 36 /etc/passwd ou $cat /etc/passwd | wc –l 36 Afficher le nombre de groupes gérés par le système $ cat /etc/group | wc -l 22 Afficher les informations contenues dans /etc/passwd pour l'utilisateur nb $ grep "^nb:" /etc/passwd nb:x:522:500:Nacera Bennacer :/homep/profs/nb:/usr/bin/ksh tester si une chaîne de caractères "nb" est un login ou pas $ grep "^nb:" /etc/passwd | wc -l 1 Donner les numéros d'identification de l'utilisateur nb et de son groupe $ grep "^nb:" /etc/passwd | cut -d: -f1,3,4 nb:522:500 Donner le nom du groupe correspondant $ grep "500" /etc/group | cut -d: -f1 profs Afficher les caractéristiques des fichiers réguliers (droits d'accès, référence) se trouvant dans le répertoire courant ls –l * .* | grep -v ^d | tr –s " " | cut –d " " –f1,7 la commande tr avec l'option –s " " transforme les séquences d'espaces successifs en un seul espace. 12 18/10/02 EISTI 2000-2001 Département Informatique-SDE 3. Exercices avec corrigés sur le shell (Mir:/corriges/SYSTEME/SCRIPT) Ecrire un script qui reçoit plusieurs chaînes de caractères et affiche si elles correspondent à un nom de login ou non. if [ $# = 0 ] then echo "Pas de parametres passés !" else for i in $* do NBRLIGNES=`grep ^"$i:" /etc/passwd | wc -l ` if [ $NBRLIGNES = 0 ] then echo "$i n'est pas un login" else echo "$i est un login" fi done fi Ecrire un script qui affiche pour chaque utilisateur du système le groupe auquel il appartient. for LIGNE in `cut -d: -f1,4 /etc/passwd` do LOGIN=`echo $LIGNE | cut -d: -f1` GID=`echo $LIGNE | cut -d: -f2` GROUPE=`grep ":$GID:" /etc/group | cut -d: -f1` echo "L\'utilisateur $LOGIN est dans le groupe $GROUPE" done Ecrire un script qui propose à l'utilisateur de tester si un nom de login existe déjà et ce, tant que l'utilisateur le désire. Un login doit comporter au moins 7 caractères. REPONSE=o until [ $REPONSE = n ] do echo "Entrez un nom :" read NOM if [ `expr $NOM : '.*' ` -gt 7 ] then echo "Un nom de login a au plus 7 caracteres" else if [ `grep ^"$NOM:" /etc/passwd | wc -l` = 0 ] then echo "Ce nom n'existe pas" else echo "$NOM existe deja" fi fi echo "Recommencer (o/n) ?" read REPONSE done 13 18/10/02 EISTI 2000-2001 Département Informatique-SDE Ecrire un script qui affiche un paramètre sur deux. while [ $# != 0 ] do echo $1 if [ $# -ge 2 ] then shift 2 else shift fi done Ecrire un script qui affiche un paramètre sur n. echo "Unite ?" read UNITE while [ $# != 0 ] do echo $1 if [ $# -ge $UNITE ] then shift $UNITE else shift $# fi done Ecrire un script qui reçoit comme paramètre un nom de fichier et affiche, en fonction de son extension (.c, .pas) le type du fichier. S'il n'y a pas d'extension, il le signale. Pour les autres extensions, il indique qu'il ne la connaît pas. case $1 in *.c) echo "Fichier C";; *.pas) echo "Fichier pascal";; *.*) echo "Extension inconnue";; *) echo "Pas d'extension";; esac 14 18/10/02 EISTI 2000-2001 Département Informatique-SDE 4. Exercices en complément Q1) En ligne de commande on lance les commandes suivantes. Compléter le ?. A=5 B= "$HOME est mon repertoire prive" C=`pwd` echo $A echo $B echo $C ? ? ? ksh export B cd ~/SYSTEME echo $A ksh echo $C ? echo $B ? exit ? echo $A ? Q2) Soit le programme suivant, dont l'exécutable est nommé a.out : #include<stdio.h> void main() { int x; printf("Donnez un nombre\n"); scanf("%d", &x); printf("Donnez un nombre %d\n", x); } Que se passe-t-il au lancement de ce programme comme suit. Expliquer. a.out & Q3)Donner la commande shell permettant de redéfinir la variable d'environnement correspondant au prompt d'invite du premier shell; celle-ci doit comporter entre [ ] le nom de la machine: le répertoire courant. Que faut-il faire pour que cette redéfinition soit toujours prise en compte. Q4) Définir dans le .profile les alias suivants: Un alias ll permettant de remplacer ls –l en mode page Un alias la permettant de remplacer ls –a en mode page Un alias l permettant de remplacer ls avec les options l et a et p en mode page et en triant selon la taille des fichiers. Q5) Définir dans le .profile la fonction rm permettant d'avoir une demande de confirmation. Q6) Définir le script nommé creComOra suivant: Pour créer des comptes utilisateurs sous ORACLE, il faut lancer sous ORACLE les deux lignes de commande SQL suivantes: CREATE USER NomUtilisateur IDENTIFIED BY PasswordUtilisateur; GRANT CONNECT, RESOURCE TO NomUtilisateur; Sous ORACLE, on a la possibilité avec l'utilitaire nommé start, de relire un fichier de commandes sql et de les exécuter. On vous demande de créer le script creComOra qui reçoit un argument (le nom d'un groupe d'utilisateurs) et qui crée un fichier de commandes SQL permettant plus tard avec l'utilitaire start de créer des comptes ORACLE des utilisateurs appartenant au groupe passé en argument. Chaque utilisateur ayant comme login et password ORACLE, le login UNIX. Le fichier de commande aura comme nom, la valeur de l'argument suivi de l'extension sql. Exemple: $ creComOra ing2 Cette commande doit donc créer le fichier ing2.sql dont le contenu est un ensemble de commandes SQL permettant de créer tous les comptes des utilisateurs du groupe ing2. Q7) Définir le script nommé del suivant: Ce script réécrit la commande rm. Cette nouvelle commande permet de conserver les fichiers à supprimer dans le répertoire $HOME/poubelle. Que faut-il faire pour que l'utilisateur puisse lancer ce script quel que soit le répertoire de travail. 15 18/10/02