Debutant

Fondamentaux Linux

Shell, permissions, utilisateurs, installation et boot : les fondations exigees par LPIC-1 101-500.

Module 1 Ligne de commande et shell : pipes, redirections, grep / sed / awk

1. Le shell, stdin / stdout / stderr

Le shell bash lit une ligne, l'execute, puis affiche le resultat. Chaque processus dispose de trois flux numerotes : 0 (stdin, le clavier ou un fichier), 1 (stdout, l'ecran), 2 (stderr, les erreurs). C'est la base des objectifs 101-500 sur l'utilisation du shell.

eleve@lpic1:~$ whoami
eleve
eleve@lpic1:~$ echo $SHELL
/bin/bash
eleve@lpic1:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Pourquoi c'est important : À 2h du matin, un serveur web est saturé et le responsable veut savoir en une minute quelles adresses IP martèlent les logs. Sans les tubes et les filtres, tu ouvres un fichier de 50 000 lignes à la main. Avec un seul pipeline, tu sors la réponse et tu sauves la production.
L'analogie qui aide : Pense à une chaîne d'usine : chaque commande est une machine posée sur le même tapis roulant. Le tube | est le tapis : la sortie brute entre d'un côté, elle ressort triée, filtrée et comptée de l'autre, sans stock intermédiaire.

2. Redirections : >, >>, <, 2>, pipe |

  • cmd > fichier : redirige stdout en ecrasant le fichier.
  • cmd >> fichier : redirige stdout en ajoutant a la fin.
  • cmd < fichier : alimente stdin depuis le fichier.
  • cmd 2> erreurs.log : redirige stderr. cmd > tout.log 2>&1 fusionne les deux flux.
  • cmd1 | cmd2 : le stdout de cmd1 devient le stdin de cmd2 (tube).
ls /srv > liste.txt
echo "fin du rapport" >> liste.txt
grep TODO /srv/projet.txt 2> erreurs.log
cat /srv/projet.txt | grep TODO | wc -l
cut -d: -f1 /etc/passwd | sort | uniq

3. grep, sed, awk : le trio gagnant

  • grep motif fichier : affiche les lignes qui contiennent le motif. Options examen : -i (casse), -n (numeros), -r (recursif), -v (inverse).
  • sed 's/ancien/nouveau/g' fichier : substitution par ligne. -i modifie le fichier sur place.
  • awk -F: '{print $1}' /etc/passwd : decoupe chaque ligne sur : et affiche le champ 1.
grep -rn "Failed" /var/log/
grep -iv "error" /var/log/syslog | head
sed 's/PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
awk -F: '{print $1 " -> " $7}' /etc/passwd
ps aux | grep sshd | grep -v grep
Démonstration pas à pas : grep "Failed" /var/log/auth.log | cut -d' ' -f11 | sort | uniq -c | sort -nr | head — ligne 1 grep ne garde que les échecs ; ligne 2 cut -d' ' -f11 extrait la colonne IP ; sort regroupe les doublons ; uniq -c les compte ; sort -nr classe les pires attaquants en tête ; head n'affiche que le top 10. Une ligne lue de gauche à droite raconte toute l'attaque.
Pièges classiques : > écrase le fichier alors que >> ajoute : un ls > rapport.log maladroit détruit un journal de production. 2>&1 n'a de sens que dans cet ordre. grep motif sans -r ignore les sous-dossiers. sed -i modifie sans retour : sauvegarde avant. En examen, awk '{print $1}' affiche le premier champ, pas toute la ligne ($0).
À vous de jouer : Comment compter les lignes contenant TODO dans /srv/projet.txt sans afficher les lignes elles-mêmes ?
Voir la réponse

grep TODO /srv/projet.txt | wc -l : grep filtre, wc -l compte. Variante stricte : grep -c TODO /srv/projet.txt.

Points d'examen (101-500) : distinguer > et >>, lire 2>&1, predire le resultat d'un pipeline cut | sort | uniq, options grep -rinv, syntaxe sed s///g et awk '{print $N}'.
1.1Flux stdin stdout stderr et codes retour ($?)
1.2Redirections et tubes : >, >>, <, 2>, |
1.3grep, sed, awk, sort, uniq, cut, wc
Module 2 Fichiers et permissions : chmod / chown, umask, ACL, sticky bit

