MémentoAuteur : D. Dambreville · didierdambreville.github.io · licence CC BY 4.0

Linux

La ligne de commande · fichiers · droits · Bash · scripts · système · réseau · SSH
ls -l chasse fixe, gras : à taper tel quel
fichier italique : valeur à remplacer
sudo en tête : droits d’administration requis
Ctrl+C touche ou combinaison de touches
! piège fréquent ou commande risquée

Anatomie d’une commande

lscommande
-l -hoptions
/var/logargument
  • Options courtes groupables : -l -h = -lh ; forme longue : --human-readable.
  • La casse compte : ls -r (ordre inverse) ≠ ls -R (récursif).
  • -- clôt les options : rm -- -fichier.
  • Espace dans un nom : cd "Mes documents" ou cd Mes\ documents.
  • Code de retour : 0 = succès, toute autre valeur = échec → echo $?.

L’invite du shell

aliceutilisateur
@pcmachine
:~/docsdossier courant
$invite

$ : utilisateur ordinaire · # : administrateur (root).

Obtenir de l’aide

man commandemanuel complet ; q quitter, /mot chercher
commande --helpaide résumée
man -k motchercher une commande par mot-clé (= apropos)
whatis commandedescription en une ligne
type commandealias, commande interne ou programme ?
which commandechemin du programme lancé
help commandecommandes internes de Bash (cd, export…)

Sections du manuel : 1 commandes · 5 formats de fichiers · 8 administration. Ex. man 5 crontab.

Chemins

/etc/sshabsolu : part de la racine /
docs/a.txtrelatif : part du dossier courant
~dossier personnel (= $HOME)
. · ..dossier courant · dossier parent
-avec cd : dossier précédent
.bashrcfichier caché : nom commençant par un point

! La casse compte : Photo.jpg ≠ photo.jpg. Séparateur : / (et non \).

Pratiquer sans risque

  • Machine virtuelle avec instantanés : on revient en arrière après une erreur.
  • WSL sous Windows : pratique pour s’exercer, mais n’isole pas du système hôte.
  • Clé USB « live » : Linux démarre sans installation.
  • Provoquer les erreurs volontairement, au laboratoire, pour apprendre à les lire.
  • ! Ne jamais expérimenter avec sudo sur une machine dont on dépend.

Raccourcis du terminal

Tabcompléter un nom ; deux fois : propositions
↑ ↓parcourir l’historique
Ctrl+Rrechercher dans l’historique
Ctrl+Cinterrompre la commande en cours
Ctrl+Dfin de saisie ; sur ligne vide : quitter le shell
Ctrl+Zsuspendre (reprendre : fg ou bg)
Ctrl+Leffacer l’écran (= clear)
Ctrl+A Ctrl+Edébut · fin de ligne
Ctrl+U Ctrl+Kcouper jusqu’au début · jusqu’à la fin
Ctrl+W Ctrl+Ycouper le mot précédent · coller
Alt+.dernier argument de la commande précédente
Ctrl+Maj+C Ctrl+Maj+Vcopier · coller (terminal graphique)

! Ctrl+S fige l’affichage ; Ctrl+Q le libère.

Éditeurs : le minimum vital

nano — simple

Ctrl+O Entréeenregistrer
Ctrl+Xquitter
Ctrl+Wchercher
Ctrl+K · Ctrl+Ucouper la ligne · coller
Alt+Uannuler
Dans les menus de nano : ^ = Ctrl · M- = Alt

vim — présent partout

imode insertion : saisir du texte
Échapretour au mode normal (commandes)
:w · :qenregistrer · quitter
:wqenregistrer et quitter
:q!quitter sans enregistrer
/motif · nchercher · occurrence suivante
u · Ctrl+Rannuler · rétablir
dd · yy · pcouper · copier la ligne · coller
gg · Gdébut · fin du fichier
:set nunuméros de ligne

! Coincé dans vim : Échap puis :q! Entrée.

Clavier AZERTY : caractères du shell

| AltGr+6~ AltGr+2# AltGr+3{ AltGr+4[ AltGr+5` AltGr+7\ AltGr+8@ AltGr+0] AltGr+)} AltGr+=

