Navigation rapide : Lundi / Mardi / Mercredi / Jeudi / Vendredi
L'objectif ici est d'utiliser les outils grep, join, cut et tr pour afficher, pour chaque utilisateur du système ayant /bin/bash comme shell, une ligne avec son login, son numéro d'utilisateur, son numéro de groupe, son nom complet, et son mot de passe chiffré.
La commande grep permet de sélectionner les lignes (terminées par un retour chariot) d'un fichier texte ou d'un flux de texte reçu sur son entrée standard. La sélection se fait via une expression régulière passée en argument. Utilisez grep pour ne retenir que les utilisateurs ayant /bin/bash comme shell dans le fichier /etc/passwd.
1: grep ':/bin/bash' /etc/passwd
La commande join opère une jointure entre les lignes de deux fichiers textes distincts partageant un même identifiant (clé). La seule contrainte imposée par la commande est que les lignes des deux fichiers soient triées de façon croissante selon l'identifiant. Pour cela nous allons utiliser la commande sort.
Regardons comment se présente une ligne du fichier /etc/passwd
bin:x:2:2:bin:/bin:/bin/sh
et du fichier /etc/shadow
bin:*:15250:0:99999:7:::
Sur chaque ligne, les différents champs d'informations sont séparés par le caractère : et c'est le nom de login qui identifie la ligne dans les deux cas (1er champ). Commencez par trier les deux fichiers (en plaçant le résultat dans un fichier temporaire) avec la commande sort. L'option -t vous permet d'indiquer le caractère de séparation des champs, et l'option -k le numéro du champ contenant la clé de tri.
1: sort /etc/passwd -t : -k 1 > passwd.sorted 2: sort /etc/shadow -t : -k 1 > shadow.sorted
Nous pouvons maintenant utiliser la commande join pour réunir les informations contenus dans /etc/passwd et /etc/shadow. En plus des options détaillées ci-dessous, la commande prend deux arguments sur sa ligne de commande représentant les deux fichiers à traiter. Le résultat sera affiché sur la sortie standard.
join [ options ] <file1> <file2>
Les options de la commande join sont les suivantes :
A partir des fichiers passwd.sorted et shadow.sorted générés précédemment, utiliser la commande join pour réunir les lignes en fonction du login (1er champ de chaque fichier).
1: join -t : -1 1 -2 1 passwd.sorted shadow.sorted
Combiner maintenant cela avec la commande grep précédente pour ne retenir que les lignes pour lesquelles le shell bash (/bin/bash) est utilisé.
1: join -t : -1 1 -2 1 passwd.sorted shadow.sorted | grep '/bin/bash'
Toujours dans le cas de fichiers textes où l'information est structurée en lignes avec plusieurs champs séparés par un caractère (: , espace), la commande cut permet de sélectionner certains champs. Ses options sont les suivantes :
Par exemple, la commande ci-dessous affiche le login (champ n°1) et le nom complet (champ n°5) des utilisateurs du fichier /etc/passwd.
cut -d ':' -f 1,5 /etc/passwd
Utilisez la commande cut pour n'afficher que les champs login, numéro d'utilisateur, numéro de groupe et nom complet de chaque utilisateur.
1: cut -d ':' -f 1,3,4,5 /etc/passwd
Utilisez la commande cut pour n'afficher que le mot de passe chiffré des utilisateurs, à partir du fichier shadow.
1: cut -d ':' -f 2 /etc/shadow
Combiner cela avec les précédentes commandes (join et grep) pour n'afficher que les champs login, numéro d'utilisateur, numéro de groupe, nom complet et mot de passe chiffré de chaque utilisateur ayant /bin/bash comme shell.
1: join -t : -1 1 -2 1 passwd.sorted shadow.sorted| grep '/bin/bash' | cut -d ':' -f 1,3,4,8
La commande tr prend en paramètres deux options. Son action est de remplacer sur le flot de l'entrée standard le caractère spécifié en première option par celui spécifié en seconde option. Ainsi l'exemple ci-dessous remplace les : du fichier /etc/passwd par des #. Le résultat est affiché sur la sortie standard.
tr ':' '#' < /etc/passwd
Combiner la commande tr avec celle de l'exercice précédent pour remplacer les : (deux points) par des espaces.
1: join -t : -1 1 -2 1 passwd.sorted shadow.sorted| grep '/bin/bash' | cut -d ':' -f 1,3,4,8 | tr ':' ' '