1. Lire un droit : type + rwx x3

ls -l affiche par exemple -rwxr-x--- : le premier caractere est le type (- fichier, d dossier, l lien), puis trois triplets rwx (proprietaire, groupe, autres). En octal : r=4, w=2, x=1. Donc rwx=7, r-x=5, r--=4, ---=0.

ls -l /home/eleve
-rwxr-x--- 1 eleve eleve 120 Jan 12 08:00 notes.txt
# droit = 750 : proprietaire tout, groupe lecture+execution, autres rien
stat -c "%a %U %G %n" notes.txt
 750 eleve eleve notes.txt
Pourquoi c'est important : À 2h du matin, le site affiche une erreur 500 après un déploiement : quelqu'un a posé un chmod 777 sur tout le dossier. Le serveur refuse de démarrer pour protéger les clés. Savoir lire rwxr-x--- en trois secondes, c'est la différence entre un correctif de deux minutes et une nuit blanche.
L'analogie qui aide : Vois chaque fichier comme un bureau fermé à trois serrures : toi, ton équipe, et les visiteurs. r permet de lire le dossier, w de le modifier, x d'y entrer ou d'exécuter. Le sticky bit sur /tmp, c'est le casier commun : chacun y dépose, mais nul ne vide le casier du voisin.

2. chmod, chown, chgrp

chmod 755 script.sh      # rwxr-xr-x : script public
chmod 640 secret.txt     # rw-r----- : confidentiel
chmod u+x script.sh      # ajoute x au proprietaire (notation symbolique)
chmod g-w rapport.txt    # retire w au groupe
chmod -R 750 /srv        # recursif
chown alice:compta rapport.txt
chgrp compta rapport.txt
chown -R alice:alice /home/alice

3. umask : les droits a la creation

Le umask masque des droits : fichiers 666 - umask, dossiers 777 - umask. Avec umask 022 : fichiers 644, dossiers 755. Avec umask 027 : fichiers 640, dossiers 750.

umask        # affiche 0022
umask 027    # durcit les creations suivantes
touch nouveau.txt && ls -l nouveau.txt
# -rw-r-----  (640) : 666 - 027

4. Bits speciaux et ACL

  • SETUID (4) : le programme s'execute avec les droits de son proprietaire (chmod 4755, ex. /usr/bin/passwd).
  • SETGID (2) : execution avec les droits du groupe ; sur un dossier, les nouveaux fichiers heritent du groupe (chmod 2750 /srv/compta).
  • Sticky bit (1) : sur un dossier comme /tmp (1777), seul le proprietaire peut supprimer ses fichiers.
  • ACL : droits fins par utilisateur : getfacl lit, setfacl -m u:alice:rw fichier ajoute.
chmod 4755 /usr/bin/monoutil   # SETUID
chmod 2750 /srv/compta          # SETGID sur dossier
chmod 1777 /tmp                 # sticky bit
getfacl /srv/projet.txt
setfacl -m u:alice:rw /srv/projet.txt
ls -l  # un "+" final signale une ACL : -rw-rw-r--+
Démonstration pas à pas : stat -c "%a %U %G %n" notes.txt affiche 750 eleve eleve notes.txt7 = rwx pour le propriétaire qui fait tout ; 5 = r-x pour le groupe qui lit et traverse sans modifier ; 0 = rien pour les autres. ls -l confirme visuellement avec -rwxr-x--- : lis de gauche à droite, chaque triplet raconte un niveau d'accès.
Pièges classiques : chmod 777 et surtout chmod -R 777 / ouvrent tout le système et cassent SSH qui exige des clés en 600. chmod -R sur un dossier partagé applique aussi x aux fichiers : préfère le mode symbolique. umask 022 donne 644/755, umask 027 donne 640/750 : à l'examen, soustrais depuis 666 pour les fichiers et 777 pour les dossiers. Un s à la place du x signale SETUID ou SETGID.
À vous de jouer : Avec umask 027, quels droits obtient un fichier nouvellement créé ?
Voir la réponse

640 soit rw-r----- : 666 - 027 = 640. Le même umask donnerait 750 pour un dossier car la base est 777.

