formations/culture-unix/culture-unix.md

8.1 KiB

Le terminal et le shell

Le vocabulaire

Expliquer le vocabulaire : shell, terminal, émulateur de terminal, tout en autaurisant les abus de langages (si un élève parle de terminal au lieu de shell ou vice-versa, aucun souci, on le fait tous).

Pour le rôle du terminal, donner en exemple :

=> https://mdk.fr/blog/how-apt-does-its-fancy-progress-bar.html

Pour le rôle du shell, donner en exemple l'auto-complétion de bash.

Expliquer le vocabulaire commande, programme, argument :

C'est très flou, pour un débutant, que lorsqu'il tape ls /, ls est un programme, / et un argument, je pense que dans les yeux du débutant ce sont « deux trucs qui vont bien ensemble ». Pour approfondir un peu plus on peut doucement discerner builtin et programme.

La philosophie Unix

Write programs that do one thing and do it well.

Environ 3000 programmes différents dans mon dossier /bin sur une Debian, heureusement leur utilisation suit une loi de Ziph :

$ history | awk '{print $2}' | sort | uniq -c | sort -gr
1088 git
634 fg
317 cd
293 emacs
239 ls
201 python
119 ssh
113 flake8
104 curl
...

L'idée ici est de réutiliser le code au maximum, un exemple typique : la recherche dans un fichier.

Dans un contexte unix, un seul outil sert à chercher du texte dans un fichier : grep.

Dans les autres contextes, chaque programme ré-implémente à sa manière le code nécessaire à la recherche de texte dans un fichier :

  • Firefox
  • Microsoft Word
  • Chromium
  • Thunderbird
  • Microsoft Excel
  • Libreoffice
  • SublimeText
  • Visual Studio Code

C'est de nombreuses heures de perdues, à réimplémenter inlassablement la même fonctionalité.

Write programs to work together.

Pour pouvoir réutiliser un programme il faut qu'il s'interface correctement avec les autres :

  • Un programme doit s'exprimer dans un dialecte compréhensible pour un autre.
  • Un programme doit comprendre facilement le dialecte d'un autre.

Write programs to handle text streams, because that is a universal interface.

Parler de l'omniprésence du texte brut (de Markdown à HTTP/1.1 en passant par les fichiers source), en opposition aux formats binaires (sortis d'éditeurs comme Word, ...). (Je ne veux plus voir des débutants ouvrir Microsoft Word pour taper leurs premières lignes de code.)

Digrésser sur Markdown et reStructuredText, mentionner groff.

Everything is a file.

Un disque dur est un fichier, une clef USB est un fichier, ma batterie est un fichier, ma souris est un fichier...

Philosophie UNIX

