Culture Unix.
This commit is contained in:
parent
a810de8ed7
commit
7145976cf8
43
culture-unix/COMMERCIAL.md
Normal file
43
culture-unix/COMMERCIAL.md
Normal file
|
@ -0,0 +1,43 @@
|
|||
# Formation Initiation Linux (2 jours)
|
||||
|
||||
Cette formation est destinée à toute personne souhaitant utiliser
|
||||
Linux, pour du développement, de l'administration système, ou pour un
|
||||
usage quotidien.
|
||||
|
||||
|
||||
## Stagiaires
|
||||
|
||||
Maximum 5 par sessions, pour commencer, peut monter à 7.
|
||||
|
||||
|
||||
## Pré-requis
|
||||
|
||||
Aucun.
|
||||
|
||||
|
||||
## Objectifs pédagogiques
|
||||
|
||||
- Pouvoir utiliser une machine sous Linux au quotidien.
|
||||
- Être à l'aise avec les interfaces en ligne de commande.
|
||||
- Savoir installer et utiliser des logiciels.
|
||||
- Manipuler des fichiers, des données.
|
||||
|
||||
|
||||
## Plan
|
||||
|
||||
### Jour 1
|
||||
|
||||
- Présentation de l'environnement Linux.
|
||||
- Maniement de l'émulateur de terminal.
|
||||
- Approche des commandes classiques :
|
||||
- `man`, `cd`, `ls`, `pwd`, `mv`, `cp`, `rm`, `less`, …
|
||||
- Installer, désinstaller des applications depuis le gestionnaire de paquets.
|
||||
|
||||
|
||||
### Jour 2
|
||||
|
||||
- L'accès à l'extérieur avec `ssh`, `rsync`, `curl`, et gestion des sauvegardes.
|
||||
- Introduction à la gestion de sources en utilisant `git`.
|
||||
- Manipulation de données en utilisant `awk`, `sed`, `grep`, `find`.
|
||||
- L'édition de texte depuis un terminal en utilisant `emacs`.
|
||||
- Approche du système de fichier : les droits, la sécurité, `mount`.
|
304
culture-unix/README.md
Normal file
304
culture-unix/README.md
Normal file
|
@ -0,0 +1,304 @@
|
|||
# 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).
|
||||
|
||||
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/
|
Loading…
Reference in New Issue
Block a user