Points d'examen (101-500) : convertir rwxr-x--- en 750 et inversement, calculer un droit apres umask, role du sticky bit sur /tmp, reperer SETUID/SETGID dans ls -l (s a la place du x), commandes getfacl / setfacl.
2.1Lecture ls -l et conversion octale
2.2chmod chown chgrp et umask
2.3SETUID SETGID sticky bit et ACL
Module 3 Utilisateurs et groupes : passwd, shadow, sudo

1. Les quatre fichiers qui gouvernent les comptes

  • /etc/passwd (lisible par tous) : login:x:UID:GID:commentaire:home:shell. Le x signifie que le hash est dans shadow.
  • /etc/shadow (root seul, 640) : logins et mots de passe chiffres, dates d'expiration.
  • /etc/group : groupes et membres supplementaires (sudo:x:27:eleve).
  • /etc/sudoers (+ /etc/sudoers.d/) : qui peut faire quoi en sudo. Toujours editer avec visudo.
grep eleve /etc/passwd
eleve:x:1000:1000:Eleve:/home/eleve:/bin/bash
sudo -l -U eleve
id eleve
 uid=1000(eleve) gid=1000(eleve) groupes=1000(eleve),27(sudo)
Pourquoi c'est important : À 2h du matin, un prestataire parti depuis six mois se connecte encore au serveur parce que son compte n'a jamais été verrouillé. Un audit révèle ensuite des sudo ALL distribués à tout le monde. Gérer les comptes et sudo au scalpel, c'est fermer la porte avant l'intrusion, pas après.
L'analogie qui aide : /etc/passwd est le registre d'accueil de l'immeuble, /etc/shadow le coffre des clés que seul le gardien ouvre, /etc/group la liste des clubs, et sudoers le carnet qui dit exactement qui a le droit d'ouvrir la machinerie et pour quelle tâche.

2. Creer, modifier, verrouiller

sudo useradd -m -s /bin/bash alice   # -m cree /home/alice
sudo passwd alice                     # definit le mot de passe
sudo usermod -aG sudo alice           # ajoute au groupe sudo (-a indispensable !)
sudo groupadd compta
sudo usermod -g compta -d /home/alice alice
sudo passwd -l bob                    # verrouille (-u deverrouille, -e force le changement)
sudo userdel -r bob                   # supprime + son home

3. sudo sans piege

Regle : utilisateur machine=(cible) commandes. Exemple alice ALL=(ALL) ALL = tous droits partout. On restreint en production : deploiement ALL=(ALL) /usr/bin/systemctl restart nginx. visudo verifie la syntaxe avant d'enregistrer : une erreur de sudoers peut bloquer root.

sudo visudo
# ajouter :
alice ALL=(ALL) ALL
%compta ALL=(ALL) /usr/bin/apt update, /usr/bin/apt upgrade
 Defaults timestamp_timeout=10
Démonstration pas à pas : grep eleve /etc/passwd renvoie eleve:x:1000:1000:Eleve:/home/eleve:/bin/bash — champ 1 le login, x le renvoi vers shadow, 1000 l'UID et le GID, puis le commentaire, le home et le shell. id eleve confirme avec groupes=1000(eleve),27(sudo) : l'utilisateur appartient à son groupe et au groupe sudo, donc sudo -l -U eleve doit lister ses droits.
Pièges classiques : usermod -G sudo alice sans -a la retire de tous ses autres groupes : l'option -a est obligatoire. Éditer /etc/sudoers sans visudo expose à une faute de syntaxe qui bloque tout sudo. userdel sans -r laisse le home orphelin. À l'examen : UID 0 égale root, UID sous 1000 égale compte système, et passwd -l/-u/-e verrouille, déverrouille ou force le changement.
À vous de jouer : Quelle commande ajoute alice au groupe sudo sans lui retirer ses groupes actuels ?
Voir la réponse

sudo usermod -aG sudo alice : -a ajoute, -G désigne les groupes supplémentaires. Vérifie ensuite avec id alice.

Points d'examen (102-500) : format exact d'une ligne /etc/passwd, UID 0 = root, UID < 1000 = systeme, difference useradd / usermod / passwd -l/-u/-e, danger d'oublier -a avec -G, edition via visudo.
3.1passwd shadow group sudoers
3.2useradd usermod passwd groupadd
3.3sudo et visudo
Module 4 Installation et boot : BIOS/UEFI, GRUB, noyau, systemd

