Julien Palard julien@palard.fr
https://mdk.fr
::: notes
Introduce yourself!
mdk@seraph$ date Thu May 25 03:37:25 PM CEST 2023 mdk@seraph$ cal May 2023 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
On exécute des « commandes » ou des « programmes ».
Ces programmes peuvent prendre des « arguments » ou des « paramètres ».
Dans :
$ date
$
date
notes:
Oui le prompt est modifiable, je veux dire qu'on ne peut pas l'effacer avec backspace.
$ man intro
man
intro
argument
Mais pourquoi !?
notes: démo ! Ctrl-r !
pwd
cd
ls
cp
mv
rm
mkdir
notes: Il n'y a pas de corbeille !
less
see
edit
grep
find
Write programs that do one thing and do it well.
Notes:
L'idée ici est d'éviter de dupliquer du code. Ne l'écrire qu'une fois, mais bien.
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 :
C'est de nombreuses heures de perdues, à réimplémenter inlassablement la même fonctionalité.
Write programs to work together.
notes: Pour pouvoir réutiliser un programme il faut qu'il s'interface correctement avec les autres :
Write programs to handle text streams, because that is a universal interface.
notes: 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.
Voici les programmes que j'utilise le plus :
$ history | awk '{print $2}' | sort | uniq -c | sort -gr 3408 git 902 cd 765 python 539 ls 385 emacs 330 curl 327 ssh 291 make 209 mv 188 rm ...
Pour jouer un peu avec le shell, on va utiliser Open Food Facts.
C'est un fichier de produits alimentaires.
Téléchargeons et décompressons le fichier :
$ curl -O https://fr.openfoodfacts.org/data/fr.openfoodfacts.org.products.csv.gz $ gunzip fr.openfoodfacts.org.products.csv.gz $ mv fr.openfoodfacts.org.products.csv products.csv
Attention, compressé il fait ~700M, décompressé ~8GB.
Peser le fichier :
$ du products.csv 8103812 products.csv
Ahh oui, 8 millions d'octets…
Plus humain :
$ du -h products.csv 7.8G products.csv
Compter les lignes :
$ wc -l products.csv 2864834 products.csv
Que contient-il ?
$ file products.csv products.csv: UTF-8 Unicode text, with very long lines
Lire le fichier :
$ less products.csv
Attention le fichier est gigantesque !
Obtenir les 10 premières lignes du fichier :
$ head products.csv code url creator created_t created_datetime ... ... 00000000000000225 http://world-fr.openfoodfacts.org/produit/00000000000000225/jeunes-pousses-endives... 0000000000000207025004 http://world-fr.openfoodfacts.org/produit/0000000000000207025004/andre... ... ...
$ head -n 1 products.csv | tr '\t' '\n' code url creator created_t created_datetime
$ head -n 1 products.csv | tr '\t' '\n' | wc -l 201
Parmis les colonnes je repère additives…
additives
$ head -n 1 products.csv | tr '\t' '\n' | grep -n additives 51:additives_n 52:additives 53:additives_tags 54:additives_fr
$ cut -f 51-54 products.csv | less
Je repère « E412 », je me demande si beaucoup de produits l'utilisent…
$ cut -f 51-54 products.csv | grep -c E412 44554
Je me demande quel est l'additif le plus utilisé…
$ cut -f 51-54 products.csv | > grep -oE 'E[0-9]{3}' | sort | uniq -c | sort -gr | head 196667 E322 153420 E330 114926 E500 61884 E160 56411 E415 54712 E450 49713 E471 44554 E412 44121 E202 42398 E150
Tout est fichier.
$ ls / bin home lib32 media root sys vmlinuz boot initrd.img lib64 mnt run tmp dev initrd.img.old libx32 opt sbin usr etc lib lost+found proc srv var
ou
$ man hier
$ cat /sys/class/power_supply/AC/online 1
SSH: Parler de clefs, conseiller ED25519
eval $(ssh-agent -s) ssh-add
Aborder les clefs physiques + Fido U2F
# 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.
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.
Donner en passant les raccourcis de base de bash et d'emacs :
ctrl-a
ctrl-e
ctrl-z
fg
bg
jobs
ctrl-k
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.
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, ...).
On ne parle plus de scp, scp c'est finit, RIP.
scp
Aborder rsnapshot si possible, digresser sur l'importance des sauvegardes.
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 :
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.
iconv