Cours shell Unix
Commandes
&
Programmation
Version corrigée du 31/07/2003
Un système d'exploitation est un « programme » ou ensemble de programmes assurant la gestion de l'ordinateur et de ses périphériques.
Programme ou ensemble de programmes et d'API servant d'interface entre le matériel (hardware) et les applications (software).
Unix est un système d'exploitation multi-tâches et multi-utilisateurs. Il est disponible du simple micro (PC, Mac, Atari, Amiga) jusqu'au gros système (IBM Z séries) et même dans des PDA.
Les composants de base d'un Unix sont le noyau (kernel) et les outils (shell et commandes).
Le système d'exploitation a pour principales tâches les points suivants :
Le premier Unix disponible sur PC a été porté par Microsoft en 1979, Xenix, disponible jusqu'en 1984. Il fonctionnait sur 8086 à l'aide de très lourdes modifications. L'essor a eu lieu avec l'apparition du 80286, premier processeur Intel à posséder un mode protégé et des instructions de commutation de tâches. A l'arrivée du 80386 en 1987, la société Santa Cruz Operations qui diffusait dèja Xenix modifia Xenix et l'appela UNIX System V/386.
Depuis on trouve plusieurs portages Unix sur PC, dont les principaux sont SCO Openserver / Unixware, Sun Solaris, Linux, FreeBSD, OpenBSD, NetBSD.
Le PC n'est pas le seul micro supportant Unix : on trouve les Mac (anciens et nouveaux modèles), les Atari et Amiga, les machines à base de processeurs Alpha, ... Sur PC et dans les écoles, on utilise généralement Linux.
Structure d'un SE UNIX |
Rôle d'un OS |
| |
Pour pouvoir travailler sous Unix il faut ouvrir une session, à l'aide d'un nom d'utilisateur et d'un mot de passe. On distingue les administrateurs des utilisateurs normaux. L'administrateur est appelé root ou utilisateur privilégié et dispose de tous les pouvoirs sur la machine et le système Unix. L'utilisateur normal dispose de droits réduits et définis par l'administrateur. Pour se connecter :
Login : <tapez ici votre nom d'utilisateur>Le mot de passe n'apparaît pas en clair et doit être tapé en aveugle. En cas d'erreur, un message indiquera :
Login incorrectSuivant la version d'Unix et la configuration, plusieurs lignes de message peuvent apparaître, qu'il est possible d'ignorer. Puis le prompt du shell devrait apparaître, quelque chose du genre
user@machine$ou
$ou
%Pour se familiariser avec la saisie de commandes, nous pouvons tester quelques programmes d'information :
Pour interrompre une commande on peut utiliser la combinaison Ctrl+C. Pour lier les commandes, on sépare les commandes par le caractère « ; »
who ; datePour se déconnecter, il suffit de taper
exitOn peut aussi utiliser la combinaison de touches Ctrl+D.
On utilise la commande passwd pour modifier son mot de passe.
$ passwdDans certains cas, il faudra utiliser la commande yppasswd (cas de NIS). Sur les Unix récents l'administrateur peut définir des règles de sécurité comme le nombre minimum de caractères, contrôler le mot de passe depuis un dictionnaire s'il est trop simple, lui donner une date de péremption, ...
On distingue sous Unix les utilisateurs et les groupes, notion que nous verrons et détail lors de la gestion des droits. Un groupe définit un ensemble d'utilisateurs, un utilisateur fait obligatoirement partie d'au moins un groupe, ou de plusieurs. Le groupe par défaut d'un utilisateur est « users ».
Le système permet dans certains cas à un utilisateur connecté de changer de nom en cours de travail avec la commande su. Le mot de passe du nouvel utilisateur sera demandé.
su [-] utilisateur [-c commande]Si – est précisé, l'environnement du nouvel utilisateur est chargé, et si -c est précisé les commandes qui suivent sont exécutées.
La commande logname affiche le nom de login de l'utilisateur, en principe toujours le nom utilisé lors de la première connexion.
$ lognameEn principe cette commande n'est pas utile tout de suite, mais la première chose que l'on apprend généralement avec un shell ou un langage quelconque est d'afficher un message du genre « Hello, world ! ». la commande echo est une commande centrale du shell : elle transmet tous ses paramètres sur écran (ou canal de sortie standard).
$ echo texteLe texte est quelconque mais peut aussi admettre quelques caractères de formatage.
| Caractère | Effet |
|---|---|
| \n | Saut de ligne (newline) |
| \b | Retour arrière (backslash) |
| \t | Tabulation |
| \c | Pas de retour à la ligne (carriage) |
| \\ | Affiche \ |
| \$ | Affiche $ |
| \valeur | Affiche le caractère spécial de code octal valeur |
>On peut aussi afficher des variables (Partie Programmation).
système de fichiers / FileSystem / FS: comment dont sont gérés et organisés les fichiers par le système d'exploitation. Le FS d'Unix est hiérarchique.
On distingue principalement trois types de fichiers :ordinaires, catalogue, spéciaux.
Ce sont soit des fichiers contenant du texte, soit des exécutables (ou binaires), soit des fichiers de données. Par défaut, rien ne permet de différencier les uns des autres, sauf à utiliser quelques options de certaines commandes (ls -F par exemple) ou la commande file.
$ file nom_ficLes répertoires permettent d'organiser le disque dur en créant une hiérarchie. Un répertoire peut contenir des fichiers normaux, des fichiers spéciaux et d'autres répertoires, de manière récursive.
Ce sont le bien souvent des fichiers servant d'interface pour les divers périphériques. Ils peuvent s'utiliser, suivant le cas, comme des fichiers normaux. Un accès en lecture ou écriture sur ces fichiers est directement dirigé vers le périphérique (en passant par le pilote Unix associé s'il existe
On ne peut pas donner n'importe quel nom à un fichier, il faut pour cela suivre quelques règles simples. Ces règles sont valables pour tous les types de fichiers.
Sur les anciens systèmes un nom de fichier ne peut pas dépasser 14 caractères. Sur les systèmes récents, on peut aller jusqu'à 255 caractères. Il est possible d'utiliser des extensions de fichiers mais cela ne modifie en rien le comportement du système (un exécutable n'a pas besoin d'une extension particulière).
Unix fait la distinction entre les minuscules et majuscules. Toto, TOTO, ToTo et toto sont des noms de fichiers différents.
La plupart des caractères (chiffres, lettres, majuscules, minuscules, certains signes, caractères accentués) sont acceptés, y compris l'espace (très déconseillé). Cependant quelques caractères sont à éviter :
& ; ( ) ~ <espace> \ | ` ? - (en début de nom)Quelques noms valides :
Fichier1Quelques noms pouvant poser problème :
Fichier*Les chemins permettent de se déplacer dans le FileSystem. Un nom de fichier est ainsi généralement complété de son chemin d'accès. C'est ce qui fait que le fichier « toto » du répertoire « rep1 » est différent du fichier « toto » du répertoire « rep2 ». Le FS d'Unix étant hiérarchique, il décrit une arborescence.
Le schéma précédent représente une arborescence d'un FS Unix. Le « / » situé tout en haut s'appelle la racine ou root directory (à ne pas confondre avec le répertoire de l'utilisateur root).
Le nom de chemin ou path name d'un fichier est la concaténation, depuis la racine, de tous les répertoires qu'il est nécessaire de traverser pour y accéder, chacun étant séparé par le caractère « / ». C'est un chemin absolu.
/home/toto/Docs/Backup/fic.bakUn nom de chemin peut aussi être relatif à sa position courante dans le répertoire.
Le système (ou le shell) mémorise la position actuelle d'un utilisateur dans le système de fichier, le répertoire actif. On peut donc accéder à un autre répertoire de l'arborescence depuis l'emplacement actuel sans taper le chemin complet.
Pour se déplacer dans les répertoires, on utilise la commande cd. Le « .. » permet d'accéder au répertoire de niveau supérieur. Le « . » définit le répertoire actif (répertoire courant). La commande ls permet de lister le contenu du répertoire. La commande pwd (print working directory) affiche le chemin complet du répertoire actif.
$ cd /Lors de la création d'un utilisateur, l'administrateur lui alloue un répertoire utilisateur. Après une connexion, l'utilisateur arrive directement dans ce répertoire, qui est son répertoire personnel. C'est dans ce répertoire que l'utilisateur pourra créer ses propres fichiers et répertoires. La commande cd sans argument permet de retourner directement dans son répertoire utilisateur.
Login : totoLa commande ls permet de lister le contenu d'un répertoire (catalogue) en lignes ou colonnes. Elle supporte plusieurs options.
| Option | Signification |
|---|---|
| -l | Sortie de chaque information des fichiers |
| -F | Ajoute un « / » au nom d'un répertoire, un « * » au nom d'un exécutable, un « | » pour un tube nommé et « @ » pour un lien symbolique. |
| -a | Affiche toutes les entrées, y compris « . », « .. » et les fichiers cachés (qui commencent par un .) |
| -d | affiche le nom (et les attributs) des répertoires et pas leur contenu. |
| -i | Affiche les numéros d'inode. |
| -R | Mode récursif. Rentre dans les répertoires et affiche leur contenu. |
| -r | Inverse l'ordre du tri (à l'envers) |
| -t | Tri par date de modification |
| -c | Affiche la date de création (si -l) ou tri par date de création (si -t) |
| -C | Les noms sont affichés sur plusieurs colonnes |
| -u | Affiche la date d'accès (-l) ou tri par date d'accès (-t) |
| -1 | Liste sur une seule colonne. |
Sortie de la commande ls -l :
| -rw-r--r-- | 1 | oracle | dba | 466 | Feb 8 2001 | input.log |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Deux autres commandes utiles :
cat : concaténation de fichiers, le résultat étant affiché par défaut sur la sortie standard (écran)
touch : permet de créer un fichier s'il n'existe pas, et s'il existe de modifier sa date d'accès et sa date de modification, touch toto crée le fichier toto s'il n'existe pas
La commande mkdir (make directory) permet de créer un ou plusieurs répertoires, ou une arborescence complète.
mkdir rep1 [rep2] ... [repn]La commande mkdir accepte un paramètre « -p » permettant de créer une arborescence. Dans l'exemple précédent, si je veux créer documents/texte et que documents n'existe pas, alors :
$ mkdir -p documents/texteva créer à la fois documents et texte. C'est valable pour tous les répertoires de niveau supérieur :
$ mkdir -p documents/texte/persova créer les répertoires documents, texte et perso s'ils n'existent pas. S'il existent ils ne sont pas modifiés.
La commande rmdir (remove directory) supprime un ou plusieurs répertoires. Elle ne supprime pas une arborescence. Si des fichiers sont encore présents dans le répertoire, la commande retourne une erreur. Le répertoire ne doit donc contenir ni fichiers ni répertoires.
rmdir rep1 [rep2] ... [repn]La commande cp (copy) copie un ou plusieurs fichiers vers un autre fichier ou vers un répertoire.
cp fic1 fic2Dans le premier cas, fic1 est recopié en fic2. Si fic2 existe, il est écrasé sans avertissement (sauf droit particulier). Dans le second cas, fic1, fic2 et ainsi de suite sont recopiés dans le répertoire rep1. Les chemins peuvent êtres absolus ou relatifs. La commande peut prendre les options suivantes :
La commande mv (move) permet de déplacer et/ou de renommer un fichier. Elle a la même syntaxe que la commande cp. On peut à la fois déplacer et changer de nom.
$ cdLa commande rm (remove) supprime un ou plusieurs fichiers, et éventuellement une arborescence complète, suivant les options. La suppression est définitive (à moins d'avoir un utilitaire système propre au filesystem).
rm [Options] fic1 [fic2...]Options :
Un lien permet de donner plusieurs noms à un même fichier, ou de faire pointer un fichier sur un autre. Plutôt que de faire plusieurs copies d'un même fichier pour plusieurs utilisateurs, on peut par exemple permettre à ceux-ci d'accéder à une copie unique, mais depuis des endroits et des noms différents. On utilise la commande ln.
ln [options] fic1 fic2Il existe deux types de liens : les liens en dur « hard links » et les liens symboliques « symbolic links ».
Un hard link permet d'ajouter une référence sur un inode.
Sous Unix chaque fichier est en fait référencé au sein de deux tables : une table d'inode (information >node, noeud d'information, une par filesystem) qui contient outre un numéro de fichier, des informations comme des droits, le type et des pointeurs sur données, et une table catalogue (une par répertoire) qui est une table de correspondance entre les noms de fichiers et les numéros d'inodes. Le hard link rajoute donc une association dans cette seconde table entre un nom et un inode. Les droits du fichier ne sont pas modifiés.
Un hard link ne permet pas d'affecter plusieurs nom à un même répertoire, et ne permet pas d'effectuer des liens depuis ou vers un autre filesystem. De plus, faites attention au compteur de lien fourni par la commande ls -l : un 1 indique que ce fichier ne possède pas d'autres liens, autrement dit c'est le dernier. Si vous le supprimez, il est définitivement perdu. Par contre, tant que ce compteur est supérieur à 1, si un lien est supprimé, il reste une copie du fichier quelque part.
$ cdL'exemple précédent montre que les hard links n'ont pas de type particulier et sont considérés comme des fichiers ordinaires. On constate que chacun a 2 liens. Logique puisque deux fichiers pointent sur le même inode. Enfin nous voyons bien en résultat du ls -i que fic1 et fic2 ont le même inode, à savoir 484.
Un lien symbolique ne rajoute pas une entrée dans la table catalogue mais est en fait une sorte d'alias, un fichier spécial contenant une donnée pointant vers un autre chemin (on peut le concevoir comme une sorte de fichier texte spécial contenant un lien vers un autre fichier ou répertoire).
De par cette nature, un lien symbolique ne possède pas les limitations du hard link. Il est donc possible d'effectuer des liens entre plusieurs FileSystems, et vers des répertoires. Le cas échéant le lien se comportera à l'identique du fichier ou du répertoire pointés (un cd nom_lien est possible dans le cas d'un répertoire).
La suppression de tous les liens symboliques n'entraîne que la suppression de ces liens, pas du fichier pointé. La suppression du fichier pointé n'entraîne pas la suppression des liens symboliques associés. Dans le cas le lien pointe dans le vide.
$ rm fic2Cet exemple montre bien qu'un lien symbolique est en fait un fichier spécial de type « l » pointant vers un autre fichier. Attention, les droits indiqués sont ceux du fichier spécial. Lors de sont utilisation, ce sont les droits du fichier ou du dossiers pointés qui prennent le dessus. On distingue le caractère « @ » indiquant qu'il s'agit d'un lien symbolique. On remarque aussi que les inodes sont différents et que les compteurs sont tous à 1.
Lors de l'utilisation de commandes en rapport avec le système de fichier, il peut devenir intéressant de filtrer la sortie de noms de fichiers à l'aide de certains critères, par exemple avec la commande ls. Au lieu d'afficher toute la liste des fichiers, on peut filtrer l'affichage à l'aide de divers critères et caractères spéciaux.
| Caractère spécial | Rôle |
|---|---|
| * | Remplace une chaîne de longueur variable, même vide |
| ? | Remplace un caractère unique quelconque |
| [] | Une série ou une plage de caractères |
| [!...] | Inversion de la recherche |
Ainsi,
C'est le shell qui est chargé d'effectuer la substitution de ces caractères avant le passage des paramètres à une commande. Ainsi lors d'un
cp * documentscp ne reçoit pas le caractère * mais la liste de tous les fichiers et répertoires du répertoire actif.
Certains caractères spéciaux doivent être verrouillés, par exemple en cas de caractères peu courants dans un nom de fichier.
Le backslash \ permet de verrouiller un caractère unique. ls paie\ *.xls va lister tous les fichiers contenant un espace après paie.
Les guillemets "..." les guillemets permettent l'interprétation des caractères spéciaux, variables, au sein d'une chaîne.
Les apostrophes '...' verrouillent tous les caractères spéciaux dans une chaîne ou un fichier.
L'éditeur Unix par défaut se nomme vi (visual editor). S'il n'est pas des plus ergonomiques par rapport à des éditeurs en mode graphique, il a l'avantage d'être disponible et d'utiliser la même syntaxe de base sur tous les Unix. Chaque Unix propose généralement une syntaxe étendue au-delà de la syntaxe de base. Pour en connaître les détails : man vi.
vi [options] Fichier [Fichier2 ...]Trois modes de fonctionnement :
En mode commande
| Commande | Action |
|---|---|
| a | Ajout de texte derrière le caractère actif |
| A | Ajout de texte en fin de ligne |
| i | Insertion de texte devant le caractère actif |
| I | Insertion de texte en début de ligne |
| o | Insertion d'une nouvelle ligne sous la ligne active |
| O | Insertion d'une nouvelle ligne au-dessus de la ligne active |
| Commande | Action |
|---|---|
| h | Vers la gauche |
| i | Vers la droite |
| k | Vers le haut |
| j | Vers le bas |
| 0 (zéro) | Début de ligne (:0 première ligne) |
| $ | Fin de ligne (:$ dernière ligne) |
| w | Mot suivant |
| b | Mot précédent |
| fc | Saut sur le caractère 'c' |
| Ctrl + F | Remonte d'un écran |
| Ctrl + B | Descend d'un écran |
| G | Dernière ligne du fichier |
| NG | Saute à la ligne 'n' (:n identique) |
| Commande | Action |
|---|---|
| x | Efface le caractère sous le curseur |
| X | Efface le caractère devant le curseur |
| rc | Remplace le caractère sous le curseur par le caractère 'c' |
| dw | Efface le mot depuis le curseur jusqu'à la fin du mot |
| d$ (ou D) | Efface tous les caractères jusqu'à la fin de la ligne |
| dO | Efface tous les caractères jusqu'au début de la ligne. |
| dfc | Efface tous les caractères de la ligne jusqu'au caractère 'c' |
| dG | Efface tous les caractères jusqu'à la dernière ligne, ainsi que la ligne active |
| D1G | Efface tous les caractères jusqu'à la première ligne, ainsi que la ligne active |
| dd | Efface la ligne active |
Ces commandes peuvent être répétées. 5Dd supprime 5 lignes.
On peut annuler la dernière modification avec la commande « u ».
Contrairement à un éditeur de texte classique, vi peut rechercher autre chose que des mots simples et fonctionne à l'aide de caractères spéciaux et de critères. La commande de recherche est le caractère « / ». La recherche démarre du caractère courant à la fin du fichier. Le caractère « ? » effectue la recherche en sens inverse. On indique ensuite le critère, puis Entrée.
/echorecherche la chaîne 'echo' dans la suite du fichier. Quand la chaîne est trouvée, le curseur s'arrête sur le premier caractère de cette chaîne.
La commande « n » permet de continuer la recherche dans le sens indiqué au début. La commande « N » effectue la recherche en sens inverse.
Pour remplacer du texte, il faut se placer au début de la chaîne à modifier, puis taper l'une des commandes suivantes.
| Commande | Action |
|---|---|
| cw | Remplacement du mot courant |
| c$ | Remplacement jusqu'à la fin de la ligne |
| cO | Remplacement jusqu'au début de la ligne |
| cfx | Remplacement jusqu'au prochain caractère 'x' dans la ligne courante |
| c/Auto (Entrée) | Remplacement jusqu'à la prochaîne occurrence de la chaîne 'Auto' |
Après cette saisie, le caractère $ apparaît en fin de zone à modifier. Il suffit alors de taper son texte et d'appuyer sur Echap.
On utilise la commande « y » (Yank) pour copier du texte, elle-même devant être combinée avec d'autres indications. Pour couper (déplacer), c'est la commande « d ». Pour coller le texte à l'endroit choisi, c'est la commande « p » (derrière le caractère) ou « P » (devant le caractère). Si c'est une ligne complète qui a été copiée, elle sera placée en-dessous de la ligne active.
Pour copier une ligne : yy
Pour copier cinq lignes : 5yy
Pour placer les lignes copiées à un endroit donné : p
L'éditeur vi dispose de 26 tampons pour y stocker les données que l'on peut nommer comme on le souhaite. On utilise pour ça le « " ».
Pour copier cinq mots dans la mémoire m1 : m1y5w
Pour coller le contenu de la mémoire m1 à un endroit donnée : "m1p
La substitution permet de remplacer automatiquement plusieurs occurrences par une autre chaîne.
:[1ere ligne, dernière ligne]s/Modèle/Remplacement/[gc]Les numéros de lignes sont optionnels. Dans ce cas la substitution ne se fait que sur la ligne courante. En remplacement des numéros de lignes, « . » détermine la ligne courante, « 1 » la première ligne, « $ » la dernière ligne.
Le modèle est l'un des modèles présenté plus tôt. Remplacement est une chaîne quelconque qui remplacera le modèle.
Par défaut seule la première occurrence est remplacée. La lettre « g » indique qu'il faut remplacer toutes les occurrences. Avec « c », vi demande une confirmation pour chacune des occurrences.
:1,$s/[Uu]nix/UNIX/gCet exemple remplace, dans tout le fichier, Unix ou unix par UNIX.
| Commande | Action |
|---|---|
| :w Nom_fic | Sauve le fichier sous Nom_fic, en l'écrasant ou en le créant |
| :1,10w Nom_fic | Sauve les lignes 1 à 10 dans Nom_fic |
| :r Nom_fic | Insère le fichier Nom_fic à partir de la ligne courante |
| :! commande | Exécute la commande puis retourne à l'éditeur |
| :r! commande | Exécute la commande et insère le résultat à partir de la ligne courante |
| :f Nom_fic | Affiche en bas d'écran le nom du fichier, le nombre de ligne et la position actuelle |
| :e Nom_fic | Le fichier est chargé. Un message indique si le précédent a été modifié |
| :e # | Le dernier fichier chargé est affiché. Permet de commuter entre les fichiers |
La commande set permet de configurer l'éditeur.
Les redirections sont l'une des plus importantes possibilités offerte par le shell.
Par redirection, on entend la possibilité de rediriger l'affichage de l'écran vers un fichier, une imprimante ou tout autre périphérique, les messages d'erreurs vers un autre fichier, remplacer la saisie clavier par le contenu d'un fichier.
Unix utilise des canaux d'entrées/sorties pour lire et écrire ses données. Par défaut le canal d'entrée est le clavier, et le canal de sortie, l'écran. Un troisième canal, le canal d'erreur, est aussi redirigé vers l'écran.
Il est donc possible de rediriger ces canaux vers des fichiers, ou du flux texte de manière transparente pour les commandes Unix.
On se sert du caractère « > » pour rediriger la sortie standard (celle qui va normalement sur écran). On indique ensuite le nom du fichier où seront placés les résultats de sortie.
$ ls -l > resultat.txtSi le fichier n'existe pas, il sera créé. S'il existe, son contenu sera écrasé, même si la commande tapée est incorrecte. Le shell commence d'abord par créer le fichier puis exécute ensuite la commande.
Pour rajouter des données à la suite du fichier, donc sans l'écraser, on utilise la double redirection « >> ». Le résultat est ajouté à la fin du fichier.
$ ls -l > resultat.txtLes commandes qui attendent des données ou des paramètres depuis le clavier peuvent aussi en recevoir depuis un fichier, à l'aide du caractère « < ». Un exemple avec la commande « wc » (word count) qui permet de compter le nombre de lignes, de mots et de caractères d'un fichier.
$ wc < resultat.txtOn peut considérer un canal comme un fichier, qui possède sont propre descripteur par défaut, et dans lequel on peut ou lire ou écrire.
On peut rediriger les canaux de sortie 1 et 2 vers un autre fichier.
$ rmdir dossier2On peut aussi rediriger les deux canaux de sortie dans un seul et même fichier, en les liant. On utilise pour cela le caractère « >& ». Il est aussi important de savoir dans quel sens le shell interprète les redirections. Les redirections étant en principe en fin de commande, le shell recherche d'abord les caractères « <, >, >> » en fin de ligne. Ainsi si nous voulons grouper les deux canaux de sortie et d'erreur dans un même fichier, il faut procéder comme suit.
$ ls -l > resultat.txt 2>&1La sortie 2 est redirigée vers la sortie 1, donc les messages d'erreurs passeront par la sortie standard. Puis le résultat de la sortie standard de la commande ls est redirigé vers le fichier resultat.txt. Ce fichier contiendra donc à la fois la sortie standard et la sortie d'erreur.
On peut aussi utiliser à la fois les deux types de redirection.
$ wc < resultat.txt > compte.txtOn peut aussi se reporter à la commande « tee »
Un filtre (ou une commande filtre) est un programme sachant écrire et lire des données par les canaux standards d'entrée et de sortie. Il en modifie ou traite éventuellement le contenu. wc est un filtre.
Nous nous attarderons sur quelques filtres plus tard, mais en voici quelques uns : more (affiche les données page par page), sort (tri des données), grep (critères de recherche)
Les redirections d'entrée/sortie telles que nous venons de les voir permettent de rediriger les résultats vers un fichier. Ce fichier peut ensuite être réinjecté dans un filtre pour en extraire d'autres résultats. Cela oblige à taper deux lignes : une pour la redirection vers un fichier, l'autre pour rediriger ce fichier vers le filtre. Les tubes ou pipes permet de rediriger directement le canal de sortie d'une commande vers le canal d'entrée d'une autre. Le caractère permettant cela est « | ».
$ ls -l > resultat.txtdevient...
$ ls -l | wcIl est possible de placer plusieurs « | » sur une même ligne.
$ ls -l | wc | wcLa première commande n'est pas forcément un filtre. L'essentiel est qu'un résultat soit délivré. Idem pour la dernière commande qui peut par exemple être une commande d'édition ou d'impression. Enfin, la dernière commande peut elle-même faire l'objet d'une redirection en sortie.
$ ls -l | wc > resultat.txtNous avons indiqué que le rôle d'un système d'exploitation est aussi d'assurer la sécurité et l'accès aux données, ce qui se fait grâce au mécanisme des droits. Chaque fichier se voit attribué des droits qui lui sont propres, des autorisations d'accès individuelles. Lors d'un accès le système vérifie si celui-ci est permis.
A sa création par l'administrateur, un utilisateur se voit affecté un UID (« User Identifier») unique. Les utilisateurs sont définis dans le fichier /etc/passwd. De même chaque utilisateur est rattaché à au moins un groupe (groupe principal), chaque groupe possédant un identifiant unique, le GID (« Group Identifier»). Les groupes sont définis dans /etc/group.
La commande id permet d'obtenir ces informations. En interne, le système travaille uniquement avec les UID et GID, et pas avec les noms par eux-mêmes.
weas02> idA chaque fichier (inode) sont associés un UID et un GID définissant son propriétaire et son groupe d'appartenance. On peut affecter des droits pour le propriétaire, pour le groupe d'appartenance et pour le reste du monde. On distingue de ce fait trois cas de figure
Sortie de la commande ls -l :
| d | rwxr-xr-x | 1 | oracle | dba | 466 | Feb 8 2001 | oracle |
| - | rwxrwxrwx | 1 | oracle | dba | 14536 | Feb 8 2001 | output.log |
| - | rwxr-x--- | 1 | oracle | dba | 1456 | Feb 8 2001 | launch.sh |
Sur la première ligne du tableau, le répertoire oracle appartient à l'utilisateur oracle et au groupe dba, et possède les droits rwxr-xr-x.
| Droit | Signification |
|---|---|
| Général | |
| r | Readable (lecture) |
| w | Writable (écriture) |
| x | Executable (exécutable comme programme) |
| Fichier normal | |
| r | Le contenu du fichier peut être lu, chargé en mémoire, visualisé, recopié. |
| w | Le contenu du fichier peut être modifié, on peut écrire dedans. La suppression n'est pas forcément liée à ce droit (voir droits sur répertoire). |
| x | Le fichier peut être exécuté depuis la ligne de commande, s'il s'agit soit d'un programme binaire (compilé), soit d'un script (shell, perl, ...) |
| Répertoire | |
| r | Les éléments du répertoire (catalogue) sont accessibles en lecture. Sans cette autorisation, le ls et les critères de filtres sur le répertoire et son contenu ne sont pas possibles. Ce droit ne suffit pas pour entrer dans le catalogue. |
| w | Les éléments du répertoire (catalogue) sont modifiables et il est possible de créer, renommer et supprimer des fichiers dans ce répertoire. On voit donc que c'est ce droit qui contrôle l'autorisation de suppression d'un fichier même si on est pas propriétaire des fichiers du répertoire. |
| x | Le catalogue peut être accédé par cd et listé. Sans cette autorisation il est impossible d'accéder et d'agir sur son contenu qui devient verrouillé. Avec uniquement ce droit les fichiers et répertoires inclus dans celui-ci peuvent être accédés mais il faut alors obligatoirement connaître leur nom. |
Ainsi pour un fichier :
| rwx | r-x | r-- |
|---|---|---|
| Droits de l'utilisateur, en lecture, écriture et exécution | Droits pour les membres du groupe et lecture et exécution | Droits pour le reste du monde en lecture uniquement |
Lors de sa création, un fichier ou un répertoire dispose de droits par défaut. On utilise la commande chmod (change mode) pour modifier les droits sur un fichier ou un répertoire. Il existe de méthodes pour modifier ces droits : par la forme symbolique et par la base 8. Seul le propriétaire d'un fichier peut en modifier les droits (sauf l'administrateur système).
Le chmod sur un lien symbolique est possible comme sur tout autre fichier, mais cela ne modifie pas les droits du lien par lui-même mais les droits du fichier pointé.
La syntaxe est la suivante :
chmod modifications Fic1 [Fic2...]S'il faut modifier les droits de l'utilisateur, on utilisera le caractère « u ». pour les droits du groupe, le caractère « g », pour le reste du monde le caractère « o », pour tous le caractère « a ».
Pour ajouter des droits, on utilise le caractère « + », pour en retirer le caractère « - », et pour ne pas tenir compte des paramètres précédents le caractère « = ».
Enfin, le droit d'accès par lui-même : « r », « w » ou « x ».
On peut séparer les modifications par un espace, et cumuler plusieurs droits dans une même commande.
$ ls -lLa syntaxe est identique à celle des symboles. A chaque droit correspond une valeur octale c'est à dire de zéro (0) à sept (7), positionnelle et cumulable.
| Propriétaire | Groupe | Reste du monde | ||||||
|---|---|---|---|---|---|---|---|---|
| r | w | x | r | w | x | r | w | x |
| 400 | 200 | 100 | 40 | 20 | 10 | 4 | 2 | 1 |
Pour obtenir le droit final il suffit d'additionner les valeurs. Par exemple si on veut rwxrw-rw- alors on fera 400+200+100+40+20+4+2=766, et pour rw-r-r- 400+200+40+4=644.
$ chmod 766 fic1Lors de la création d'un fichier ou d'un répertoire et qu'on regarde ensuite leurs droits, on obtient généralement rw-r-r-- (644) pour un fichier et rwxr-xr-x (755) pour un répertoire. Ces valeurs sont contrôlées par un masque, lui-même modifiable par la commande umask. la commande prend comme paramètre une valeur octale qui sera soustraite aux droits d'accès maximum. Par défaut, tous les fichiers sont créés avec les droits 666 (rw-rw-rw) et les répertoires avec les droits 777 (rwxrwxrwx), puis le masque est appliqué.
Sur la plupart des Unix, le masque par défaut est 022, soit ----w--w-. Pour obtenir cette valeur, on tape umask sans paramètre.
Pour un fichier :
Maximum rw-rw-rw- (666)Pour un répertoire :
Maximum rwxrwxrwx (777)ATTENTION : la calcul des droits définitifs (effectifs) n'est pas une simple soustraction de valeurs octales ! Le masque retire des droits mais n'en ajoute pas.
Pour un fichier :
Maximum rw-rw-rw- (666)Il est possible de changer le propriétaire et le groupe d'un fichier à l'aide des commandes chown (change owner) et chgrp (change group).
chown utilisateur fic1 [Fic2...]Sur les UNIX récents seul root peut utiliser chown. La commande chgrp peut être utilisée par n'importe qui à condition que cet utilisateur fasse aussi partie du nouveau groupe.
En précisant le nom d'utilisateur (ou de groupe), le système vérifie d'abord leur existence. On peut préciser un UID ou un GID, dans ce cas le système n'effectuera pas de vérification.
Pour les deux commandes on peut préciser l'option -R, dans ce cas les droits seront changés de manière récursive. Les droits précédents et l'emplacement du fichier ne sont pas modifiés. Enfin sous certains Unix il est possible de modifier en une seule commande à la fois le propriétaire et le groupe.
chown utilisateur[:groupe] fic1 [fic2...]La commande basename permet d'extraire le nom du fichier dans un chemin.
$ basename /tmp/seb/listeLa commande dirname effectue l'inverse, elle extrait le chemin.
$ dirname /tmp/seb/listeRappel : un filtre (ou une commande filtre) est un programme sachant écrire et lire des données par les canaux standards d'entrée et de sortie. Il en modifie ou traite éventuellement le contenu. wc est un filtre. Les utilitaires sans être obligatoirement des filtres permettent un certain nombre d'actions sur des fichiers ou leur contenu comme le formatage ou l'impression.
Il s'agit d'extraire des lignes d'un fichier selon divers critères. Pour cela on dispose de trois commandes grep, egrep et fgrep qui lisent les données soit depuis un fichier d'entrée, soit depuis le canal d'entrée standard.
La syntaxe de la commande grep est
grep [Options] modèle [Fichier1...]Le modèle se compose de critères de recherche ressemblant beaucoup aux critères déjà exposés pour vi par exemple. Il ne faut pas oublier que ces critères doivent être interprétés par la commande grep et pas par le shell. Il faut donc verrouiller tous les caractères.
$ cat fic4La commande grep peut aussi prendre quelques options intéressantes.
Nous voyons que la syntaxe dans le cas de critères de recherches est assez lourde.
La commande egrep étend les critères de recherche et peut accepter un fichier de critères en entrée. Attention cependant egrep est lent et consomme beaucoup de ressources.
egrep -f fichier_critère Fichier_recherche| Caractère spécial | Signification |
|---|---|
| + | Répétition, le caractère placé devant doit apparaître au moins une fois. |
| ? | Le caractère situé devant doit apparaître une fois ou pas du tout. |
| | | Ou logique, l'expression située avant ou après doit apparaître |
| (...) | groupage de caractères |
bon(jour|soir) sortira bonjour et bonsoir.
La commande fgrep est un grep simplifié et rapide (fast grep). Elle accepte aussi un fichier de critères de recherche mais il s'agit là de critères simples, sans caractères spéciaux. On saisira dans le fichier de critère un critère simple (du texte et des chiffres) par ligne).
La commande cut permet de sélectionner des colonnes et des champs (découpage vertical) dans un fichier.
La syntaxe est la suivante :
cut -cColonnes [fic1...]Le format de sélection de colonne est le suivant :
La commande cut permet aussi de sélectionner des champs. Ces champs doivent être par défaut délimités par une tabulation, mais l'option -d permet de sélectionner un autre caractère (espace, ; ...). La sélection des champs est identique à celle des colonnes. Leur numérotation démarre à 1.
cut -dc -fChamps [fic1...]La commande wc (word count) permet de compter les lignes, mots et caractères.
wc [-l] [-c] [-w] [-w] fic1
Le fichier liste contient 12 lignes, 48 mots et 234 caractères.
La commande sort permet de trier des lignes. Par défaut le tri s'effectue sur tout le tableau et en ordre croissant. Le tri est possible sur un ou plusieurs champs. Le séparateur de champs par défaut est la tabulation ou au moins un espace. S'il y a plusieurs espaces, le premier est le séparateur, les autres des caractères du champ. La numérotation des champs démarre à 0.
sort [options] [+pos1 [-pos2] ...] [fic1...]+pos1 est le premier champ, -pos2 le dernier.
$ cat listeQuelques options
| Option | Rôle |
|---|---|
| -d | Dictionnary sort (tri dictionnaire). Ne prend comme critère de tri que les lettres les chiffres et les espaces. |
| -n | Tri numérique, idéal pour le colonnes de chiffres |
| -b | Ignore les espaces en début de champ |
| -f | Pas de différences entre majuscules et minuscules (conversion en minuscules puis tri) |
| -r | Reverse, tri en ordre décroissant. |
| -tc | Nouveau délimiteur de champ c. |
Exemple, tri numérique sur le prix par produits et quantités en ordre décroissant
$ sort -n -r +2 -3 listeIl est aussi possible de démarrer le tri à partir d'un certain caractère d'un champ. Pour cela on spécifie le « .pos » : +0.3 commencera le tri à partir du quatrième caractère du champ 0.
La commande join permet d'effectuer une jointure de deux fichiers en fonction d'un champ commun. les deux fichiers doivent être triés sur les champs indiqués. La numérotation des champs démarre à 0.
join [-tc] [-j1 n] [-j2 n2] fic1 fic2L'option -t indique le séparateur, -j1 (-1) le champ du premier fichier et -j2 (-2) le champ du second fichier. Par exemple :
$ join -t: -j1 4 -j2 3 /tmp/seb/passwd /tmp/seb/groupva joindre passwd et group en fonction de leur champ commun GID.
La commande tr permet de substituer des caractères à d'autres et n'accepte que des données depuis le canal d'entrée standard, ou par des fichiers en redirection d'entrée.
tr [options] original destinationL'original et la destination représentent un ou plusieurs caractères. Les caractères originaux sont remplacés par les caractères de destination dans l'ordre indiqué. Les crochets permettent de définir des plages.
Par exemple, remplacer le o par le e et le i par le a.
$ cat liste | tr "oi" "ea"Avec cette commande on peut convertir une chaîne en majuscules ou en minuscules, passage de toutes les minuscules en majuscules :
$ cat liste | tr "[a-z]" "[A-Z]"Rien n'empêche de détourner un quelconque flux pour l'afficher sur écran ou imprimante. Voici quelques commandes.
On aura plus d'informations avec la commande man.
Pour voir le début d'un fichier on utilise la commande head.
head [-c nbcar] [-n nblignes] [fic1...]L'option -c n'est pas disponible sous tous les Unix et permet de préciser un nombre d'octets d'en-tête à afficher. Par défaut 10 lignes sont affichées. L'option -n permet d'indiquer le nombre de lignes à afficher. Sur certains Unix c'est la syntaxe suivante qu'il faudra utiliser.
head [-nblignes] [fic1...]Pour voir les dernières lignes d'un fichier, on utilise la commande tail.
tail [+/-valeur[b/c]] [-f] [fic1...]Comme pour head, par défaut les dix dernières lignes sont affichées. La valeur -nblignes permet de modifier cet état. Préciser c indique un nombre de caractères. Un b indique un nombre de blocs (512 octets par bloc).
Un + inverse l'ordre de la commande, et devient un head (tail +10 <=> head -n 10).
Enfin l'option -f laisse le fichier ouvert. Ainsi si le fichier continue d'être rempli (par exemple un fichier trace), son contenu s''affichera en continu sur l'écran jusqu'à interruption volontaire de l'utilisateur (ctrl+C).
$ tail -5 listeNous aurons l'occasion de voir l'effet de la commande tail -f plus tard lors de la programmation shell.
Dans certains cas, comme par exemple la génération de fichiers traces, il peut être nécessaire de devoir à la fois placer dans un fichier le résultat d'une commande et de filtrer ce même résultat avec une autre commande. On utilise pour cela la commande tee qui permet de dupliquer le flux de données. Elle lit le flux de données provenant d'une autre commande par le canal d'entrée, l'écrit dans un fichier et restitue ce flux à l'identique par le canal de sortie. Par défaut le fichier généré écrase l'ancien s'il existe.
tee [-a] nom_ficL'option -a signifie append. Dans ce cas le fichier n'est pas écrasé mais complété à la fin. Par exemple, on veut obtenir à la fois dans un fichier la liste des noms d'utilisateurs et afficher leur nombre sur écran.
$ cat /etc/passwd | cut -d: -f1 | tee users | wc -lLes deux commandes permettant de comparer le contenu de deux fichiers, ou d'un fichier et un flux sont les commandes diff et cmp.
La commande diff indique les modifications à apporter aux deux fichiers en entrée pour que leur contenu soit identique.
diff [-b] [-e] fic1 fic2L'option -b permet d'ignorer les espaces (blank), et l'option -e permet de générer un script ed (nous ne l'utiliserons pas). Cette commande renvoie trois types de messages :
Dans tous les cas, le signe "<" indique les lignes de fic1 concernées, et le signe ">" les lignes de fic2 concernées.
$ cat liste Produit objet prix quantitesLe fichier liste est l'original. Dans liste2, la deuxième ligne a été modifiée, une ligne écran à été ajoutée et les deux dernières lignes ont été supprimées.
$ diff liste liste2La commande cmp compare les fichiers caractère par caractère. Par défaut la commande s'arrête dès la première différence rencontrée et indique la position de l'erreur.
cmp [-l] [-s] fic1 fic2L'option -l détaille toutes les différences en trois colonnes. La première colonne représente le numéro de caractère, la deuxième la valeur octale ASCII du caractère concerné de fic1 et et troisième la valeur octale ASCII du caractère concerné de fic2.
L'option -s retourne uniquement le code d'erreur (non visible), nous verrons plus tard comment l'exploiter.
$ cmp liste liste2Ici sont regroupés quelques outils intéressants non abordés auparavant.
Un processus représente à la fois un programme en cours d'exécution et tout son environnement d'exécution (mémoire, état, identification, propriétaire, père ...). Voir les cours de Système d'exploitation.
Voici une liste des données d'identification d'un processus :
$ ls -R / > ls.txt 2>/dev/null &Quelques remarques sur l'utilisation du lancement en tâche de fond :
Lorsqu'un processus est en tâche de fond, il est possible de récupérer et d'attendre la fin de la dernière commande lancée en arrière-plan avec la commande wait [pid]. S'il s'agit d'une autre commande, alors il est important d'avoir noté le PID de celle-ci lorsqu'elle a été lancée.
Pour avoir plus d'informations, on peut utiliser l'option -f.
$ ps -fL'option -e donnes des informations sur tous les processus en cours.
$ ps -efEnfin l'option -l propose plus d'informations techniques.
$ ps -l| Colonne | Définition |
|---|---|
| UID | User ID, nom de l'utilisateur |
| PID | Process ID, numéro du processus |
| PPID | Parent Process ID, numéro du processus père |
| C | Facteur de priorité, plus la valeur est grande plus la priorité est élevée |
| STIME | Heure de lancement du processus |
| TTY | Nom du terminal depuis lequel le processu a été lancé. |
| TIME | Durée de traitement du processus |
| CMD | Commande exécutée |
| F | Drapeaux du processus (sort du cadre du cours) |
| S | Etat du processus S (sleeping) R (running) Z (zombie) |
| PRI | Priorité du processus |
| NI | Nice, incrément pour le scheduler |
Lorsqu'un processus tourne en tâche de fond il ne peux pas être arrêté par une quelconque combinaison de touches. Pour cela il faut employer la commande kill. Contrairement à ce que son nom semble indiquer, le rôle de cette commande n'est pas forcément de détruire ou de terminer un processus (récalcitrant ou non), mais d'envoyer des signaux aux processus.
kill [-l] -Num_signal PID [PID2...]Le signal est l'un des moyens de communication entre les processus. Lorsqu'on envoie un signal à un processus, celui-doit doit l'intercepter et réagir en fonction de celui-ci. Certains signaux peuvent être ignorés, d'autres non. Suivant les Unix on dispose d'un nombre plus ou moins important de signaux. Les signaux sont numérotés et nommés, mais attention si les noms sont généralement communs d'un Unix à l'autre, les numéros ne le sont pas forcément. L'option « -l » permet d'obtenir la liste des signaux.
Voici ceux qui nous concernent.
| Signal | Rôle |
|---|---|
| 1 (SIGHUP) | Hang Up, est envoyé par le père à tous ses enfants lorsqu'il se termine |
| 2 (SIGINT) | Interruption du processus demandé (touche suppr, Ctrl+C) |
| 3 (SIGQUIT) | Idem SIGINT mais génération d'un Core Dump (fichier de débuggage) |
| 9 (SIGKILL) | Signal ne pouvant être ignoré, force le processus à finir 'brutalement'. |
| 15 (SIGTERM) | Signal envoyé par défaut par la commande kill. Demande au processus de se terminer normalement. |
Quand le shell est quitté (exit, ctrl+D, ...) nous avons vu que le signal 1 SIGHUP est envoyé aux enfants pour qu'ils se terminent aussi. Lorsqu'un traitement long est lancé en tâche de fond et que l'utilisateur veut quitter le shell, ce traitement sera alors arrêté et il faudra tout recommencer. Le moyen d'éviter cela est de lancer le traitement (processus) avec la commande nohup. Dans ce cas le processus lancé ne réagira plus au signal SIGHUP, et donc le shell peut être quitté, la commande continuera sont exécution.
Par défaut avec nohup (sous sh bash et ksh) les canaux de sortie et d'erreur standards sont redirigés vers un fichier nohup.out, sauf si la redirection est explicitement précisée.
$ nohup ls -lR / &La commande nice permet de lancer une commande avec une priorité pus faible, afin de permettre éventuellement à d'autres processus de tourner plus rapidement.
nice [-valeur] commande [arguments]Les deux syntaxes sont généralement admises, à vérifier par man. La valeur représenta la priorité du traitement. Pour la seconde syntaxe une valeur positive causera une baisse de priorité, une négative l'augmentation de la priorité (si autorisé). La première syntaxe n'accepte qu'un abaissement de la priorité. La valeur doit être comprise entre 1 et 20. Plus la valeur est élevée et plus le traitement est ralenti.
$ nice -10 ls -lR / >liste 2>/dev/null&La commande renice fonctionne un peu comme nice sauf qu'elle permet de modifier la priorité en fonction d'un utilisateur, d'un groupe ou d'un PID. La commande doit donc déjà tourner.
renice [-n prio] [-p] [-g] [-u] IDLa priorité doit être comprise entre -20 et 20. L'utilisateur standard ne peut utiliser que les valeurs entre 0 et 20 permettant de baisser la priorité. L'option -p précise un PID, -g un GID et -u un UID.
La commande time mesure les durées d'exécution d'une commande, idéal pour connaître les temps de traitement, et retourne trois valeurs :
Le résultat est sorti par le canal d'erreur standard 2. On peut avoir une indication de la charge de la machine par le calcul Real / (User+System). Si le résultat est inférieur à 10, la machine dispose de bonnes performances, au-delà de 20 la charge de la machine est trop lourdes (performances basses).
$ time ls -lR /homeIl est possible d'établir des droits d'accès étendus à l'exécution d'une commande. Ces droits d'accès étendus appliqués à une commande permettent à cette commande de s'exécuter avec les droits du propriétaire ou du groupe d'appartenance de la commande, et non plus avec les droits de l'utilisateur l'ayant lancé.
L'exemple le plus simple est le programme passwd permettant de changer son mot de passe. Si la commande était exécutée avec les droits d'un utilisateur classique, passwd ne pourrait pas ouvrir et modifier les fichiers /etc/passwd et /etc/shadow :
$ ls -l /etc/passwdNous voyons que ce fichier appartient à root, et que seul root peut y écrire. Un utilisateur simple ne peut lire que son contenu sans interagir. La commande passwd ne devrait donc pas pourvoir modifier les fichiers. Voyons la commande passwd (/bin/passwd ou /usr/bin/passwd) :
$ ls -l /usr/bin/passwdUn nouveau droit est apparu : le droit « s » pour les droits de le l'utilisateur root. Ce nouvel attribut permet l'exécution de la commande avec des droits d'accès étendus. Le temps du traitement, le programme est exécuté avec les droits du propriétaire du fichier ou de son groupe d'appartenance. Dans le cas de passwd, il est lancé avec les droits de root le temps de son traitement.
Le droit « s » sur l'utilisateur est appelé le SUID-Bit (Set User ID Bit), et sur le groupe le GUID-Bit (Set Group ID Bit)
La commande chmod permet de placer les SUID-Bit et GUID-Bit.
chmod u+s commandeLes valeurs octales sont 4000 pour le SUID-Bit et 2000 pour le GUID-Bit.
chmod 4755 commandeSeul le propriétaire ou l'administrateur peut positionner ce droit. Positionner le SUID-bit ou le SGID-Bit n'a de sens que si les droits d'exécution ont préalablement été établis (attribut x sur le propriétaire ou le groupe). Si ceux-ci ne sont pas présents; le « s » est remplacé par un « S ».
Dans les données d'identification du processus nous avons vu la présence UID et de GID réels et effectifs. Quand une commande est lancée avec un SUID-Bit ou un SGID-Bit positionné, les droits se trouvent modifiés. Le système conserve les UID et GID d'origine de l'utilisateur ayant lancé la commande (UID et GID réels) transmis par le père, les numéros UID et GID effectifs étant ceux du propriétaire ou du groupe d'appartenance du programme.
Ex : toto (UID=100, GID=100) lance passwd, appartenant à root (UID=1, GID=2) avec le SUID-Bit positionné.
réel : 100Si le SGID-Bit était positionné seul :
UID réel : 100Il est à noter que les SUID-Bit et SGID-bit ne sont pas transmis aux enfants d'un processus. Dans ce cas les enfants seront exécutés avec les droits de l'utlisateur ayant lancé la commande de base.
Le Sticky-bit (bit collant) permet d'affecter une protection contre l'effacement du contenu d'un répertoire.
Imaginons un répertoire /tmp où tous les utilisateurs ont le droit de lire et d'écrire des fichiers.
$ ls -ld /tmpDans ce répertoire tout le monde peut supprimer des fichiers y compris ceux qui ne lui appartiennent pas (droit w présent partout et pour tous). Si l'utilisateur toto crée un fichier, l'utilisateur titi peut le supprimer même s'il ne lui appartient pas.
Le Sticky-Bit appliqué à un répertoire, ici /tmp, empêche cette manipulation. Si le fichier peut encore être visualisé et modifié, seul son propriétaire (et l'administrateur) pourra le supprimer.
$ chmod u+t /tmpEn octal, on utilisera la valeur 1000 (chmod 1777 /tmp)
Bien qu'appliqué à l'utilisateur, le Sticky-bit, représenté par un « t » apparaît au niveau de « others ».
La commande find permet de rechercher des fichiers au sein de l'arborescence du système de fichiers, à l'aide de critères et la possibilité d'agir sur les résultats retournés.
find repertoires critères optionsLa commande find étant récursive, il suffit d'indiquer un répertoire de base pour que toute l'arborescence depuis ce répertoire soit développée. L'option de base est -print (souvent implicite sur la plupart des Unix) qui permet d'afficher sur écran les résultats.
$ find . -printLe chemin précisé étant relatif, l'affichage est relatif. Si le chemin précisé était l'absolu, l'affichage aurait été absolu.
Les options permettent de définir les critères de recherche. Elles peuvent être combinées et groupées entre elles, sous forme et ET et de OU logiques.
L'option -name permet une sélection par noms de fichiers. Il est possible d'utiliser les critères de recherches (caractères spéciaux) déjà vus. Le critère est idéalement placé en guillemets. Avec -iname, on n'effectue pas de différences entre les minuscules et les majuscules.
$ find . name "fic*" -printL'option -type permet une sélection par type de fichier. Nous avons vu au début du cours qu'outre les exécutables, liens, répertoires et fichiers simples étaient présent d'autres types de fichiers.
| Code fichier | Type de fichier |
|---|---|
| b | Fichier spécial en mode bloc |
| c | Fichier spécial en mode caractère |
| d | Répertoire (directory) |
| f | fichier normal |
| l | lien symbolique |
| p | tube nommé (pipe) |
| s | Socket (sur certains Unix) |
Les options -user et -group permettent une recherche sur le propriétaire et le groupe d'appartenance des fichiers. Il est possible de préciser le nom (utilisateur, groupe) ou l'ID (UID, GID). On peut aussi préciser -uid et -gid avec les numéros UID et GID.
$ find . -type f -user oracle -group dba -printL'option -size permet de préciser la taille des fichiers recherchés.
L'option -empty recherche des fichiers ou répertoires vides, c'est à dire de taille nulle.
Ces trois options ne travaillent qu'avec des jours (périodes de 24 heures). 0 est le jour même, 1 24 heures, 2 48 heures, ...
Les signes + ou – permettent de préciser les termes « de plus » et « de moins » :
L'option -newer permet de rechercher des fichiers plus récemment modifiés que celui i