Pour terminer ce petit cours d'Unix, nous allons décrire quelques-unes des autres commandes d'Unix parmi les plus utiles. Elles sont utilisées moins souvent que les commandes vues précédemment, mais vous apprendrez certainement très vite à vous en servir, car elles sont très pratiques.
La commande pour créer un lien est ln. Cette commande utilise la syntaxe suivante :
ln [-s] source lienoù source est le nom du fichier ou du répertoire source auquel le lien doit se référer, et lien est le nom du lien. L'option
-s
permet de créer un lien
symbolique. Par défaut, ce sont des liens physiques qui sont créés. Rappelons qu'il est impossible
de créer des liens physiques sur des répertoires.
Lorsqu'on liste des fichiers, on peut demander l'affichage
d'informations complémentaires sur les liens. Pour cela, il suffit d'utiliser l'option -l
de la commande ls. Ainsi, la commande suivante :
La suppression des liens se fait exactement comme celle d'un fichier. La destination n'est pas affectée en général, sauf si le lien est un lien physique et constitue la dernière référence au fichier pointé par le lien.
Les liens symboliques n'ont pas de droits d'accès ni de propriétaires, les informations de sécurité de la cible sont utilisées lorsqu'on accède au lien.
Il vous sera sans doute nécessaire de rechercher des fichiers selon un critère donné dans toute une arborescence de répertoires. Pour cela, vous utiliserez la commande find. Cette commande est très puissante, mais dispose d'une syntaxe assez compliquée :
find répertoire -name nom -printoù répertoire est le répertoire à partir duquel la recherche doit commencer et nom est le nom du fichier à rechercher. Ce nom peut contenir des caractères génériques du shell, mais dans ce cas doit être placé entre guillemets afin d'éviter que ce dernier ne les interprète.
find accepte d'autres options de recherche que le nom (partie « -name » de la ligne de commande), et peut effectuer d'autres actions que l'affichage du chemin des fichiers trouvés (partie « -print »). Consultez les pages de manuel pour plus d'informations à ce sujet.
La recherche d'une chaîne de caractères dans un ou plusieurs fichiers peut se faire à l'aide de la commande grep. Cette commande prend en premier paramètre le texte à rechercher, puis la liste des fichiers dans lequel ce texte doit être trouvé :
grep texte fichiers
Le texte peut être placé entre guillemets si nécessaire (en particulier, s'il contient des espaces ou des caractères interprétés par le shell, comme * et ?). grep accepte un grand nombre d'options, qui ne seront pas décrites ici. Consulter les pages de manuel pour plus d'information à ce sujet.
Le remplacement de texte dans un fichier peut être effectué de manière automatique, c'est-à-dire sans avoir à ouvrir le fichier dans un éditeur, grâce à la commande sed (abréviation de l'anglais « Stream Editor »). Cette commande est en fait un utilitaire de manipulation de flux de données, qui permet d'effectuer des traitements plus généraux que le simple remplacement de texte, mais c'est malgré tout pour cette opération qu'elle reste la plus utilisée.
sed peut travailler à la volée sur un flux de données
textuelles, que ce flux provienne de l'entrée standard ou d'un fichier. Par défaut, il écrit le résultat
de son travail sur le flux de sortie standard. Les opérations qu'il doit effectuer sur le flux
de données peuvent être spécifiées de différentes manières, soit en fournissant un fichier script
à l'aide de l'option -f
, soit directement sur la ligne de commande, avec l'option
-e
. La syntaxe utilisée pour appeler sed est donc typiquement
la suivante :
sed -e "commandes" fichier > résultatou :
sed -f script fichier > résultatoù fichier est le fichier sur lequel sed doit travailler, et résultat est le fichier devant recevoir le flux de données modifiées. Notez que cette commande utilise une redirection du flux de sortie standard dans un fichier. Ce type de redirection sera décrit en détail dans la Section 5.9.2.
sed peut effectuer un grand nombre de commandes différentes et est réellement un outil très puissant. Cependant, nous ne verrons ici que la commande qui permet d'effectuer un remplacement de texte. Cette commande utilise la syntaxe suivante :
s/texte/remplacement/optionsoù texte est le texte à rechercher, remplacement est le texte de remplacement, et options est un jeu d'options exprimant la manière dont le remplacement doit être fait. Les options sont spécifiées à l'aide de simple caractères, les plus utiles étant sans doute
g
, qui permet d'effectuer un remplacement global (au lieu
de ne remplacer que la première occurrence du texte rencontrée dans chaque ligne), et I
,
qui permet d'effectuer une recherche sans tenir compte de la casse des caractères.
Par exemple, la ligne de commande suivante :
permet de remplacer toutes les occurrences de la chaîne de caractères « bonjour » par la chaîne de caractères « bonsoir » dans le texte du fichier test.txt, et d'enregistrer le résultat dans le fichier modif.txt.Note : Il ne faut pas utiliser le même nom de fichier pour le fichier source et le fichier de résultat. En effet, sed lit le fichier source à la volée, et effectuer une redirection sur ce fichier pendant son traitement provoquerait la perte irrémédiable de son contenu. Pour résoudre ce problème, on pourra utiliser un nom de fichier temporaire, et écraser le fichier original par ce fichier une fois la commande sed exécutée.
Linux fournit un grand nombre de programmes de compression de fichiers. Le meilleur est sans doute bzip2, et le plus compatible sans doute compress. Cependant, le plus utilisé et le plus courant, surtout pour la distribution des sources, reste incontestablement gzip. Nous allons décrire brièvement comment compresser et décompresser des fichiers avec gzip et bzip2 dans ce paragraphe.
La compression d'un fichier se fait de manière élémentaire :
gzip fichieroù fichier est le fichier à compresser. Après avoir effectué son travail, gzip renomme le fichier compressé en « fichier.gz ». La compression d'un fichier avec bzip2 utilise exactement la même syntaxe, à ceci près qu'il faut remplacer gzip par bzip2. De plus, le nom du fichier compressé porte l'extension .bz2 au lieu de .gz. Le fichier obtenu est donc nommé « fichier.bz2 ».
La décompression d'un fichier se fait à l'aide de la commande suivante :
gunzip fichier.gzou
bunzip2 fichier.bz2selon qu'il a été compressé avec gzip ou bzip2. Après décompression, l'extension complémentaire .gz ou .bz2 est supprimée du nom de fichier.
L'archivage de fichiers se fait classiquement sous Unix avec le programme tar (abréviation de l'anglais « Tape ARchiver »). Ce programme permet simplement de regrouper tous les fichiers qu'il doit archiver dans un seul fichier structuré en blocs. Il a été initialement écrit pour permettre des archivages sur bandes ou sur tout autre périphérique de stockage de masse, mais il est également utilisé pour créer des fichiers archives contenant toute une arborescence.
La syntaxe de tar est très simple :
tar options archive [fichiers]où options sont les options qui indiquent l'opération à effectuer et comment elle doit être réalisée, archive est le nom de l'archive qui doit être créée ou le nom du fichier de périphérique du périphérique d'archivage, et fichiers est la liste des fichiers à archiver.
Les options de tar que vous utiliserez le plus souvent sont les suivantes :
cvf
pour créer une archive ;
tvf
pour lister le contenu
d'une archive ;
xvf
pour restaurer le contenu
d'une archive.
Par exemple, pour archiver le contenu du répertoire courant dans le fichier archive.tar, vous utiliserez la ligne de commande suivante :
De plus, pour extraire le contenu de l'archive archive.tar, vous utiliserez la commande suivante :
Note : L'option
z
permet d'effectuer une compression des données archivées ou une décompression des données restaurées à la volée. tar utilise gzip et gunzip pour la compression et la décompression. De même, l'optionj
permet de compresser l'archive à la volée avec bzip2.Si l'on utilise un signe négatif ('-') à la place du nom de l'archive, tar enverra le résultat de la compression vers la sortie standard. Cela peut être utilisé pour des opérations avancées. Un exemple sera donné dans la Section 5.9.2.
Si vous êtes prudent, vous avez sans doute créé un compte utilisateur juste après avoir installé votre système de base, et vous ne travaillez plus que dans ce compte. Cette technique est prudente, cependant, elle pose un problème évident : vous ne pouvez pas y faire votre travail d'administrateur. C'est pour cela que la commande su a été créée. Cette commande permet de changer son identité dans le système :
su [utilisateur]où utilisateur est l'utilisateur dont on veut prendre l'identité. Par défaut, si aucun utilisateur n'est spécifié, le changement d'identité se fait vers l'utilisateur root. Bien entendu, il va de soi que la commande su demande le mot de passe avant d'obtempérer...
Les mécanismes de droits d'accès ont déjà été décrits en détail ci-dessus dans le chapitre concernant les notions générales sur Unix. Il peut être judicieux de relire ce chapitre afin de comprendre les effets des commandes présentées dans cette section.
Le changement de propriétaire d'un fichier ne peut être réalisé que par l'administrateur du système. Cette opération se fait à l'aide de la commande suivante :
chown utilisateur fichieroù utilisateur est le nom de l'utilisateur qui doit devenir propriétaire du fichier, et fichier est le fichier devant changer de propriétaire.
Le changement de groupe peut être réalisé par n'importe quel utilisateur, mais on ne peut donner un fichier qu'à l'un des groupes dont on est membre. Cette opération se fait à l'aide de la commande suivante :
chgrp groupe fichieroù groupe est le nom du groupe qui doit être affecté au fichier, et fichier est le fichier devant changer de groupe. Bien entendu, l'administrateur peut affecter un fichier à n'importe quel groupe d'utilisateur.
La commande permettant de changer les droits d'un fichier ou d'un répertoire est la suivante :
chmod droits fichieroù fichier est le fichier ou le répertoire dont on désire changer les droits, et droits est une chaîne de caractères permettant de spécifier les nouveaux droits. Cette chaîne commence par une lettre indiquant le groupe d'utilisateurs auquel le droit doit être appliqué, d'un caractère + ou - indiquant si le droit doit être ajouté ou supprimé, et d'une lettre indiquant le droit que l'on est en train de manipuler. La première lettre peut prendre les valeurs suivantes :
u pour le champ « utilisateur », c'est-à-dire le propriétaire du fichier ;
g pour le champ « groupe », c'est-à-dire tous les utilisateurs faisant partie du groupe du fichier ;
o pour le champ « other », c'est-à-dire pour tous les utilisateurs qui ne sont ni propriétaires, ni membres du groupe du fichier ;
a pour tous les champs sans distinction, donc pour tous les utilisateurs.
Les droits sont identifiés par l'un des caractères suivants :
r pour le droit de lecture ;
w pour le droit d'écriture ;
x pour le droit d'exécution ;
s pour les bits setuid et setguid ;
t pour le bit sticky.
Ainsi, la commande suivante :
permet de donner le droit d'écriture sur le fichier exemple à tous les membres du groupe auquel ce fichier appartient.Si l'on veut donner des droits à un utilisateur ou un groupe particulier, on pourra définir une ACL (« Access Control List ») sur le fichier ou le répertoire, et affecter les droits unitairement. Ceci se fait simplement avec la commande setfacl, de la manière suivante :
setfacl -m ACL fichieroù ACL est l'ACL à affecter au fichier ou au répertoire fichier. Les ACLs sont constitués d'une liste d'entrées nommées des ACE (« Access Control Entries »). Les ACEs sont séparées par des virgules et définissent chacune un droit. Chacun de ces droits doit être spécifié de manière complète, en précisant la classe d'utilisateur sur lequel il porte avec un mot-clé (user pour l'utilisateur propriétaire, group pour les utilisateurs du groupe propriétaire, ou other pour les autres utilisateurs), le nom de l'utilisateur ou du groupe si nécessaire, et les droits affectés à cet utilisateur ou à ce groupe. Tous ces paramètres doivent être séparés par deux points (caractère ':'). Par exemple, pour ajouter les droits d'écriture à l'utilisateur alfred sur le fichier exemple, vous pourrez utiliser la commande suivante :
Si l'on ne spécifie aucun utilisateur avec la classe d'utilisateurs user dans une entrée, cette entrée se réfère automatiquement à l'utilisateur propriétaire du fichier ou du répertoire. De même, si l'on ne spécifie aucun groupe avec la classe d'utilisateurs group, l'entrée se réfère au groupe auquel le fichier appartient. Fixer ces entrées d'ACL sur un fichier avec ces deux syntaxes revient donc exactement à utiliser chmod avec les droits Unix classiques (à un détail près que l'on verra ci-dessous pour le groupe).
Les droits complets d'un fichier ou d'un répertoire peuvent être consultés avec la commande getfacl. Cette commande affiche en commentaire les informations sur l'objet auquel elle s'applique, à savoir son nom, son propriétaire et son groupe, à la suite d'un dièze (caractère '#'). Suivent toutes les ACEs affectées à cet objet. Les droits Unix classiques sont lisibles directement avec les entrées user::, group:: et other:: respectivement pour l'utilisateur, les utilisateurs du groupe et les autres utilisateurs. Par exemple, si l'on affiche les ACLs associées au fichier exemple après la commande précédente, on obtient ceci :
# file: exemple # owner: batman # group: users user::rw- user:alfred:-w- group::r-- mask::rw- other::r--
Dès qu'une ACL nominative a été attribuée à un fichier, une ACL spéciale est créée automatiquement. Il s'agit de l'ACL mask, qui, comme son nom l'indique, définit un masque de droits complémentaires pour tous les utilisateurs et les groupes ajoutés nominativement à l'ACL. Pour ces utilisateurs, les droits effectivement accordés sont leurs droits respectifs, restreints aux droits présent dans le masque. Le masque permet donc de restreindre les droits de tous les utilisateurs de la classe group, au sens large. Par exemple, si le masque contient les droits de lecture et d'écriture, et que l'utilisateur alfred dispose des droits de lecture et d'exécution sur le fichier, ses droits effectifs seront uniquement la lecture. Les droits effectifs sont indiqués en commentaire par getfacl pour les utilisateurs et les groupes s'ils ne sont pas égaux aux droits indiqués dans leurs entrées respectives.
Dès qu'il est défini, le masque remplace l'entrée du groupe du fichier pour les commandes classiques. Ainsi, dès qu'un masque est défini dans l'ACL d'un fichier, les changements de droits sur le groupe effectués avec la commande chmod ne modifient plus que le champ de masque. Cela peut surprendre dans certains situation. Par exemple, si l'entrée de l'ACL décrivant les droits du groupe du fichier ne donne aucun droit, les utilisateurs de ce groupe n'auront toujours aucun droit même après un chmod g+rwx sur le fichier. En effet, cette dernière commande ne modifie que le masque. Il est donc nécessaire d'ajouter les droits sur le groupe du fichier explicitement avec setfacl, de la manière suivante :
La première commande modifie les droits sur le masque, et la deuxième ajoute les droits pour tous les utilisateurs du groupe.
Notez bien que le masque ne s'applique pas pour la détermination
des droits du propriétaire et des utilisateurs de la classe other. Par ailleurs,
lorsque l'on affiche les droits étendus d'un fichier avec l'option -l
de la commande
ls, les droits affichés pour le groupe du fichier sont les droits définis
dans le masque lui-même (même si aucune entrée d'ACL ne donne complètement ces droits à un utilisateur
ou à un groupe). Cela permet donc de voir directement les droits les plus forts qui
pourraient être attribués sur ce fichier, ce qui est cohérent avec ce qu'attendent
les outils Unix classiques.
Il est possible de supprimer toutes les entrées de l'ACL
d'un fichier avec l'option -b
de setfacl. Pour supprimer une entrée
spécifique de l'ACL, vous devrez utiliser l'option -x
. Cette dernière option ne permet pas
de supprimer les entrées génériques pour le propriétaire et le groupe du fichier, ni celles des autres
utilisateurs. Par exemple, pour retirer toutes les entrées définies précédemment sur le fichier
exemple, on utilisera la commande suivante :
Les répertoires disposent, en plus de leur ACL normale, d'une ACL
par défaut. L'ACL par défaut d'un répertoire est celle qui est appliquée à tout nouveau fichier ou répertoire
créés dans ce répertoire. De plus, les sous-répertoires héritent de l'ACL par défaut de leur parent.
Les ACLs par défaut sont modifiables avec l'option -d
de setfacl
et sont affichées avec le préfixe default: par getfacl.
Note : Notez bien que de nombreux outils Unix classiques ne gèrent pas correctement la notion d'ACL (en particulier les gestionnaires de fichiers graphiques). La copie ou la modification d'un fichier peut donc provoquer la perte de son ACL, modifiant ainsi les droits des utilisateurs sur ce fichier. Les ACLs doivent donc être utilisées avec parcimonie et leur manipulation entourée du plus grand soin.
Précédent | Sommaire | Suivant |
Opérations de base sur les fichiers | Niveau supérieur | vi, l'éditeur de fichiers de base |