Touche morte (~, `) : ajouter Espace.

Arborescence du système

/racine unique de tout le système
/bin /sbincommandes essentielles (souvent liens vers /usr/bin, /usr/sbin)
/bootnoyau et chargeur de démarrage
/devpériphériques : disques, terminaux…
/etcconfiguration du système et des services
/homedossiers personnels des utilisateurs
/rootdossier personnel de l’administrateur
/libbibliothèques, modules du noyau
/media /mntsupports amovibles · montages temporaires
/optlogiciels tiers autonomes
/proc /sysfichiers virtuels : processus, noyau, matériel
/rundonnées d’exécution, effacées à l’arrêt
/srvdonnées servies (web, FTP…)
/tmpfichiers temporaires
/usrprogrammes, bibliothèques, documentation
/vardonnées variables : journaux (/var/log), caches

« Tout est fichier » : disques, processus et réglages du noyau se lisent comme des fichiers.

Se déplacer et lister

pwdafficher le dossier courant
cd dossieraller dans un dossier
cdrevenir au dossier personnel
cd ..remonter d’un niveau
cd -revenir au dossier précédent
ls -lformat long : droits, taille, date
ls -ainclure les fichiers cachés
ls -lhtailles lisibles (K, M, G)
ls -lt · ls -ltrpar date : récent en tête · en dernier
ls -lSpar taille décroissante
ls -Rrécursif (sous-dossiers)
ls -d */les dossiers seulement
tree -L 2arbre sur 2 niveaux (paquet tree)

Démarche de diagnostic

  1. Lire le message en entier : la première erreur est souvent la vraie.
  2. Code de retour : echo $?.
  3. Plus de détails : -v, --verbose, bash -x.
  4. Journaux : journalctl -u service -e, /var/log/.
  5. Vérifier l’évidence : chemin, droits, espace, service, réseau.
  6. Ne changer qu’une chose à la fois, puis retester.

2 · Fichiers et dossiers

Mémento — Linux

Créer, copier, déplacer, supprimer

touch fcréer un fichier vide (ou actualiser sa date)
mkdir dcréer un dossier
mkdir -p a/b/ccréer toute la hiérarchie d’un coup
cp source destinationcopier un fichier
cp -r d1 d2copier un dossier et son contenu
cp -a source destinationcopie fidèle : droits, dates, liens conservés
cp -i · mv -idemander avant d’écraser
cp -nne jamais écraser
mv ancien nouveaurenommer
mv f1 f2 d/déplacer plusieurs fichiers dans un dossier
rm fsupprimer un fichier
rm -i fsupprimer avec confirmation
rm -r dsupprimer un dossier et tout son contenu
rmdir dsupprimer un dossier vide

! Pas de corbeille : rm est définitif et rm -rf ne demande rien. Vérifier d’abord le motif avec ls motif.

! cp et mv écrasent sans prévenir un fichier de même nom (sauf -i ou -n).

Liens

ln -s cible lienlien symbolique : un raccourci (peut pointer dans le vide)
ln cible lienlien physique : second nom des mêmes données
ls -l lienaffiche lien -> cible
readlink -f lienchemin réel final

Ordre : cible d’abord, comme cp source destination. Lien physique : même système de fichiers, jamais un dossier.

Jokers du shell

*toute suite de caractères, même vide*.txt
?exactement un caractèrephoto?.jpg
[abc]un caractère parmi a, b, c[Rr]apport*
[0-9]un caractère de l’intervallelog[0-9]
[!0-9]un caractère hors de l’ensemble[!0-9]*
{a,b}variantesf{,.bak} → f f.bak
{1..5}séquencemkdir s{1..5}

C’est le shell qui remplace les jokers, avant de lancer la commande ; * ignore les fichiers cachés. Voir d’avance : echo *.txt.

Comparer et vérifier

diff a bdifférences ligne à ligne
diff -u a bformat unifié : + ajouté, - retiré
diff -r d1 d2comparer deux dossiers
sha256sum fempreinte SHA-256 d’un fichier
sha256sum -c f.sha256vérifier des empreintes publiées

Un téléchargement est intact si son empreinte est identique à celle que publie la source officielle.

Encodage et noms de fichiers

file fencodage et fins de ligne (« CRLF » = Windows)
dos2unix f · unix2dos fconvertir les fins de ligne (paquet dos2unix)
iconv -f ISO-8859-1 -t UTF-8 f > gconvertir l’encodage en UTF-8
localelangue et encodage de la session

Noms sûrs : lettres sans accent, chiffres, -, _, . ; ni espace ni caractère spécial.

Lire un fichier

cat f · cat -n fafficher tout · avec numéros de ligne
less flire page par page (touches ci-dessous)
head f · head -n 20 f10 (ou 20) premières lignes
tail f · tail -n 20 f10 (ou 20) dernières lignes
tail -f fsuivre en direct (journal) ; Ctrl+C pour sortir
wc -l fcompter les lignes (-w mots, -c octets)
file fnature réelle du contenu
stat ftaille, droits, dates, inode

Touches de less (et de man)

Espace · bpage suivante · précédente
/mot · n · Nchercher · suivant · précédent
g · Gdébut · fin
Fsuivre les ajouts (comme tail -f)
qquitter

Archives et compression

tar -czf a.tar.gz d/créer une archive compressée (gzip)
tar -cJf a.tar.xz d/idem en xz : plus compact, plus lent
tar -tzf a.tar.gzlister le contenu sans extraire
tar -xzf a.tar.gzextraire ici
tar -xf a.tar.gz -C d/extraire dans d (compression détectée)
gzip f · gunzip f.gzcompresser · décompresser (remplace l’original)
zip -r a.zip d/archive zip
unzip a.zip · unzip -l a.zipextraire · lister

Mémo tar : c créer · x extraire · t lister · z gzip · J xz · j bzip2 · v détails · f fichier — f en dernier, suivi du nom de l’archive.

Disques et espace

df -hespace libre par système de fichiers
df -iinodes libres (nombre de fichiers possibles)
du -sh dtaille totale d’un dossier
du -h --max-depth=1taille de chaque sous-dossier
du -sh * | sort -héléments du dossier courant, triés
lsblk -f · findmntdisques et partitions · points de montage
sudo mount /dev/sdb1 /mntmonter une partition
sudo umount /mntdémonter (fermer d’abord les fichiers ouverts)

/etc/fstab : montages au démarrage. ! Une erreur peut bloquer le démarrage : contrôler avec findmnt --verify, puis sudo mount -a.

! mkfs, dd, fdisk sur le mauvais disque effacent tout : vérifier son nom avec lsblk, deux fois.

À manier avec précaution

rm -rf cheminsuppression définitive, sans question : relire le chemin
rm -rf "$d"/*! si d est vide → /* ! Écrire "${d:?}"/*
dd · mkfs · fdiskécrasent un disque entier en cas d’erreur de nom
chmod -R · chown -Rsur / ou /etc : système cassé, sécurité perdue
> fvide le fichier sans confirmation
curl url | shexécute un script jamais lu : télécharger, lire, puis lancer

Règle d’or : comprendre chaque option avant Entrée ; simuler d’abord (--dry-run, -i, echo) ; ne jamais coller une commande que l’on ne comprend pas.

3 · Rechercher et traiter le texte

Mémento — Linux

find — trouver des fichiers

Syntaxe : find où critères action

find . -name "*.log"par nom (casse respectée)
find . -iname "photo*"par nom, casse ignorée
find d -type ffichiers seulement (d dossiers, l liens)
find . -size +100Mplus de 100 Mio
find . -mtime -7modifiés il y a moins de 7 jours
find . -mtime +30modifiés il y a plus de 30 jours
find . -mmin -60modifiés dans la dernière heure
find . -user nomappartenant à un utilisateur
find . -emptyfichiers et dossiers vides
find . -maxdepth 1sans descendre dans les sous-dossiers
find . -name "*.sh" -exec chmod +x {} +agir sur les résultats
find . -name "*.tmp" -delete! supprimer les résultats : lancer d’abord sans -delete
find / -name f 2>/dev/nullmasquer les « Permission denied »

Combiner : -a et (implicite) · -o ou · ! non · \( … \) groupe.

! Motif entre guillemets, sinon le shell le remplace avant find.

grep — chercher dans le texte

grep motif flignes contenant le motif
grep -iignorer la casse
grep -vinverser : lignes sans le motif
grep -nafficher les numéros de ligne
grep -ccompter les lignes trouvées
grep -wmot entier seulement
grep -on’afficher que la partie trouvée
grep -r motif d/chercher dans tout un dossier
grep -rl motif d/seulement les noms de fichiers
grep -E "a|b"expression régulière étendue (a ou b)
grep -F "a.b"texte littéral : aucun caractère spécial
grep -A 3 · -B 3 · -C 33 lignes après · avant · autour
grep -qsilencieux : seul le code de retour compte (scripts)

Recettes : composer avec le tube |

history | grep sshretrouver une ancienne commande
ps aux | grep nomtrouver un processus
du -sh * | sort -h | tailles plus gros éléments
sort f | uniq -c | sort -rn | headles 10 lignes les plus fréquentes
grep -v '^#' f | grep -v '^$'configuration sans commentaires ni lignes vides
awk '{print $1}' access.log | sort | uniq -c | sort -rn | headadresses les plus fréquentes d’un journal web
find . -name '*.md' -print0 | xargs -0 grep -l TODOfichiers .md contenant TODO (espaces dans les noms gérés)
ls | wc -lnombre d’éléments du dossier
ls -lt | headles fichiers modifiés en dernier
tail -f journal | grep -i errorsurveiller les erreurs en direct
cut -d: -f1 /etc/passwd | sortliste triée des comptes

Expressions régulières (grep -E, sed -E)

.un caractère quelconque
^ · $début · fin de ligne
*l’élément précédent, 0 fois ou plus
+ · ?1 fois ou plus · 0 ou 1 fois
{2,4}de 2 à 4 fois
[abc] · [^abc]un caractère parmi · hors de
[0-9] · [a-z]un caractère d’un intervalle
a|b · ( )alternative · groupe
\. · \*caractère spécial pris à la lettre
\blimite de mot (GNU)

Exemples

^#lignes de commentaire
^$lignes vides
^[0-9]+$lignes faites uniquement de chiffres
[0-9]{1,3}(\.[0-9]{1,3}){3}forme d’une adresse IPv4 (valeurs non contrôlées)

! Joker ≠ expression régulière : *.txt (shell) ↔ \.txt$ (grep).

Filtres de texte

sort ftrier : -n numérique · -r inverse · -h tailles (2K, 1G) · -k 2 selon la 2e colonne · -u sans doublon
uniqfusionner les doublons consécutifs (-c compter) : trier avant
cut -d: -f1 /etc/passwd1er champ, séparateur « : »
tr a-z A-Zremplacer des caractères (ici : en majuscules)
tr -d '\r'supprimer des caractères (fins de ligne Windows)
sed 's/ancien/nouveau/g' fremplacer partout (affiche le résultat)
sed -i.bak 's/a/b/g' f! modifier le fichier lui-même (copie .bak)
sed -n '5,10p' fafficher les lignes 5 à 10
sed '/^#/d' fretirer les lignes de commentaire
awk '{print $1}' f1re colonne (séparateur : espaces)
awk -F: '{print $1, $7}' /etc/passwdcolonnes 1 et 7, séparateur « : »
awk '$3 > 100' flignes dont la 3e colonne dépasse 100
tee fafficher et écrire dans un fichier
xargstransformer l’entrée en arguments
column -taligner en colonnes
tac · revinverser l’ordre des lignes · des caractères

Localiser une commande ou un fichier

locate nomrecherche instantanée dans un index (paquet plocate) ; mise à jour : sudo updatedb
which commandeprogramme effectivement lancé
whereis commandeprogramme, sources et manuel
type -a commandetoutes les définitions : alias, fonction, fichier
command -v commandela commande existe-t-elle ? (forme portable, scripts)
realpath fchemin absolu d’un fichier

4 · Droits et utilisateurs

Mémento — Linux

Lire une ligne de ls -l

droits
-rwxr-x---1alicecompta4096Sep 28 10:15rapport.sh
typepropriétaire ugroupe gautres olienspropriétairegroupetaille (octets)dernière modificationnom

Type : - fichier · d dossier · l lien symbolique · b c périphérique (bloc, caractère) · p tube nommé · s socket. Droits dans l’ordre r lire · w écrire · x exécuter ; - = droit absent.

Que signifient r, w, x ?

sur un fichiersur un dossier
r (4)lire le contenulister les noms (ls)
w (2)modifier le contenucréer, renommer, supprimer des éléments
x (1)exécuter (programme, script)entrer (cd) et accéder aux éléments

Supprimer un fichier dépend des droits sur le dossier qui le contient, pas sur le fichier lui-même.

Notation octale

0 ---1 --x2 -w-3 -wx4 r--5 r-x6 rw-7 rwx
644rw-r--r--fichier ordinaire
600rw-------fichier privé (clé SSH)
755rwxr-xr-xprogramme, script, dossier
700rwx------dossier privé (~/.ssh)
664 · 775rw-rw-r-- · rwxrwxr-xtravail en groupe
777rwxrwxrwx! tout à tous : à proscrire

Un chiffre par catégorie u · g · o ; chaque chiffre = somme de r 4 + w 2 + x 1. Ex. 6 = 4 + 2 = rw-.

Modifier droits et propriétaires

chmod 644 ffixer les droits en octal
chmod u+x fajouter x au propriétaire
chmod g-w fretirer w au groupe
chmod o= fretirer tout droit aux autres
chmod a+r flecture pour tous (a = u + g + o)
chmod u=rw,go=r ffixer chaque catégorie (= 644)
chmod -R u+rwX drécursif ; X : x pour les dossiers seulement (et fichiers déjà exécutables)
sudo chown util fchanger le propriétaire
sudo chown util:groupe fpropriétaire et groupe
sudo chown -R util: drécursif ; groupe principal de util
chgrp groupe fchanger le groupe (si l’on en est membre)

! chmod -R 777 ne résout rien : il ouvre tout à tous. Chercher plutôt qui doit accéder, et à quoi.

Masque et droits spéciaux

umaskmasque appliqué aux créations ; souvent 0022 → fichiers 644, dossiers 755 (ou 0002 → 664, 775)
chmod u+s fsetuid (4000) : le programme s’exécute avec les droits de son propriétaire (ex. passwd)
chmod g+s dsetgid (2000) sur un dossier : les nouveaux fichiers héritent de son groupe
chmod +t dsticky (1000) : seul le propriétaire d’un fichier peut le supprimer (ex. /tmp : drwxrwxrwt)

s ou t minuscule : bit spécial avec x ; S ou T majuscule : bit spécial sans x.

Utilisateurs et groupes

whoami · idutilisateur courant · identifiants et groupes
groups utilgroupes d’un utilisateur
who · wutilisateurs connectés (et leur activité)
passwdchanger son mot de passe
sudo adduser utilcréer un utilisateur (Debian, Ubuntu : interactif)
sudo useradd -m -s /bin/bash utilcréer un utilisateur (toutes distributions)
sudo passwd utildéfinir son mot de passe
sudo usermod -aG groupe utilajouter à un groupe
sudo groupadd groupecréer un groupe
sudo passwd -l utilverrouiller le mot de passe du compte
sudo userdel -r utilsupprimer le compte et son dossier personnel

! usermod -G sans -a remplace tous les groupes secondaires. Un nouveau groupe prend effet à la connexion suivante.

Devenir administrateur

sudo commandeexécuter une commande en administrateur (root)
sudo !!relancer la commande précédente avec sudo
sudo -iouvrir un shell root (quitter : exit)
sudo -u util commandeexécuter en tant qu’un autre utilisateur
sudo -lvoir ce que l’on a le droit de faire
su - utilouvrir une session en tant que util (son mot de passe)
sudo visudomodifier /etc/sudoers avec contrôle de syntaxe

Invite : $ utilisateur ordinaire · # root. Droits d’administration : groupe sudo (Debian, Ubuntu) ou wheel (Fedora, RHEL).

! Root n’a aucun garde-fou : réserver sudo à la seule commande qui l’exige.

Fichiers des comptes

alicenom
:xmot de passe
:1000UID
:1000GID
:Aliceinfo
:/home/alicedossier
:/bin/bashshell
/etc/passwdcomptes, une ligne chacun (lisible par tous)
/etc/shadowempreintes des mots de passe (root seul) ; x y renvoie
/etc/groupgroupes : nom:x:GID:membre1,membre2
/etc/sudoersrègles de sudo (modifier via visudo)

UID 0 = root. Comptes ordinaires : en général à partir de 1000 ; en dessous, comptes système (services).

Droits fins : ACL

getfacl fafficher les droits détaillés
setfacl -m u:util:rw flecture et écriture pour un utilisateur précis
setfacl -m g:groupe:rx didem pour un groupe
setfacl -x u:util fretirer cette entrée

Un + après les droits (-rw-r--r--+) signale des ACL.

5 · Le shell Bash

Mémento — Linux

Flux et redirections

clavier
ou fichier
0 entrée standard
stdin ⟶
commande
1 sortie standard stdout ⟶
écran
2 erreur standard stderr ⟶
écran
cmd > fsortie vers f — ! écrase son contenu
cmd >> fsortie ajoutée à la fin de f
cmd 2> ferreurs vers f
cmd > f 2>&1sortie et erreurs vers f (ordre important)
cmd &> fidem, forme courte de Bash
cmd 2>/dev/nulljeter les erreurs
cmd < flire l’entrée depuis f
cmd1 | cmd2tube : la sortie de cmd1 alimente cmd2
cmd | tee fafficher et enregistrer à la fois
cmd <<< "texte"une chaîne comme entrée

Document en ligne (here-doc)

cat > notes.txt <<'EOF'
Texte sur plusieurs lignes,
écrit tel quel dans notes.txt.
EOF

<<'EOF' : texte pris tel quel · <<EOF : variables remplacées.

! sort f > f vide f : le shell l’ouvre en écriture avant la lecture. Écrire ailleurs, ou sort -o f f.

Enchaîner les commandes

a ; ba puis b, quoi qu’il arrive
a && bb seulement si a réussit
a || bb seulement si a échoue
a &a en arrière-plan
( a ; b )sous-shell : un cd n’y affecte pas le shell courant
$(cmd)remplacé par la sortie de cmd
mkdir -p sauv && cp -a docs "sauv/docs-$(date +%F)"

→ copie datée sauv/docs-AAAA-MM-JJ, seulement si mkdir a réussi.

Tâches et sessions

cmd &lancer en arrière-plan
jobslister les tâches du shell
fg %1 · bg %1tâche 1 au premier plan · poursuivie en arrière-plan
nohup cmd &survivre à la fermeture du terminal (sortie : nohup.out)
disowndétacher la dernière tâche du shell
tmuxsession qui survit à la déconnexion (page 8)

Historique

historyliste numérotée
!!relancer la dernière commande
!nrelancer la commande numéro n
!sshrelancer la dernière commande commençant par ssh
!$dernier argument de la commande précédente
^a^brelancer la précédente en remplaçant a par b
Ctrl+Rrecherche au fil de la frappe ; encore Ctrl+R : plus ancien

Debian, Ubuntu : une commande précédée d’une espace n’est pas mémorisée (HISTCONTROL=ignoreboth).

Variables

nom=valeurdéfinir — ! aucune espace autour de =
echo "$nom"utiliser
"${nom}_v2"accolades : délimiter le nom
export nom=valeurtransmettre aux programmes lancés ensuite
unset nomsupprimer
env · printenvlister les variables d’environnement
${nom:-défaut}valeur par défaut si vide ou absente
${#nom}longueur
${f%.txt}retirer le suffixe .txt
${f##*/}retirer le chemin (≈ basename)
${nom/a/b}remplacer la 1re occurrence (// : toutes)
$(( 3 * 4 ))calcul entier → 12

Variables prédéfinies utiles

$HOME · $USER · $PWDdossier personnel · utilisateur · dossier courant
$PATHdossiers où chercher les commandes, séparés par :
$SHELL · $EDITOR · $LANGshell · éditeur par défaut · langue
$? · $$code de retour précédent · numéro (PID) du shell

Guillemets et échappement

'…'littéral : rien n’est interprétéecho '$HOME' → $HOME
"…"variables et $( ) remplacés, espaces préservéesecho "$HOME" → /home/alice
\neutralise le caractère suivantecho \$HOME → $HOME

Règle : toujours "$variable" entre guillemets doubles — sinon un nom contenant une espace se coupe en deux arguments.

Configurer son shell

~/.bashrclu par chaque shell interactif : alias, invite, fonctions
~/.profile · ~/.bash_profilelu à la connexion : variables d’environnement
/etc/profileéquivalent pour tous les utilisateurs
source ~/.bashrcappliquer les changements sans rouvrir le terminal
alias ll='ls -lh'créer un raccourci (à placer dans ~/.bashrc)
alias · unalias nomlister · supprimer les alias
export PATH="$HOME/bin:$PATH"ajouter un dossier au PATH

Petits outils du quotidien

date · date +%Fdate et heure · format AAAA-MM-JJ
sleep 5attendre 5 secondes
watch -n 2 cmdrelancer une commande toutes les 2 s
time cmdmesurer la durée d’exécution
seq 1 10suite de nombres de 1 à 10
echo 'scale=2; 7/2' | bccalcul décimal → 3.50 (paquet bc)
resetrétablir un terminal déréglé
xdg-open fouvrir avec l’application par défaut (bureau)

6 · Scripts Bash

Mémento — Linux

Squelette d’un script

#!/usr/bin/env bash
# sauvegarde.sh — archive datée d’un dossier
set -euo pipefail

dossier="${1:?usage : $0 dossier}"
dest="$HOME/sauvegardes"
jour="$(date +%F)"                  # AAAA-MM-JJ
archive="$dest/$(basename "$dossier")-$jour.tar.gz"

mkdir -p "$dest"
tar -czf "$archive" "$dossier"
echo "Archive créée dans $dest"
#!/usr/bin/env bash« shebang » : l’interpréteur à utiliser (1re ligne)
set -earrêter à la première commande en échec
set -uerreur si une variable n’est pas définie
set -o pipefailun tube échoue si l’une de ses commandes échoue
${1:?message}arrêt avec message si l’argument manque

Lancer

chmod +x sauvegarde.shrendre exécutable (une fois)
./sauvegarde.sh docslancer depuis son dossier
bash sauvegarde.sh docslancer sans le droit x

! ./ est nécessaire : le dossier courant n’est pas dans $PATH.

! Script écrit sous Windows (fins de ligne CRLF) → bad interpreter ou $'\r': command not found. Corriger : sed -i 's/\r$//' script ou dos2unix script.

Arguments et variables spéciales

$0nom du script
$1 … $9 · ${10}arguments de position
$#nombre d’arguments
"$@"tous les arguments, chacun intact (à préférer)
"$*"tous les arguments en une seule chaîne
$?code de retour de la dernière commande
$$ · $!PID du script · du dernier processus lancé en arrière-plan
shiftdécaler : $2 devient $1
exit 0 · exit 1terminer : succès · échec

Tests : [[ … ]]

Fichiers

-e fexiste
-f f · -d dfichier ordinaire · dossier
-L flien symbolique
-r · -w · -x flisible · modifiable · exécutable
-s fexiste et n’est pas vide
f1 -nt f2f1 plus récent que f2

Chaînes

-z "$s" · -n "$s"vide · non vide
"$a" == "$b" · !=égales · différentes
"$f" == *.txtcorrespond au joker (sans guillemets à droite)
"$s" =~ ^[0-9]+$correspond à l’expression régulière

Nombres

-eq · -neégal · différent
-lt · -le · -gt · -ge< · ≤ · > · ≥
(( a > b ))comparaison arithmétique, plus lisible

Combiner : &&, ||, ! à l’intérieur de [[ ]]. ! Espaces obligatoires : [[ -f "$f" ]], jamais [[-f "$f"]].

[ ] (POSIX) : mêmes tests de fichiers, = pour les chaînes, guillemets indispensables.

Conditions

if [[ -f "$f" ]]; then
    echo "fichier présent"
elif [[ -d "$f" ]]; then
    echo "c’est un dossier"
else
    echo "introuvable : $f" >&2
    exit 1
fi
case "$reponse" in
    o|O|oui) echo "d’accord" ;;
    n|N|non) echo "abandon"; exit 1 ;;
    *)       echo "réponse inattendue" ;;
esac

Toute commande peut servir de condition : code 0 = vrai. if grep -q motif f; then …

Boucles

for f in *.jpg; do
    echo "Traitement de $f"
done

for i in {1..5}; do echo "$i"; done
for (( i = 0; i < 3; i++ )); do echo "$i"; done

while IFS= read -r ligne; do
    echo "> $ligne"
done < fichier.txt

n=0
until (( n >= 3 )); do n=$(( n + 1 )); done

break sortir de la boucle · continue passer au tour suivant. Lire un fichier ligne à ligne : while IFS= read -r (espaces et \ conservés).

Fonctions et saisie

saluer() {
    local nom="${1:-inconnu}"   # variable locale
    echo "Bonjour, $nom"
}
saluer "le monde"
message="$(saluer "vous")"      # capturer la sortie
read -rp "Nom : " nomdemander une saisie
printf '%s : %d\n' "$nom" "$n"affichage formaté
return ncode de retour d’une fonction (0 à 255)

Déboguer

bash -n scriptvérifier la syntaxe sans exécuter
bash -x scriptafficher chaque commande exécutée
set -x · set +xactiver · couper la trace dans le script
shellcheck scriptdétecter erreurs et pièges (paquet shellcheck)
echo "debug : $var" >&2message vers la sortie d’erreur
tmp="$(mktemp)"fichier temporaire sûr
trap 'rm -f "$tmp"' EXITnettoyer à la sortie, même en cas d’erreur

Bonnes pratiques

  • Guillemets doubles autour de chaque variable : "$f".
  • [[ ]] plutôt que [ ] en Bash ; $( ) plutôt que les accents graves.
  • Variables en minuscules : les majuscules désignent l’environnement (PATH, HOME).
  • Tester sur des copies ; préfixer d’un echo une commande destructrice pour voir ce qu’elle ferait.
  • Script lancé par cron : chemins absolus (page 7).
  • ! Avec set -e, (( n++ )) arrête le script quand n vaut 0 (l’expression vaut « faux ») → n=$(( n + 1 )).

7 · Système : processus, services, paquets

Mémento — Linux

Processus

ps auxtous les processus : utilisateur, PID, %CPU, %MEM, commande
ps -ef --forest · pstreeavec la filiation parent → enfant
pgrep -a nomPID et ligne de commande, par nom
topmoniteur : P tri CPU · M tri mémoire · k tuer · q quitter
htopmoniteur plus lisible (à installer)
kill PIDdemander l’arrêt (signal TERM)
kill -9 PIDforcer l’arrêt (KILL) : dernier recours
pkill nom · killall nomarrêter par nom
nice -n 10 cmdlancer avec une priorité plus basse
renice -n 10 -p PIDchanger la priorité (−20 prioritaire … 19 discret)
lsof f · lsof -i :portqui utilise ce fichier · ce port

Signaux

N°NomEffet
1HUPraccrochage ; souvent : relire la configuration
2INTinterruption (Ctrl+C)
9KILLarrêt immédiat, impossible à intercepter
15TERMdemande d’arrêt propre (défaut de kill)
18CONTreprendre un processus suspendu
19STOPsuspendre (impossible à intercepter)
20TSTPsuspension au clavier (Ctrl+Z)

Liste complète : kill -l. Numéros valables sur PC (x86) et ARM.

Planifier : cron

.---------- minute (0-59)
| .-------- heure (0-23)
| | .------ jour du mois (1-31)
| | | .---- mois (1-12)
| | | | .-- jour de la semaine (0-7 ; 0 et 7 = dimanche)
| | | | |
* * * * *  commande
30 2 * * * /chemin/script.shchaque jour à 2 h 30
*/15 * * * * cmdtoutes les 15 minutes
0 9 * * 1-5 cmdà 9 h, du lundi au vendredi
0 0 1 * * cmdle 1er de chaque mois, à minuit
@reboot cmdà chaque démarrage
crontab -e · crontab -lmodifier · afficher sa table
crontab -r! supprime toute la table, sans confirmation (voisin de -e)

! Environnement minimal : chemins absolus, sortie redirigée (>> /chemin/log 2>&1), % écrit \%.

Informations système

uname -a · uname -rnoyau et architecture · version du noyau
cat /etc/os-releasedistribution et version
hostnamectlnom de la machine, système, matériel
uptimedurée de fonctionnement ; charge moyenne sur 1, 5, 15 min
free -hmémoire vive et swap
lscpu · nprocprocesseur · nombre de cœurs
lspci · lsusbpériphériques PCI · USB
sudo dmesg -Tmessages du noyau (matériel, pilotes)
timedatectldate, heure, fuseau, synchronisation

Services : systemd

systemctl status serviceétat et dernières lignes du journal
sudo systemctl start servicedémarrer (stop : arrêter)
sudo systemctl restart serviceredémarrer
sudo systemctl reload servicerelire la configuration sans couper
sudo systemctl enable --now serviceactiver au démarrage et lancer aussitôt
sudo systemctl disable servicene plus lancer au démarrage
systemctl is-active serviceréponse courte (is-enabled : activé ?)
systemctl --failedservices en échec
systemctl list-units --type=serviceservices chargés
systemctl list-timersminuteries (alternative à cron)
sudo systemctl daemon-reloadaprès modification d’un fichier d’unité
sudo systemctl rebootredémarrer (poweroff : éteindre)

Fichiers d’unité : /etc/systemd/system/ (administrateur) l’emporte sur /usr/lib/systemd/system/ (paquets).

Journaux

journalctl -u servicejournal d’un service
journalctl -fsuivre en direct
journalctl -b · -b -1depuis le démarrage · démarrage précédent
journalctl -p errerreurs et plus grave
journalctl --since todaydepuis minuit (ou "1 hour ago")
journalctl -xefin du journal, avec explications
journalctl --disk-usageplace occupée par le journal

Fichiers texte (si rsyslog est installé) : /var/log/syslog (Debian) ou /var/log/messages (Fedora, RHEL) ; connexions et sudo : /var/log/auth.log ou /var/log/secure.

Paquets

ActionDebian, UbuntuFedora, RHELArch
Mettre à jour la listesudo apt updateautomatique (dnf makecache)compris dans -Syu
Tout mettre à joursudo apt upgradesudo dnf upgradesudo pacman -Syu
Installersudo apt install psudo dnf install psudo pacman -S p
Installer un fichier localsudo apt install ./f.debsudo dnf install ./f.rpmsudo pacman -U f.pkg.tar.zst
Supprimersudo apt remove p (purge : + config.)sudo dnf remove psudo pacman -Rns p
Dépendances devenues inutilessudo apt autoremovesudo dnf autoremovepacman -Qdtq | sudo pacman -Rns -
Rechercher · informationsapt search mot · apt show pdnf search mot · dnf info ppacman -Ss mot · pacman -Si p
Paquets installésapt list --installeddnf list --installedpacman -Q
Quel paquet fournit ce fichier ?dpkg -S /chemindnf provides /cheminpacman -Qo /chemin

Formats universels : flatpak install … · snap install …. ! N’ajouter de dépôt tiers qu’en connaissance de cause : il reçoit les droits de root à chaque mise à jour.

8 · Réseau, SSH et dépannage

Mémento — Linux

Réseau : état et diagnostic

ip a · ip -br ainterfaces et adresses IP · résumé
ip rroutes ; passerelle : ligne default via …
ping -c 4 hôtejoignabilité (4 essais)
tracepath hôtechemin suivi jusqu’à l’hôte
ss -tulpnports en écoute (sudo : avec tous les processus)
dig nom · dig +short nominterroger le DNS
resolvectl statusserveurs DNS utilisés (systemd-resolved)
curl -I https://example.comen-têtes de la réponse HTTP
curl -LO url · wget urltélécharger un fichier
nmcli device statusinterfaces gérées par NetworkManager
/etc/hosts · /etc/resolv.confnoms locaux · DNS configurés

Démarche, de proche en proche

  1. ip a : ai-je une adresse ?
  2. ip r : ai-je une passerelle ? ping vers elle
  3. ping -c 3 1.1.1.1 : Internet répond-il ?
  4. dig nom : le DNS répond-il ?
  5. curl -I url : le service répond-il ?

SSH : administrer à distance

ssh util@hôtese connecter
ssh -p 2222 util@hôteport non standard
ssh util@hôte 'cmd'exécuter une commande à distance
exit · Ctrl+Dse déconnecter
ssh-keygen -t ed25519créer une paire de clés (~/.ssh/id_ed25519 et .pub)
ssh-copy-id util@hôteinstaller sa clé publique sur le serveur
ssh -L 8080:localhost:80 util@hôtetunnel : port local 8080 → port 80 du serveur
ssh -J rebond util@hôtepasser par une machine de rebond

Raccourci : ~/.ssh/config

Host srv
    HostName 203.0.113.10
    User util
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

→ ssh srv suffit.

! La clé privée (sans .pub) ne se transmet jamais. Droits : chmod 700 ~/.ssh · chmod 600 ~/.ssh/id_ed25519.

! « REMOTE HOST IDENTIFICATION HAS CHANGED » : ne pas passer outre ; vérifier l’empreinte du serveur avant ssh-keygen -R hôte.

Transférer des fichiers

scp f util@hôte:/chemin/copier vers le serveur
scp util@hôte:/chemin/f .copier depuis le serveur
rsync -avh src/ util@hôte:dest/synchroniser : seules les différences transitent
rsync -avh --dry-run …simuler d’abord
rsync -avh --delete src/ dest/! miroir : efface dans dest ce qui a disparu de src
sftp util@hôtesession interactive : put, get, ls, bye

rsync : -a archive (récursif, droits, dates, liens) · -v détails · -h tailles lisibles · -z compresser · -P progression et reprise.

! src/ copie le contenu de src ; src sans barre finale copie le dossier lui-même.

Ports courants

21 FTP22 SSH, SFTP25 SMTP53 DNS80 HTTP123 NTP143 IMAP443 HTTPS587 SMTP (envoi)993 IMAPS995 POP3S3306 MySQL3389 RDP5432 PostgreSQL8080 HTTP alt.

Liste de référence locale : /etc/services.

Durcir SSH et pare-feu

Dans /etc/ssh/sshd_config, après avoir vérifié que la connexion par clé fonctionne :

PasswordAuthentication no
PermitRootLogin no
sudo sshd -tvérifier la syntaxe de la configuration
sudo systemctl reload sshappliquer (service sshd sur Fedora, RHEL)
sudo ufw allow 22/tcppare-feu ufw (Debian, Ubuntu) : autoriser SSH…
sudo ufw enable · ufw status… puis activer · contrôler
sudo firewall-cmd --list-allfirewalld (Fedora, RHEL) : état
sudo firewall-cmd --permanent --add-service=httpouvrir un service, puis --reload

! Garder une session ouverte et tester depuis une seconde fenêtre avant de la fermer. Un fichier de /etc/ssh/sshd_config.d/ peut primer : la première valeur lue l’emporte.

Messages d’erreur fréquents

command not foundfaute de frappe, paquet absent, dossier hors du PATH → type, installer
No such file or directorychemin ou casse erronés → pwd, ls, Tab ; script : fins de ligne CRLF
Permission denieddroits insuffisants, x manquant → ls -l, chmod +x, sudo si légitime
Is a directoryoption -r oubliée ou mauvais argument
No space left on devicedisque ou inodes pleins → df -h, df -i, du -sh *
Read-only file systemmontage en lecture seule, souvent après une erreur disque → sudo dmesg -T
Device or resource busyfichier ou montage en cours d’usage → lsof
Connection refusedaucun service n’écoute ce port → ss -tulpn, systemctl status
Connection timed outhôte injoignable ou pare-feu → ping, ip r
Address already in useport déjà occupé → sudo ss -tulpn
Could not get lock …une autre installation tourne → attendre ; ne pas effacer le verrou
… is not in the sudoers filecompte sans droits d’administration → groupe sudo ou wheel

tmux : sessions persistantes

tmux new -s nomouvrir une session nommée
Ctrl+B puis Dse détacher : tout continue de tourner
tmux lslister les sessions
tmux attach -t nomretrouver une session
Ctrl+B puis C · Nnouvelle fenêtre · fenêtre suivante
Ctrl+B puis % · "partager l’écran : côte à côte · l’un sous l’autre
Ctrl+B puis ↑ ↓ ← →changer de volet

Sur un serveur : un travail long lancé dans tmux survit à une coupure de la connexion SSH.