1. La chaine de demarrage complete

  1. BIOS/UEFI : test materiel (POST), puis charge le chargeur depuis le disque (MBR) ou la partition EFI (ESP, FAT32, montee sur /boot/efi).
  2. GRUB 2 : affiche le menu (/boot/grub/grub.cfg, genere, ne pas editer a la main), charge le noyau (vmlinuz) et l'initramfs (pilotes pour monter la vraie racine : LVM, RAID, chiffrement).
  3. systemd (PID 1) : monte les systemes, demarre les services de la cible par defaut (multi-user.target = texte, graphical.target = graphique).
ls /boot
# vmlinuz-6.8.0 initrd.img-6.8.0 grub/
systemctl get-default
# multi-user.target
 journalctl -b   # journal du boot courant
Pourquoi c'est important : À 2h du matin, un serveur ne redémarre plus après une mise à jour : écran noir, GRUB en mode rescue. Si tu connais l'ordre UEFI, GRUB, noyau, initramfs et systemd, tu sais immédiatement où chercher au lieu de réinstaller la machine dans la panique.
L'analogie qui aide : Le démarrage est un relais : l'UEFI tend le témoin à GRUB qui propose le menu, GRUB le passe au noyau avec l'initramfs comme trousse de secours pour monter la vraie racine, puis systemd sprinte en dernier en lançant tous les services de la cible.

2. Configurer GRUB sans le casser

On edite /etc/default/grub (GRUB_TIMEOUT, GRUB_DEFAULT, GRUB_CMDLINE_LINUX), puis on regenere : update-grub (Debian/Ubuntu) ou grub2-mkconfig -o /boot/grub2/grub.cfg (RHEL). Reinstallation : grub-install /dev/sda (le disque entier, pas une partition).

sudo nano /etc/default/grub
GRUB_TIMEOUT=5
GRUB_CMDLINE_LINUX="quiet splash"
sudo update-grub
# ou RHEL :
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo grub-install /dev/sda

3. Partitions minimales et installation

  • BIOS : / (racine, ext4), swap, /home separe recommande.
  • UEFI : + partition EFI /boot/efi (~512 Mo, FAT32).
  • Repere examen : lsblk (arbre), blkid (UUID), fdisk -l (table), df -h (montes).
lsblk
NAME   TAILLE TYPE POINT
sda      30G disk
|-sda1   20G part /
+-sda2   10G part /home
blkid
 df -h
Démonstration pas à pas : lsblk affiche sda1 20G (/) sda2 10G (/home) : tu vois l'arbre réel des partitions. blkid donne les UUID à copier dans fstab, df -h confirme ce qui est vraiment monté. Pour GRUB : tu édites /etc/default/grub, tu régénères avec update-grub, et seulement ensuite tu rebootes. Chaque sortie valide l'étape suivante.
Pièges classiques : Ne jamais éditer /boot/grub/grub.cfg à la main : il est régénéré et ta modification disparaît. grub-install /dev/sda vise le disque entier, jamais une partition comme sda1. En UEFI, oublier la partition EFI en FAT32 montée sur /boot/efi rend la machine inamorçable. Un reboot sans avoir testé la configuration expose à un démarrage en maintenance.
À vous de jouer : Tu modifies /etc/default/grub sur Ubuntu. Quelle commande applique le changement ?
Voir la réponse

sudo update-grub : elle régénère grub.cfg depuis tes réglages. Sur RHEL, c'est sudo grub2-mkconfig -o /boot/grub2/grub.cfg.

Points d'examen (101-500) : ordre BIOS/UEFI - GRUB - noyau - initramfs - systemd, fichier /etc/default/grub + regeneration, grub-install /dev/sda, role de l'ESP en UEFI, commandes lsblk / blkid / fdisk -l.
4.1Chaine de boot et PID 1
4.2GRUB 2 : configurer et reinstaller
4.3Partitionnement BIOS et UEFI

Objectif de sortie — niveau debutant

Vous savez naviguer en shell, enchainer pipes et redirections, lire et poser des droits (y compris umask et sticky bit), gerer les comptes et decrire la chaine de boot jusqu'a systemd. Validez la mission 1 a 3 puis 9 dans le terminal.