formations/culture-unix/culture-unix.md

311 lines
8.1 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 à *q*uitter ! 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](https://www.data.gouv.fr/fr/datasets/open-food-facts-produits-alimentaires-ingredients-nutrition-labels/#resource-164c9e57-32a7-4f5b-8891-26af10f91072).
```bash
$ 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
- Le système de fichiers
- Les droits
- Les montages
- Petit historique
- Les window-managers
- Sweet sweet thinks like youtube-dl
- crons / crontabs
- débugger (journalctl, /var/log)
- https://www.lopezferrando.com/30-interesting-shell-commands/