Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ceci est une ancienne révision du document !
Je propose d'aborder les concepts de droits unix et de type de fichier en prenant exemple sur la sortie de la commande :
ls -l
Ceci permettra d'aborder les droits sur les fichiers, les notions de propriétaires et de groupe et les divers type de fichiers qui existent sur un système de fichier linux (ext2/ext3/ext4). La plupart de ces notions sont aussi vraies pour d'autres systèmes de fichiers unix, bien sûr ;)
Donc je vais d'abord exposer ces notions essentielles, et ensuite on va revenir sur des exemples pour entériner tout cela.
Faisons :
ls -l ~/.bashrc
-rw-r--r-- 1 enicar enicar 1436 avril 23 2014 /home/enicar/.bashrc
Donc nous allons décoder tout cela, en exposant quelques notions, puis nous reviendrons sur des exemples pratiques. Nous avons, de la gauche vers la droite :
champ | signification |
---|---|
-rw-r–r– | Type de fichier, et permissions (c'est à dire droits) |
1 | Le nombre de liens (Liens et inodes) |
enicar | Le propriétaire du fichier (Propriétaire et groupe) |
enicar | Le groupe à qui appartient le fichier (Propriétaire et groupe) |
1436 | La taille du fichier en octets |
avril 23 2014 | La date de dernière modification |
/home/enicar/.bashrc | Le nom du fichier |
Détaillons, le champ :
-rw-r--r--
Il est composé de 4 sous champs. De la gauche vers la droite :
Dans un système de fichier de type unix, il existe plusieurs types de fichiers. La commande « ls -l » utilise un caractère pour nous informer sur ce type :
Code | Type de fichier |
---|---|
- | Fichier normal |
d | Répertoire (directory) |
l | Lien symbolique (symbolic link) |
p | Tube nommé (pipe) |
s | Socket unix |
b | Périphérique avec accès de type bloc |
c | Périphérique avec accès de type caractère |
Les permissions sont stockés dans le premier inode (au moins) du fichier sous la forme d'un entier. Cet entier un vecteur de bits. C'est à dire que chaque bit de cet entier à une signification soit le propriétaire, soit pour le groupe soit pour les autres pour un droit en lecture, en écriture ou en exécution. C'est pour cela que je parlerai, par exemple, du bit de lecture pour le propriétaire.
Le champ des permissions est organisé en trois groupes qui correspondent aux permissions pour le propriétaire, pour le groupe et pour les autres. Pour chacun de ces groupes, trois attributs peuvent être positionné ou non.
La signification pour les trois groupe des attributs « rwx » est :
Code | Signification |
---|---|
r | Accès en lecture autorisé |
w | Accès en écriture autorisé |
x | Droits d'exécution ou droit de faire un « cd » |
- | L'attribut n'est pas positionné |
Quelques exemples éclaircirons les choses :
Code | Signification |
---|---|
rwx | Les droits en lecture, en écriture et en exécution sont positionnés |
— | Aucun droit |
r– | Droit en lecture uniquement |
r-x | Droit en lecture et en exécution |
À la place du x dans le champ rwx du propriétaire ou du groupe nous pouvons avoir :
Code | signification |
---|---|
S | Le bit setuid ou setgid est positionné, mais pas le droit en exécution |
s | Le bit setuid ou setgid est positionné ainsi que le droit en exécution |
On parle de setuid pour c'est l'attribut du propriétaire qui est positionné, et de setgid quand c'est l'attribut du groupe.
Par exemple :
ls -l /bin/su
-rwsr-xr-x 1 root root 38868 nov. 19 22:03 /bin/su
Ici, nous voyons que la commande « su » a son bit setuid positionné.
Pour terminer avec les droits, le champ « rwx » des autres (c'est à dire ceux qui ne sont ni le propriétaire, ni le groupe) peut prendre deux autres formes. À la place du x nous pouvons avoir.
code | Signification pour les répertoires |
---|---|
T | Dans ce répertoire seul les propriétaires des fichiers peuvent supprimer ces fichiers. Le bit en exécution pour les autres n'est pas positionné |
t | Même chose que précédemment, mais le bit en exécution pour les autres est positionné |
Dans linux, ce bit t n'est utilisé que pour les répertoires. Il est utilisé notamment pour les répertoires temporaires, par exemple :
ls -ld /tmp
drwxrwxrwt 9 root root 8192 mars 20 20:25 /tmp
Nous voyons bien que le bit t est positionné.
Dans un système unix chaque fichier appartient à un utilisateur (que l'on appelle son propriétaire) et à un groupe. Chaque utilisateur fait aussi partie d'un groupe au moins (Voyez ce qu'affiche la commande « groups » pour votre utilisateur). La plupart du temps un fichier appartient à un groupe dont fait partie le propriétaire du fichier, mais ce n'est pas obligatoire. Aussi, il faut bien noter que le propriétaire et le groupe, même s'ils se nomment de la même façon, sont deux choses différentes.
Les groupes sont souvent utilisés pour gérer les droits plus finement ou pour réunir un ensemble d'utilisateur sur les systèmes qui sont vraiment utilisés par plusieurs personnes.
Par défaut « ls -l » affiche la taille en octets. On peut obtenir un affichage plus parlant avec l'option « -h » (comme human readable, c'est à dire lisible pour un humain):
ls -lh ~/.bashrc
-rw-r--r-- 1 enicar enicar 1,5K avril 23 2014 /home/enicar/.bashrc
Nous obtenons la taille en kébi octets, dans ce cas mais pour des fichiers faisant plusieurs méga octets, « ls -lh » nous donnera la taille en mébi octets. C'est très pratique pour se faire une idée de la taille d'un fichier.
Par défaut « ls -l » affiche la date de dernière modification. Chaque fichiers, possèdent plusieurs horodatages. Il en existe 3 :
J'ai écrit entre parenthèses l’abréviation qui est employé pour chacune. On peut afficher ces trois dates à l'aide de la commande « stat » :
stat ~/.bashrc
Fichier : « /home/enicar/.bashrc » Taille : 1436 Blocs : 8 Blocs d'E/S : 4096 fichier Périphérique : fe05h/65029d Inœud : 6293947 Liens : 1 Accès : (0644/-rw-r--r--) UID : ( 1000/ enicar) GID : ( 1000/ enicar) Accès : 2015-03-19 22:10:12.848911153 +0100 Modif. : 2014-04-23 10:24:33.099434481 +0200 Changt : 2014-04-23 10:24:33.133434850 +0200 Créé : -
On voit les trois différentes dates. La date de dernière modification est changée lorsqu'on modifie les données du fichier. La date de dernier changement indique la date dernier changement des méta données concernant le fichier (c'est à dire, les informations, comme sa taille, son propriétaire, son groupe, ses droits, son nombre de liens,…). La date de dernier accès est changé lors d'un accès en lecture et aussi quand l'une des dates de modification ou de changement est changée.
On peut obtenir les dates de derniers accès et de dernier changement avec « ls -l ». Une option longue de la forme « –time=mode » permet de choisir quelle date affichée. Des options courtes sont aussi disponibles :
mode | option courte | affichage |
---|---|---|
atime, access ou use | -u | date de dernier accès |
ctime ou status | -c | date de dernier changement |
Nous avons ici :
/home/enicar/.bashrc
ls n'affiche pas le nom des fichiers avec le chemin en entier. C'est le shell qui a substitué le « ~ » en « /home/enicar ». La même chose se passe quand on utilise un méta caractère du shell comme « * ». Pour vous en convaincre, comparez les sorties des deux commandes :
ls * echo *
Nous voyons que ls met en forme la sortie alors que echo fait juste un… écho !
Les données d'un fichier sont écrites sur le disque sous forme de blocs. L'information où se trouve ces blocs, est contenu dans un ensemble d'inodes (sous forme de numéro de bloc).
Cet ensemble d'inodes a un premier inode qui sert à référencer le fichier. Un répertoire fait correspondre un chemin (le nom du fichier) avec ce premier inode. De cet façon on peut avoir plusieurs noms pour le même fichier. Ces différents noms pointent sur le même premier inode.
Le nombre d'inodes utilisés par un fichier dépend évidemment de sa taille. Un seul inode ne suffit pas pour donner la liste de blocs, sauf pour les petits fichiers.
Le premier inode contient aussi les métadonnées associées au fichier. C'est à dire, sa taille, son propriétaire, son groupe, les dates de derniers changements, accès et modification, le nombre de lien et les permissions.
Supposons à présent, que l'on est deux noms de fichiers qui pointent sur le même inode. Donc, les données des « deux fichiers » sur le disque sont au même endroit. Et donc ils ont exactement les mêmes données. Leur métadonnées contenues dans le premier inode sont les mêmes également. On voit bien que les deux fichiers sont indiscernables.
À SUIVRE…