C'est le moment de commencer les démos et explications des commandes élémentaires qui sont l'implémentation de la philosophie UNIX :

  • pwd
  • cd
  • ls
  • cp, mv
  • rm (leur rappeler qu'il n'y a pas de « corbeille »)
  • mkdir (et rmdir)
  • less (leur apprendre à quitter ! Rien n'est pas une évidence.)
  • man (man intro, man man, man ls, man cp, ...)
  • l'historique (history, pavé directionnel, ctrl-r, ça suffit pour le moment)
  • grep
  • find

Pour faire des exemples, on peut par exemple utiliser fr.openfoodfacts.org.products.csv.

$ wc -l fr.openfoodfacts.org.products.csv
1486053 fr.openfoodfacts.org.products.csv

$ file fr.openfoodfacts.org.products.csv
fr.openfoodfacts.org.products.csv: UTF-8 Unicode text, with very long lines

$ less fr.openfoodfacts.org.products.csv

$ head fr.openfoodfacts.org.products.csv
...

# Les noms des colonnes
$ head -n 1 fr.openfoodfacts.org.products.csv | tr '\t' '\n'

$ grep --color E431 fr.openfoodfacts.org.products.csv
...

$ grep --color E431 fr.openfoodfacts.org.products.csv  | wc -l
5

$ grep --color E100 fr.openfoodfacts.org.products.csv  | wc -l
5733

$ grep -oE 'E[0-9]{3}' fr.openfoodfacts.org.products.csv  |  sort | uniq -c | sort -gr | head
 167170 E322
 132029 E330
  79081 E500
  54024 E160
  50842 E415
  47528 E471
  44851 E450
  39896 E150
  39629 E202
  38945 E412

# Les marques les plus / les moins représentée
$ cut -f14 fr.openfoodfacts.org.products.csv | sort | uniq -c | sort -gr | head
 660855
  13160 Carrefour
  10902 Auchan

...

Ou faire quelques exemples simples, par exemple sur un fichier README afficher les titres:

grep '^#' README.md

ssh

SSH: Parler de clefs, conseiller ED25519

eval $(ssh-agent -s)
ssh-add

Aborder les clefs physiques + Fido U2F

sed, c'est bien

dig, et comment fonctionne le DNS

# récupérer la zone root (et oui, il faut connaître un serveur root
# pour trouver un serveur root... les résolveurs DNS les connaissent
# en fait plus ou moins "tous", ils ne changent pas tous les matins.)
$ dig @198.41.0.4 . NS +norec

# Disons qu'on veut trouver la machine qui s'appelle `cr.yp.to` :
# Demander à un serveur root, c'est le seul qu'on connaît :
dig @192.5.5.241 cr.yp.to +norec
# Il nous donne une réponse contenant les NS de `to.`, ainsi que leurs IPs.

# On demande donc à un de ces NS la même question :
dig @216.74.32.101 cr.yp.to +norec
# Qui nous répond avec la liste des NS pour yp.to, ainsi que leurs IPs.

# On demande donc à un de ces NS la même question :
dig @131.193.32.108 cr.yp.to +norec
# Qui nous donne (enfin !) une réponse A (IPv4)

# Si quelqu'un demande pourquoi le NS de yp.to. à un nom à
# ralonge, c'est que c'est du CurveDNS (...de la crypto).

Parler des enregistrements TXT rapidement pendant qu'on y est.

Aussi du cache, pour démonter des préjugés comme "il faut forcément attendre un temps fou après avoir configuré un enregistrement".

Parler des DNS menteurs, et de Google Chrome qui flood les racines en tentant de détecter les DNS menteurs.

curl, wget

Parler de HTTP/1.1, si possible leur faire une démo à la main, avec l'IP récupérée précédement de cr.yp.to :

$ netcat 131.193.32.108 80
GET / HTTP/1.1
Host: cr.yp.to

HTTP/1.1 200 OK

Digrésser sur la sémantique HTTP.

vim, emacs, nano

Donner en passant les raccourcis de base de bash et d'emacs :

  • ctrl-a (début de ligne)
  • ctrl-e (fin de ligne)
  • ctrl-z (suspend, parler de fg, bg, jobs)
  • ctrl-k (kill-line)

git

Clarifier rapidement git vs guthub : j'aime dire « git est à github ce qu'un jpg est à dropbox » pour leur faire comprendre que git n'est pas Github.

  • Qu'est-ce qu'un commit, comment sont-ils rangés.
  • Qu'est-ce qu'un remote, qu'est-ce qu'un clone, (et qu'est-ce qu'un fork ?).
  • Qu'est-ce qu'une branche, qu'est-ce qu'un merge, qu'est-ce qu'un rebase.
  • git bisect
  • git grep

apt install, pip install, ...

Peut être sans trop comparer avec une install sur Windows (chercher sur Google, tomber sur un site louche, télécharger un malware), mais tout de même, montrer la puissance de la chose :

apt install vlc
vlc cybersdf/

Parler du côté extrêmemnent controllé des paquets des distribs, en opposition au côté extrêmement yolo des paquets des langages (npm, pip, le typo squatting, supply-chain attacks, ...).

rsync

On ne parle plus de scp, scp c'est finit, RIP.

Aborder rsnapshot si possible, digresser sur l'importance des sauvegardes.

L'encodage

Mettre en opposition "glyphe" (sur un coin de nappe en papier) et "bits" (sur un disque ou par du cuivre), pour vite ammener au côté nécessaire d'encoder d'un côté et de décoder de l'autre (pour le transport, le stockage, ...).

Digresser sur le binaire, l'hexadécimal, leur rappeler les méthodes de conversion au moins jusqu'a l'octet.

Digresser rapidement sur la logique booléenne :

  • 0 and x ?
  • 1 or x ?
  • not(a or b) == ?
  • (not a) or (not b)

Parler d'encodage de caractères, peut être en partant d'ASCII (pas avant, ce n'est pas utile et ils ne retiendront pas tout), Unicode, UTF-8, UTF-16, UTF-32, BE, LE, le BOM.

Quelques démos s'imposeront avec iconv et peut être Python.

TODO