Je suis Grégoire Pineau
Développeur @JoliCode
Core Team @symfony
twitter.com/@lyrixx
github.com/@lyrixx
Bonjour!
2
Slide 3
Slide 3 text
3
Slide 4
Slide 4 text
4
Disclaimer
● Crescendo
● Slides
Slide 5
Slide 5 text
Le shell
La où tout se passe
1
5
Slide 6
Slide 6 text
Un shell Unix est un interpréteur de commandes.
Il se présente sous la forme d'une interface en
ligne de commande accessible depuis un terminal.
BASH, ZSH et fish sont des shell très populaires.
(https://fr.wikipedia.org/wiki/Shell_Unix)
6
Le shell
Slide 7
Slide 7 text
Le fichier ~/.bashrc vous appartient.
Il vous permet de personnaliser votre shell.
● Ajouter des alias : alias ls = "ls -lh"
● De changer le prompt
● De changer les couleurs
● Et plus encore
7
Votre shell
Slide 8
Slide 8 text
● Augmenter la portée du PATH
PATH="./node_modules/.bin:$PATH"
● Et du CDPATH
export CDPATH=".:$HOME:$HOME/dev/github.com"
8
Votre shell, Tips
Slide 9
Slide 9 text
● cd : va dans votre $HOME
● cd - : revient dans le dossier précédent
● cd . : reste dans le même dossier
mais actualise le path si il a changé
9
Votre shell, Tips (2)
Slide 10
Slide 10 text
● \ls : l’opérateur \ permet de ne pas utiliser un alias
● CTRL+R pour rechercher parmis son historique
● !! qui permet de rejouer la dernière commande
○ chown -R gregoire: v3/
○ sudo !!
10
Votre shell, Tips (3)
Slide 11
Slide 11 text
Une commande
2
11
Slide 12
Slide 12 text
12
Une commande
Une commande est une instruction
Une commande peut être:
● Une built-in shell (cd, echo, exec, exit, kill, ...)
● Un binaire (mkdir, ls, ip, git, …)
Slide 13
Slide 13 text
13
La communication
Une commande peut communiquer avec le monde extérieur via:
● Des options ou arguments (ls -l, mkdir -p foo, …)
● Des variables d'environnement (FOO=bar my-command)
● Les flux d’I/O : STDIN, STDOUT, STDERR, ...
● (et d’autres techniques non abordées ici)
(https://man7.org/linux/man-pages/man2/execve.2.html)
Slide 14
Slide 14 text
14
Les flux d’I/O
Les flux d’I/O permettent d'interagir avec des File
Descriptor
echo Hello > my-file.txt
cat < my-file.txt
echo Hello | cat
(https://man7.org/linux/man-pages/man3/stdout.3.html)
Slide 15
Slide 15 text
Help
On peut trouver de l’aide via
● my_command --help (convention)
● man my_command
● https://tldr.sh/ (site web et commande)
15
Use case #1
18
Afficher l'arborescence
d’un dossier :
tree
Afficher les permissions
d’un dossier récursivement
namei -ol /path/to/file
Slide 19
Slide 19 text
Use case #2
Extraire la troisième colonne d’un CSV
cut -d ';' -f 3 with-markers-500000.csv
● -d : delimiteur
● -f : field
19
Slide 20
Slide 20 text
Use case #3
Connaître qui commit le plus sur un projet git
20
Slide 21
Slide 21 text
Use case #3
Connaître qui commit le plus sur un projet git
21
Slide 22
Slide 22 text
Use case #3
Connaître qui commit le plus sur un projet git
22
Slide 23
Slide 23 text
Use case #3
Connaître qui commit le plus sur un projet git
23
Slide 24
Slide 24 text
Use case #3
Connaître qui commit le plus sur un projet git
git log --format=%an | \
sort | uniq -c | sort -rn
● uniq -c : count
● sort -r : reverse
● sort -n : number 24
Slide 25
Slide 25 text
25
Use case #4
Comment stopper tous les container docker d’un
projet ?
Slide 26
Slide 26 text
26
Use case #4 (suite)
● grep : pour chercher
● awk : pour extraire
● xargs : pour construire une commande et
l'exécuter
docker ps | grep ^app_ | awk '{print $1}' | xargs docker stop
docker stop app_c5 app_c4 app_c3 app_c2 app_c1
Slide 27
Slide 27 text
Use case #5
Générer un gros fichier pour tester un upload
dd if=/dev/zero of=my-file.date count=1M bs=1k
● if : input file
● of : output file
● count : nombre de bloc
● bs : taille d’un bloc
27
Slide 28
Slide 28 text
Use case #6
Vérifier périodiquement ce qu’il se passe ?
watch -n 1 ls -lh
● -n : intervale
28
Slide 29
Slide 29 text
Use case #7
Stopper un processus après 30 secondes
timeout 30 sleep 60
29
Slide 30
Slide 30 text
Use case #8
Passer l'exécution d’une commande en tâche de fond
sleep 60
CTRL+Z
jobs
bg # ou fg
30
Slide 31
Slide 31 text
Use case #9
Ouvrir un tunnel en SSH pour accéder à un
serveur de prod
ssh -TL 1234:192.168.2.206:9200 \
my-server.io
● -L : tunnel
● -T : pas d’allocation de terminal
31
Slide 32
Slide 32 text
Use case #10
Lister les fichiers ouverts par Chrome
pgrep chrome | xargs -l1 lsof -p
● xargs -p1 : exécute la commande pour
chaque résultat
● lsof -p : LiSt Open File pour le PID
32
Slide 33
Slide 33 text
Use case #11
Trouver quel processus utilise le port 9999
lsof -P -n -i :9999
● -P : ne résound pas les ports
● -n : ne résound pas “network number”
● -i :999 : selectionne le port 9999
33
Slide 34
Slide 34 text
Use case #12
Comprendre pourquoi un logiciel bloque sans lire
le code
loadHTML('');
$dom->validate();
34
Slide 35
Slide 35 text
Use case #12 (suite)
35
Strace permet d’intercepter tous les appels system au
kernel
strace -s 65000 php index.php
[...]
sendto(7, "GET /TR/REC-html40/loose.dtd
HTTP/1.1\r\nHost: www.w3.org\r\nConnection:
close\r\n\r\n", 78, MSG_DONTWAIT, NULL, 0) = 78
Slide 36
Slide 36 text
Use case #13
36
Où placer la configuration d’un logiciel, sans lire la
doc ni le code ?
strace -e file -o log git
Slide 37
Slide 37 text
Use case #14
37
Vérifier les appels réseaux d’un logiciel
strace -e network -e /sendmmsg php index.php
Slide 38
Slide 38 text
Use case #15
38
Vérifier les appels réseaux entre votre app et ES
tcpdump -Apni any port 9200 and host elasticsearch
💡 Wireshark permet de
visualiser les logs de manière
plus confortable
Slide 39
Slide 39 text
Quelques outils
pratiques
4
39
Slide 40
Slide 40 text
40
Outils non standards
● RipGreg (rg) : comme grep, mais plus rapide
● tmux : multiplexer des terminaux
● dnsmasq : serveur DNS très leger
● ngrok : exposer son laptop sur internet
● transfer.sh : partager des fichiers en CLI
● httpie : comme curl, mais orienté REST
● jq : pour filtrer du JSON
● explainshell.com : explique une commande
Slide 41
Slide 41 text
Conclusion
5
41
Slide 42
Slide 42 text
Des questions ?
Slide: https://bit.ly/3FI79wV
You can find me at
◉ https://twitter.com/lyrixx
◉ https://github.com/lyrixx
Merci!
42