Cours Unix-Shell

Transcription

Cours Unix-Shell
Année 2007
Cours Unix-Shell
par
Karam ALLALI
Ecole Spéciale d’Informatique
Table des matières
1 Introduction.
5
1.1
Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.2
Système d’exploitation . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
1.3
Composition du système d’exploitation Unix . . . . . . . . . . . . . . . . .
9
1.3.1
Le noyau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
1.3.2
Le Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2 Système de fichiers et droits d’accès.
11
2.1
Système de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2
Droits d’accès . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.1
Droits d’accès sous Unix . . . . . . . . . . . . . . . . . . . . . . . . 14
2
2.2.2
Type de fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3 Commandes de base et gestion des processus.
18
3.1
Le manuel en ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2
Commandes de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.3
3.2.1
Créer un répertoire . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.2.2
Supprimer un répertoire . . . . . . . . . . . . . . . . . . . . . . . . 20
3.2.3
Déplacer, changer le nom d’un répertoire . . . . . . . . . . . . . . . 20
3.2.4
Copier tous les fichiers d’un répertoire . . . . . . . . . . . . . . . . 21
3.2.5
Occupation de l’espace disque . . . . . . . . . . . . . . . . . . . . . 21
3.2.6
Autres commandes utiles . . . . . . . . . . . . . . . . . . . . . . . . 22
Processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4 VI et Quelques notions sur le Shell.
26
4.1
L’éditeur de texte Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.2
Le Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3
Les variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3
4.4
Lancement de l’exécution d’un shellscript . . . . . . . . . . . . . . . . . . . 29
A Exercices.
31
4
Chapitre 1
Introduction.
5
1.1
Historique
L’histoire du système d’exploitation Unix commence en 1969 aux Bell Labs (laboratoires de recherche en informatique d’A.T.&T.). C’est pour répondre aux besoins des
ingénieurs de la société que Ken Thompson écrit un système interactif, qui met l’accent
sur les utilitaires de développement de logiciels, le partage de fichiers et les outils de documentation qui allait devenir Unix. Ce nom d’Unix a été attribué par opposition au système
Multics (vaste projet du M.I.T.). La première évolution interne marquante d’Unix a été sa
ré-écriture (par Ken Thompson et Denis Ritchie) en langage C, lequel a été inventé pour la
cause en 1971. En 1975, le système Unix (v6) est distribué aux universités et aux centres de
recherches. La principale université qui va travailler sur Unix est l’université de Berkeley,
qui va produire ses propres versions appelées BSD pour Berkeley Software Distribution.
En 1979, les Bell Labs sortent leur version appelée v7, avec en particulier, l’ajout de nouveaux utilitaires et un effort en matière de portabilité. Cette version est la première à être
diffusée dans le monde industriel. On peut dire qu’elle est à l’origine du développement
du marché Unix. Au début des années 80, une modification de la législation américaine
autorise A.T.&T. à commercialiser lui-même ses propres produits qui sont alors appelés
System. C’est à cette époque que Microsoft propose sa propre version d’Unix appelée
Xenix et destinée aux microordinateurs. A Berkeley, les efforts portent sur l’intégration
des protocoles réseaux TCP/IP, la gestion de la mémoire avec l’introduction de la pagination (alors qu’A.T.&T. reste fidèle quand à lui à la segmentation), la modification de
certains paramètres du système (taille des blocs, nombre des signaux...) et l’ajout d’outils (l’éditeur vi, un interpréteur de commandes csh...). Cette prolifération des systèmes
6
UnixÀ a engendré un certain nombre de problèmes de compatibilité car chacun allant
¿
dans sa propre direction, il y avait alors plusieurs systèmes Unix. Plusieurs facteurs vont
alors jouer pour canaliser et recentrer l’offre Unix: la complexité croissante des systèmes
et l’action des utilisateurs. En 1983, A.T.&T. sort la version System V, qui est issue de
la v7 et qui sera enrichie au fur et à mesure par de nouvelles versions (releases). Dans le
même temps, Berkeley, propose sa version 4.2 BSD (avec les fonctionnalités réseau) qui va
servir de base pour de nombreux constructeurs (Sun Microsystems, Digital...) et lui permettre d’entrer dans le monde industriel. Ces deux produits marquent la fin des systèmes
Unix-like en raison de leur importance par rapport à la version de référence, la v7. La
fin des années 80 est marquée par une croissance sans précédent du nombre de systèmes
Unix dans le domaine des systèmes d’exploitation. Tous les constructeurs proposent une
solution Unix à leur catalogue (on trouve alors trois grandes familles: les versions basées
sur System V, celles issues de BSD et les versions Xenix sur micro). Le début des années
90 est marqué par le regroupement des constructeurs au sein de deux organisations: l’U.I.
(Unix International) créée à partir de l’accord entre A.T.&T. et Sun Microsystems d’une
part et l’O.S.F. d’autre part. Le premier accord a comme objectif la convergence entre
les versions System V et 4.2 BSD. La première réalisation est la version System VR4
(System V release 4) qui réalise la synthèse entre SunOS (version Unix de Sun conçue
sur la base BSD), Xenix et System V. L’O.S.F., quand à lui s’est fixé comme objectif de
réaliser un système, appelé OSF/1, construit sur un noyau Unix et intégrant les fonctionnalités apportées par ses membres (multifenêtrages, graphismes, bases de données...) de
manière à disposer d’un environnement ouvert commun aux différentes architectures des
constructeurs. La principale réalisation à l’heure actuelle de l’O.S.F. est Motif qui définit
7
un ensemble de normes au niveau de la présentation sur un environnement multifenêtré.
1.2
Système d’exploitation
L’ensemble de programmes permettant l’utilisation d’une machine s’appelle le système
d’exploitation. C’est lui qui doit prendre en charge toute la gamme de complexité trouvé
dans des systèmes d’ordinateurs : quelques parties interagissent directement avec le matériel,
où des événements peuvent se dérouler à des vitesses autour de 1/107 secondes (tels que le
changement d’état d’une porte logique), d’autres parties ont en charge l’interaction avec
les utilisateurs (où les vitesses sont plutôt de l’ordre des secondes). Une simple frappe
sur le clavier peut résulter en 10 appels à des programmes du système opératoire, en
1000 instructions machines et en 1000000 changements d’état des portes logiques. La
stratégie adaptée, comme souvent en informatique est d’organiser cette complexité en une
hiérarchie d’abstractions, de manière telle que chaque niveau peut ignorer les détails des
autres niveaux.
8
1.3
1.3.1
Composition du système d’exploitation Unix
Le noyau
Le noyau est la partie centrale d’Unix. Il est résident, il se charge en mémoire au
démarrage. Sa structure est modulaire, ce qui rend aisées ses manipulations en termes de
portabilité et l’utilisation des services qu’il offre via les primitives (ou appels systèmes).
Ce fonctionnement par primitives permet de résoudre les problèmes d’accès concurrents
aux informations du système. En effet, les appels systèmes font entrer l’exécution en
mode noyau. Dans ce mode, le processus est assuré de garder le processeur jusqu’au
retour au mode utilisateur lorsque l’appel système est terminé. Les différents noyaux
Unix ont été réécrits afin de pouvoir s’adapter aux nouvelles machines multi-processeurs
et de supporter le travail en temps réel. Ils sont le plus souvent réécrits en couches: les
différentes fonctions du noyau sont implémentées dans des couches logicielles différentes
qui communiquent entre elles par messages. La tendance actuelle est également de garder
le moins de fonctions possibles dans le noyau afin de constituer un micro-noyau. Les
fonctions écartées sont rejetées dans les modules exécutés en mode utilisateur. L’interface
entre le noyau Unix et les applications est définit par une bibliothèque (libc.a pour le
langage C par exemple). Elle contient les modules permettant d’utiliser les primitives mais
aussi des fonctions plus évoluées combinant plusieurs primitives. D’autres bibliothèques
sont utilisées pour des services spécialisés (fonctions graphiques,...).
9
1.3.2
Le Shell
L’interface utilisateur sous Unix est appelée shell. Lorsqu’un utilisateur tape des commandes Unix, ces commandes sont reçues par le shell qui les interprète avant de lancer
l’exécution de cette commande. Le shell est une couche logicielle bien séparée du noyau.
Il joue un double rôle celui d’interpréteur de commandes et celui de langage de programmation. Ce dernier rôle semblant parfois hermétique à des néophytes. Il existe plusieurs
shells dont les plus répandus sont:
– le Bourne Shell (sh): le shell de base sous Unix A.T.&T., le C-shell (csh): le shell
Unix BSD,
– le Korn-Shell (ksh) qui est une extension du Bourne shell. Il possède toutes les
commandes de son prédécesseur, ainsi que des commandes qui facilitent le travail
de l’utilisateur comme des outils de gestion des historiques des commandes tapées...
– le Z-shell (zsh): extension de ksh, qui offre en particulier des modules de complétions
des nom de programme, de fichiers, de variables utilisateur et système, l’envoie de
message à l’utilisateur de correction en cas d’erreur de frappe.
L’utilisateur, à l’aide des commandes qu’il a à sa disposition, peut écrire ses propres
fonctions et programmes en langage shell, ce sont alors des shellscripts. Une fois ceux-ci
réalisés, ils peuvent être utilisés par l’utilisateur comme n’importe quelle commande du
shell lui même.
10
Chapitre 2
Système de fichiers et droits d’accès.
11
2.1
Système de fichiers
Sous UNIX, les fichiers sont enregistrés dans une structure hiérarchisée en arbre. Ce
système de fichiers est donc composé d’une racine et de noeuds qui sont des répertoires et
des feuilles qui sont des fichiers ordinaires qui contiennent les données et les programmes.
Au niveau de l’utilisateur, les entrées-sorties sont vues de façon uniforme c’est-à-dire
avec les mêmes commandes, la même syntaxe et les mêmes attributs qu’il s’agisse d’un
fichier ou d’un périphérique. Par exemple, la redirection d’une commande sur un fichier ou
sur un périphérique utilise la même syntaxe: commande > sortie où sortie est le nom du
fichier (ordinaire ou spécial) de redirection. Mais au niveau du noyau, ce dernier effectuera
l’opération de redirection soit sur le système de fichiers, soit sur le périphérique selon le
type du fichier sortie. Cette vision uniforme des entrées-sorties est caractérisée par un
descripteur commun à tous ces éléments, qui est appelé inode. De fait, chaque fichier
Unix à un inode comprenant les attributs suivants:
• un propriétaire: celui qui a créé le fichier,
• un groupe: le groupe auquel appartient le créateur au moment où il créé le fichier,
• des droits d’accès: (voir paragraphe s’y rapportant),
• des informations générales sur la taille, la date de la dernière opération effectuée sur
le fichier, le nombre de liens sur ce fichier,...
L’arborescence unix est unique, quel que soit le nombre des disques, partitions... La
racine de l’arborescence est ¿ / À. Au dessous de cette racine se trouvent différents
12
répertoires. On trouve sous unix en général les répertoires suivants : /bin (exécutables),
/tmp (fichiers temporaires), /dev (périphériques), /etc (paramétrages généraux du système),
/usr (ressources du système), /users (données utilisateurs). Cette arborescence est légèrement
différente suivant les systèmes (et notamment sous linux) pour lequel on trouve cette
structure générale :
/ : racine du système de fichiers (appelée aussi root)
/boot : contient le noyau linux
/root : répertoire des données de l’administrateur (root)
/home : répertoire des données des utilisateurs (contient autant de sous-répertoires
que d’utilisateurs)
/etc (editing text config) : répertoire contenant les fichiers de configuration généraux
du système (fichiers de type texte) correspond approximativement à la branche HKLM
du registre windows
/bin (binaries) : contient les binaires de base liés à une librairie /lib (libraries) : contient
13
les librairies nécessaires aux binaires de /bin /lib/modules : contient les modules du noyau
/sbin (static binaries) : contient les binaires statiques (non liées à une librairie)
/usr (unix system ressources) : contient toutes les ressources du système
/usr/bin : contient les binaires liés à une librairie /usr/lib : contient les librairies
nécessaires aux binaires de /usr/bin /usr/sbin : contient les binaires statiques (non liées
à une librairie) /usr/share : contient les ressources partagées par les logiciels de /usr/bin
/usr/local : contient les programmes installés par une compilation locale ou un script
d’installation
/tmp : contient les fichiers temporaires généraux du système
/dev (device) : contient les périphériques du système
/proc : contient les processus en cours d’exécution, les paramètres courants (dynamiques) du système /var : répertoire de données (courrier, logs, spool..) /mnt : répertoire
servant au montage des système de fichiers
2.2
2.2.1
¿
externes
À
(disquette, cdrom, réseau...)
Droits d’accès
Droits d’accès sous Unix
Les autorisations d’accès sous UNIX sont de trois ordres: accès en lecture (r), en
écriture (w) et en exécution (x). A partir de ces trois options, on pourra effectuer toutes
14
les opérations de base sur les fichiers (création, copie, destruction,...). Ces droits vont être
donnés pour trois niveaux d’utilisateurs: pour le propriétaire, pour le groupe auquel appartient le propriétaire et pour le reste des utilisateurs. En ce qui concerne les répertoires,
l’attribut x est nécessaire pour pouvoir se déplacer dans ce répertoire ou pour y rechercher
un fichier.
Plus précisément, Chaque fichier bénéficie de droits, définis en trois catégories : les
droits du propriétaire (u : User), les droits du groupe (g : Group) et les droits des autres
(o : Other). Ces droits peuvent être la lecture, l’écriture et l’exécution. Pour chaque fichier,
on a donc trois groupes de trois attributs. On désigne symboliquement les droits par r
(Read : lecture), w (Write : ecriture), x (eXecute : exécution). Ces droits étant définis
pour trois catégories : propriétaire, groupe et autres, on note symboliquement les droits
sur les fichiers par trois groupes de trois lettres. Aucun droit est symbolisé par un tiret
- Par exemple, un fichier ayant les droits de lecture, d’écriture et d’exécution pour le
propriétaire, le groupe et les autres aura les attributs rwxrwxrwx. Le même fichier sans
aucun droit d’exécution sera noté rw-rw-rw-. Si le propriétaire a seul le droit d’exécution,
on aura rwxrw-rw-. Si le propriétaire a le droit de lecture/écriture, le groupe le droit
de lecture seul et les autres aucun droit, on aura rw-r—– Cette notation est la notation
symbolique. Cette notation a le mérite d’être explicite et simplement compréhensible, mais
elle est plus longue à mettre en oeuvre que la notation octale. Celle-ci utilise la conversion
en base 8 (sur trois bits) des trois attributs de droits. Le premier bit (en partant de la
gauche) correspond au droit de lecture. Le second au droit d’écriture, le troisième au droit
d’exécution. Comment convertir : le bit de gauche vaut 4, celui du milieu vaut 2, celui de
droite vaut 1. Ajouter simplement ces valeurs : vous aurez un nombre octal (de 0 à 7)
15
correspondant aux droits. Par exemple 7 = 4 + 2 + 1 − > droits de lecture, écriture et
exécution 4 = 4 + 0 + 0 − > droits de lecture 5 = 4 + 0 + 1 − > droits de lecture
et d’exécution Ceci pour chaque catégorie d’utilisateurs (propriétaire, groupe et autres).
Exemples : rwxrwxrwx correspond à 777 rw-r–r– correspond à 644 rw-r—– correspond à
640 Ces droits peuvent être changés avec la commande chmod Par exemple chmod 640
nom-fichier donnera les droits de lecture/écriture au propriétaire, lecture seule au groupe
et aucun droit pour les autres. La commande chmod permet également le changement
des droits sous forme symbolique. Bien entendu, il est possible de changer les attributs
avec un programme graphique ! Les droits sont en fait notés sur 12 bits. Les neufs bits
de droite correspondent aux droits cidessus, les trois bits de gauche correspondent aux
attributs spéciaux décrits ci-dessous. Si ces trois bits sont omis, ils sont considérés comme
égaux à 0 (de manière générale, les chiffres omis sur la gauche sont considérés comme
nuls : 7 équivaut à 0007, 45 à 0045, 644 à 0644).
2.2.2
Type de fichier
Chaque fichier contient également l’information de son type :
d pour un répertoire, - pour un fichier normal, b pour un périphérique en mode bloc
(exemple : disque dur), c pour un périphérique en mode caractère (exemple : imprimante),
l pour un lien symbolique (voir plus loin), p pour un tube nommé (fifo), s pour une socket.
• Ces informations apparaissent avec la commande ls −l Exemple pour un répertoire :
ls −dl test (le d signifie que l’on veut l’info sur le répertoire et non sur son contenu)
16
drwxr-xr-x ....
Le premier d signifie qu’il s’agit d’un répertoire. On note le x (exécution) : pour un
répertoire, cela signifie que l’on peut entrer dans le répertoire ou lister son contenu.
17
Chapitre 3
Commandes de base et gestion des
processus.
18
3.1
Le manuel en ligne
Une aide en ligne est disponible sous Unix et la plupart des commandes sont présentes
dans ce manuel. La commande man permet de consulter ce manuel. La syntaxe générale
est la suivante:
man [section] nom-de-la-commande
Si la page existe (si elle est trouvée dans l’une des arborescences définies dans la
variable MANPATH), le système la formate et l’affiche à l’écran. En règle générale, la
réponse a beaucoup de problèmes se trouve dans ces pages. N’hésitez donc jamais à les
consulter. Attention toutefois, certaines commandes peuvent apparaı̂tre plusieurs fois dans
la liste des pages de manuel. En effet, certaines fonctions sont utilisées dans plusieurs cas
de figures; par exemple, la commande if..then..else peut être aussi bien une commande
Unix, qu’une commande C, ou C++ ou Perl... dans ce cas, il existe donc plusieurs pages
se référant à cette commande (plusieurs sections contiennent des informations sur cette
fonction), il faut faire donc attention à appeler la bonne page de manuel. Pour cela, il
existe un moyen de connaı̂tre toutes les pages de manuel se référant à un mot clé donné:
man -k mot-clé
l’utilisateur verra une ligne pour chaque entrée du manuel concernant ce mot-clé. Par
exemple
man -k file
19
3.2
3.2.1
Commandes de base
Créer un répertoire
La commande servant à créer des répertoires sous Unix est:
mkdir [options] répertoires...
Il suffit d’avoir le droit d’écriture dans le répertoire père. Si on veut créer une arborescence directement, il faut utiliser l’option −p. Par exemple pour créer l’arborescence
/tp − unix/td1, taper mkdir −p tp − unix/td1.
3.2.2
Supprimer un répertoire
Comme pour les fichiers, la commande rm (avec l’option -r) permet de supprimer des
répertoires. Il existe une autre commande:
rmdir répertoires...
qui elle permet de supprimer les répertoires indiqués si ceux-ci sont déjà vides.
3.2.3
Déplacer, changer le nom d’un répertoire
Comme pour les fichiers, il s’agit de la commande mv. Ceci n’est possible sous System
V que si les deux répertoires ont le même parent, et sous BSD que si les deux répertoires
20
sont dans le même système de fichiers.
3.2.4
Copier tous les fichiers d’un répertoire
La commande à utiliser est:
cp − r repertoire source repertoire destination Toute l’arborescence du répertoire
source est copié dans le répertoire destination. Les nouveaux fichiers se retrouvent dans
le répertoire répertoire-destination/répertoire-source.
3.2.5
Occupation de l’espace disque
Parfois, il arrive que vous receviez des messages du système ou même de l’administrateur système vous indiquant que vous occupez trop de place sur le disque. Il existe
deux commandes qui permettent de savoir la place occupée par une arborescence, ou de
connaı̂tre la place disponible dans un système de fichiers. La commande:
du [options] [fichiers...]
affiche le nombre de kilo-octets occupés par les fichiers (ou répertoires) passés en
paramètre. La commande:
df [options] [file-system] [fichier]
Si aucun renseignement n’est spécifié, la commande df retourne les informations sur
tous les systèmes de fichiers.
21
3.2.6
Autres commandes utiles
cd : Change Directory Permet de changer de répertoire courant Syntaxe : cd chemindu-répertoire Le chemin peut être absolu (il commence par le caractère /) ou relatif : il
s’applique alors à partir du répertoire courant. Si aucun chemin n’est fourni, se positionne
dans le répertoire de travail de l’utilisateur (voir pwd ci-dessous, voir variable $HOME)
Exemple : se positionner dans le répertoire /usr cd /usr
echo affiche sur l’écran syntaxe : echo chose-à-afficher chose à afficher peut être une
variable, une chaine, le résultat d’une commande... exemple : afficher
¿
hello word
À
sur
l’écran : echo ”hello word”
exit quitte le shell courant. Raccourci : Ctrl-D syntaxe : exit export exporte une variable dans l’environnement courant et permet de la définir syntaxe : export VARIABLE
ou export VARIABLE=valeur exemple : rajouter au path courant un path vers /usr/local/bin
export PATH=$PATH : /usr/local/bin
pwd (Print Working Directory) affiche le répertoire de travail de l’utilisateur courant
syntaxe : pwd exemple 1 : affiche le répertoire de travail (pour le superutilisateur) pwd
(renvoie /root) exemple 2 : définit la variable REPUTIL avec le contenu du répertoire
de travail courant : export REPUTIL=‘ pwd‘ (utilisation de l’antiquote pour renvoyer le
résultat de la commande)
test permet de tester une condition (existence ou type d’un fichier, comparaison de
chaı̂nes, comparaison de nombres. Renvoie un statut égal à 0 si l’expression est vraie,
22
1 si elle est fausse. Est utilisé dans les expressions conditionnelles, le plus souvent dans
les scripts. Il est souvent remplacé par une autre syntaxe [ <expression> ] Syntaxe : test
<expressions> Exemple : efface un fichier <fichier> s’il existe if test −e <fichier> ; then
rm <fichier> ; fi Avec la seconde syntaxe, on aurait If [ -e <fichier> ] ; then rm <fichier> ;
fi
umask définit l’umask (masque des droits par défaut lors de la création de fichier).
Ne positionne jamais le bit de fichier exécutable sur les fichiers normaux. Syntaxe : umask
<masque> Exemple : positionne le mode de création par défaut à 644 umask 022
Chown : changement de propriétaire d’un fichier Syntaxe : chown user[ :group] fichier
Option -R : changement récursif de propriétaire
Mount : montage d’un système de fichiers dans l’arborescence unix Syntaxe : mount
-t type périphérique répertoire Où type est le type du système de fichiers, périphérique
le nom du périphérique, répertoire le répertoire de montage. Exemple : monter le système
de fichiers windows se trouvant sur la première partition du disque maitre sur la nappe
ide 1 au point de montage /mnt/windows
Umount : démontage d’un système de fichiers Syntaxe : umount <périphérique> ou
umount <point de montage> On ne peut pas démonter un périphérique s’il est occupé (pas
exemple si on utilise des fichiers sur ce périphérique) Ln : création d’un lien physique ou
symbolique Syntaxe : ln -option <source> <destination> Pour créer un lien symbolique,
utiliser l’option -s Tar : archivage - désarchivage Syntaxe : voir man tar
Grep : recherche d’expression régulières Syntaxe : grep -options <motif> [<fichier>]
23
Cherche le motif <motif> dans le fichier <fichier> (<motif> étant une expression régulière)
Grep est souvent utilisé à la suite d’un tube (voir redirections et tubes)
Find : recherche de fichier Syntaxe extrêmement simplifiée : find <chemin> -name
<motif> Il y a beaucoup d’autres options. Voir man find Exemple : trouver dans le
répertoire courant les fichiers dont le nom commence par c : find . -name ’c*’
Nice : définition de la priorité d’exécution d’un processus Syntaxe :nice -n <valeur>
<commande> Lance la commande <commande> avec la priorité <valeur> La priorité
va de -20 (le plus prioritaire) à 19 (le moins prioritaire). Les priorités négatives (c’est à
dire plus prioritaires) ne peuvent être définies que par le superutilisateur (root)
More : affichage page par page Syntaxe :more <fichier> Souvent utilisé à la suite d’un
tube, auquel cas <fichier> n’est pas indiqué. Less : affichage par page évolué Syntaxe :
less <fichier> Souvent utilisé à la suite d’un tube, auquel cas <fichier> n’est pas indiqué.
Beaucoup d’option : voir man less
3.3
Processus
Tout programme tournant en mémoire s’appelle un processus. Chaque processus possède
un numéro d’identification unique, des ressources propres (espace mémoire, espace d’entréessortie...). Un processus hérite de l’environnement du processus qui l’a lancé (variables).
Chaque processus peut être supprimé (tué) par la commande kill.
Syntaxe : kill numéro-de-processus, kill -s <signal>
24
numéro-de-processus Exemple : tuer un processus récalcitrant :
kill -s 9 1590 (envoie le signal KILL au processus 1590)
Les ressources utilisées par le processus sont alors restituées au système. Chaque processus est à l’écoute de signaux. Ces signaux peuvent être envoyés à un processus par un
autre, mais aussi avec la commande kill. Le signal le plus courant est le signal SIGTERM,
qui demande au programme de s’arrêter. Lors de l’arrêt du système, un signal SIGTERM
est envoyé en broadcast à tous les processus pour qu’ils s’arrêtent correctement.
On ajoute que pour connaı̂tre les processus qui tournent, on fait appel à la commande
ps
Syntaxe : ps options
25
Chapitre 4
VI et Quelques notions sur le Shell.
26
4.1
L’éditeur de texte Shell
L’éditeur vi est l’éditeur standard du système d’exploitation UNIX. Vous pouvez utiliser l’éditeur vi dans une fenêtre xterm .
Pour utiliser l’éditeur vi, vous n’avez qu’à entrer à votre terminal (ou dans une fenêtre
Command Tool) vi, suivi d’une espace puis du nom du fichier que vous voulez éditer. Si
le fichier n’existe pas, vi le créera automatiquement (l’exemple qui suit éditera le fichier
prog.c) :
station% vi prog.c
On distingue deux modes :
• Mode d’insertion Les caractères entrés sont enregistrés directement dans le fichier
en cours d’édition;
• Mode de commandes Les caractères entrés sont interprétés en tant que commandes
servant au positionnement du curseur (pour bouger le curseur, faire défiler le texte, etc.),
à l’édition du texte (pour effacer des caractères, des mots ou des lignes, etc.), au passage
au mode d’insertion (pour entrer du texte dans le fichier) et à l’entrée de commandes
globales (commandes plus complexes qui renvoient le curseur au bas de la fenêtre).
27
4.2
Le Shell
Le shell est l’interface homme/machine. Il permet de taper des commandes transmises
au système (noyau et processus). Il y a en fait plusieurs shells. Historiquement, c’est le
shell sh qui était utilisé sous unix. Plusieurs version sont ensuite apparues, apportant
une évolution des fonctionnalités (par exemple shell bourne : bash - shell korn : zsh et
d’autres encore). Ce document se réfère au shell bourne (bash). Le shell est un interpréteur
de commandes de la même manière que command.com ou cmd sous msdos/windows.
Ceux qui ont connu msdos ne seront pas trop dépaysés. Ils apprécieront certainement les
fonctionnalités avancées du shell, qui en fait une interface souvent plus rapide et efficace
qu’un environnement graphique, mais qui nécessite cependant de connaı̂tre les commandes
du shell. Tel est le but du présent paragraphe. Rappel important : sous unix/linux, la casse
des commandes et des noms de fichiers est importante. En règle générale, les commandes
sont en minuscules, les noms de fichiers le sont souvent, les variables sont souvent en
majuscules. Ce ne sont que des habitudes, pas des obligations. Fichier est différent de
fichier ou FICHIER. Il faut s’en souvenir ! Les options des commandes sont spécifiées par
un tiret suivi d’une lettre, ou un double tiret suivi de nom de l’option. Le tiret doit être
séparé de la commande par un espace.
4.3
Les variables
La notion de variable sous linux est la même que sous msdos. Les variables sont propres
à un environnement. Si vous ouvrez deux consoles différentes, chacune bénéficie de son
28
environnement propre. Les commandes lancées à partir d’un environnement héritent de
cet environnement. Souvent, les noms de variables sont en majuscules, mais ce n’est pas
une obligation. Le contenu de la variable est référencé en faisant précéder le nom de la
variable du signe $.
Exemple : je crée la variable TRUC et je lui donne la valeur
¿
texte de truc
À
:
TRUC=”texte de truc” J’affiche le contenu de la variable TRUC : echo $ TRUC (affiche :
texte de truc) par contre, echo TRUC affiche TRUC
Pour afficher l’environnement courant et ses variables : printenv Les variables définies
lors d’une session ne sont pas conservées. Pour que les variables restent définies, il faut
les redéfinir à chaque fois. C’est le rôle des fichiers de configuration.
4.4
Lancement de l’exécution d’un shellscript
On appelle shellscript un fichier qui contient des noms de commandes et des instructions internes au shell. L’utilisateur peut lancer un shellscript commande une commande.
Les commandes contenues dans le shellscript sont alors lancées comme si l’utilisateur les
tapait sur la ligne de commande. On peut lancer l’exécution d’un shellscript de trois
manières différentes
• Lancement par le nom du shellscript: Si l’utilisateur a le droit de lecture et d’exécution
sur le shellscript, il peut le lancer en tapant simplement son nom. Il se comporte alors
comme n’importe quelle commande. En particulier, il peut être utilisé par un autre shells-
29
cript. On peut construire ainsi de nouvelles commandes adaptées à ses propres besoins.
Lors de l’appel, le shell parcours la variable PATH pour trouver le fichier, donc par prudence, il est bon de lancer le script comme suit: ./shellscript, ceci évitera le temps de
recherche du script dans les arborescences de répertoires et surtout l’exécution d’un autre
script portant le même nom.
• Lancement par appel explicite du shell: Si le script porte un attribut de lecture, on
peut le lancer par appel explicite du shell: /bin/ksh nom-script Dans ce cas, un nouveau
shell est lancé, celui-ci lit les commandes du script et les fait exécuter comme si elles
avaient été tapées au clavier.
• Lancement par appel de la commande interne
à faire précéder le nom du fichier par un
. : La dernière solution consiste
¿ À
. : . shellscript Dans ce cas, il n’y a pas de
¿ À
création d’un nouveau processus, les modifications de l’environnement sont conservées.
En fait, ¿.À est une commande interne au shell qui lit toutes les commandes contenues
dans le shellscript et les exécute comme si elles avaient été tapées au clavier. De la même
façon, la variable PATH est parcourue pour déterminer l’emplacement dans le système de
fichiers du script.
30
Annexe A
Exercices.
31
Exercices
Exercice 1
En utilisant la commande cat, créer un fichier appelé V illes et contenant
les lignes suivantes :
Casablanca
Rabat
F ez
Terminer la saisie par 0 Ctrl − d0
Ajouter les lignes suivantes :
M ohammedia
M arakech
Terminer la saisie par 0 Ctrl − d0
En utilisant la commande sort, créer un fichier appelé V illesT rie qui
contient les noms des villes du fichier V illes mais dans l’ordre alphabétique.
Utiliser le même principe pour créer un fichier qui contient les noms de
trois éudiants, après, vous en ajoutez deux, ensuite, vous trier les noms
dans l’ordre alphabétique.
Exercice 2
Créer un fichier appelé liste contenant la liste des fichiers du répertoire
et de ses sous-repértoire.
Afficher la liste des fichiers présents dans le répertoire dans l’ordre alphabétique en tapant une ligne.
Exercice 3
Taper une ligne de commande qui affiche le message
00
Le f ichier est bien present sur le disque dur 00 seulement lorsqu’un fichier
00
toto00 est présent dans le répertoire courant.
N.B. Commandes à utiliser : ls, echo
Exercice 4
Afficher tous les fichiers contenants la lettre p.
Afficher les fichiers commencants par un l.
Exercice 5
Aller dans le répertoire de connexion de votre voisin en utilisant les
chemins absolus.
Retourner dans votre répertoire de connexion. Créer un répertoire 0 rep10 .
Aller dans le répertoire d’un autre voisin en utilisant les chemins relatifs.
Créer un répertoire 0 rep20 . Conclure.
Exercice 6
Dans votre répertoire, recréer le fichier 0 liste0 auquel vous attribuerez
les droits suivants 444. Expliquez les droits que vous avez accordez à votre
fichier. Donner une commande équivalente.
Changer le propriétaire du fichier.
32
Ajouter les droits en écriture pour tout le monde sur ce fichier. Conclure.
Exercice 7
Rechercher à partir de /home tous les fichiers contenants au moins un
chiffre dans leur nom et les afficher.
Exercice 8
On veut que les fichiers créés à compter de maintenant soient accessibles
uniquement à leur propriétaire rw − − − − − −−.
Exercice 9
Calculer le résultat de la multiplication de 8745 et de 4512 et stocker le
résultat dans la variable multip
Exercice 10
1. En tant que user1, pouvez vous créer le rép. temporaire /home/temp?
essayer! pourquoi?
2. Effectuer cette création comme root (pensez à la commande su).
3. Accorder les permissions maximales sur /home/temp, vérifier.
4. totox, toujours lui, tout content d’avoir enfin un droit d’écriture, dans
/home/temp eesaie de copier les 2 fichiers /ets/hosts et /ets/passwd dans
/home/temp? y parrviendra t-il? pourquoi? que donne ll /home/tmp?
5. totox, essaie maintenant de supprimer ces 2 fichiers de /etc. Réussitil? 6. Effrayé à l’idée de se faire pincer par le (ou la) redoutable root, totox
veut masquer sa faute tout en faisant punir user1 à sa place ! Pour cela,
il veut que user1 devienne propriétaire du fichier copié passwd. Comment
s’y prend t-il? Réussit-il? Et vous comment auriez vous fait?
Exercice 11
1. Comparer les permissions de /ets/passwd et /etc/shadow. Pourquoi
a t-on nommé ainsi ce dernier fichier ? user1 peut-il le lire? et voir sa
présence? L’examiner pour savoir son rôle.
2. Par précaution, en faire une copie sous le nom de shadow.bak dans
/home/temp ! vérifier les droits de /home/temp/shadow.bak
3. Pensez-vous tout de même pouvoir supprimer le fichier précédent?
Concluez!
4. root fait maintenant une copie de shadow chez vous, dans /home/user1,
sous le nom de shadow.bak et vous accorde la propriété de la copie. Comment fait-il? user1 vérifie le résultat.
5. Avec un éditeur de texte, vous modifiez ce fichier, par exemple en
supprimant des lignes, et vous faites une mise à jour. Cette mise à jour
sera t-elle réalisée? pourquoi?
6. Pensez vous que user1 puisse supprimer ce fichier? Essayez et expliquez!
Exercice 12
33
1. Afficher la quantité d’espace occupé des systèmes de fichiers.
2. Afficher l’espace-disque occupé par tous vos répertoires.
3. La même chose, mais en triant les répertoires selon leur taille dans
l’ordre inverse (les plus gros répertoires d’abord, les plus petits finalement).
4. La place totale occupée correspond-elle à ce qu’indique la commande
quata?
Exercice 13
1. Afficher la liste de tous les processus qui vous appartiennent.
2. Ouvrez une fenêtre horloge avec la commande xclock − update 2
(vous constatez que l’horloge tourne mais que le shell est suspendu), puis
suspendez-la (vous constatez que le processus horloge ne tourne plus, mais
que le shell est revenu en avant-plan)
3. Voyez l’état de ce processus avec la commande jobs, relancez-le en
arrière-plan (les aiguilles tournent à nouveau). Vérifiez avec la commande
jobs, puis tuez-le.
4. Relancez cette horloge, mais cette fois-ci directement en arrière-plan
(c’est-à-dire de façon détachée du shell). Comment tuer ce processus horloge depuis une autre fenêtre terminal (depuis un autre shell, où la commande jobs ne voit pas le processus en question)
Exercice 14
Faites un alias qui affiche avec la commande more la taille occupée par
tous vos répertoires. Testez cet alias.
Exercice 15
Tapez une commande, de manière à ce que les fichiers lors de leur
création aient par défaut les droits 640 (rw-r—–), et les répertoires 750
(rwxr-x—).
Exercice 16
Extraire les noms de login et UID puis triez suivant les UID, le tout en
une seule commande, vous redirigerez le tout vers un fichier.
Exercice 17
1. Vous avez chez vous un répertoire tmp/ qui contient un fichier bidon.
Créez un lien physique sur tmp/bidon appelé blo, dans votre répertoire
d’acceuil (HOME). Comparez les contenus de tmp/bidon et de blo?
2. Même question avec un lien symbolique.
3. Quelles sont les différences entre les liens durs et les liens symboliques?
4. Dans quel cas ne peut-on pas faire de lien physique? Que faut-il faire?
Quel est l’effet de chmod sur un lien?
34
Exercice 18
Pour les nostalgiques du dos, il s’agit de taper a : en ligne de commande
et d’obtenir le contenu du répertoire principale de la disquette. Taper c :
pour démonter la disquette et obtenir la liste de /. Pour ceci il faut ecrire
un petit script!
Exercice 19
Ecrire un script de vérification si un utilisateur est connecté.
Exercice 20
Ecrire un script (en utilisant la boucle “for”) qui affiche tous les fichier
qui se termine par ∗.c
Exercice 21
L’objectif de cette exercice est de savoir que le Shell, peut être un vrai
language de programmation.
1. Ecrire un script, qui teste un nombre entier naturel donné s’il est pair
ou impair, puis affiche le résultat.
2. Ecrire un script pour multiplier deux nombres et afficher le résultat.
3. Ecrire un script qui transforme un nombre donné en écriture binaire,
octale ou décimale.
Exercice 22
Ecrire un script illustrant le passage des arguments en Shell.
Exercice 23
Avec la boucle while ecrire un petit script qui affiche tous les nombres
pairs inférieurs à 100.
Exercice 24
1. Prérequis: while, les paramètres positionnels, set–
Conseil : utiliser la construction :
cat ¡ user.text — while true
do read ligne
if [ “$ligne” = “ “ ]; then break; fi
...
fi
2. Créer un fichier texte user.txt contenant quelques lignes au format
suivant login mot-de-passe nom groupes-secondaires
Par exemple : toto moiletoto M. Toto profs
3. Ecrire le script essai − comptes.sh qui parcourt ce fichier ligne par
ligne, récupère les champs de chaque ligne dans les paramètres positionnels,
et les affiche.
35
Remarque Dans le prochaine exercice, on verra commet créer un script
capable de générer des comptes à partir d’un fichier!
Exercice 25
• Obtenir la liste de tous les utilisateurs (nom, uid, gid, répertoire personnel) possédant un compte créé sur le serveur, autrement dit ayant un
uid supérieur à 500 (uid se trouve au 3ème champ de /etc/passwd)
Indication
• Se servir du dernier exercice du TP5 avec les conseils suivant
1. Extraire les champs 1, 3 et 4 du fichier /etc/passwd avec la commande
cat /etc/passwd — cut -d: -f 1,3,4
2. envoyer les lignes précédents vers l’entrée de la commande tr, de façon
à remplacer le séparateur : par des espaces cat /etc/passwd — cut -d: -f
1,3,4 — tr “:” “”
3. Puis on envoie la sortie dans une boucle while qui permet d’en extraire
chaque ligne, dont on affectera chaque champ aux paramètres positionnels
grâce à set –
4. Il suffira alors de comparer la valeur uid à 500 et d’afficher si uid ¿=
500
Exercice 26
• Il s’agit de créer le script test-fichier, qui précidera le type du fichier
passé en paramètre, ses permissions d’accèes pour l’utilisateur
• prérequis : passage de paramètres, instructions : test et if .. then .. else
• Appel : ./test-fichier nomFichier
• Exemple de résultats attendus
Le Fichier /ets est un répertoire
“/etc” est eccessible par root en lecture écriture exécution
Le fichier /etc/smb.conf est un fichier ordinaire qui n’est pas vide
“/etc/smb.conf” est accessible par jean en lecture.
Exercice 27
• Il s’agit de créer un ensemble de comptes constituant un nouveau
groupe.
• Les noms doivent s’écrire comme un nom générique (par ex. stage,
eleve ..) suivit d’un numéro.
• Le script demande d’abord le nom générique et celui du groupe secondaire dans lequel tous les comptes sont créés. Par defaut le nom du groupe
sera le nom générique.
36