Upgrade to Pro — share decks privately, control downloads, hide ads and more …

(Re) Découvrir les outils UNIX

(Re) Découvrir les outils UNIX

Votre logiciel hang, vous ne savez pas pourquoi ? Ou votre application préférée ne lit pas sa configuration et vous ne savez pas pourquoi ? Il existe beaucoup d'outils fournis avec Linux. Pourtant beaucoup de développeurs ne les connaissent pas ou ne les utilisent pas. A travers une série de cas d'utilisation, nous verrons comment utiliser tout ces outils: grep, find, xargs, strace, tcpdump, lsof

Grégoire Pineau

November 19, 2021
Tweet

More Decks by Grégoire Pineau

Other Decks in Technology

Transcript

  1. (Re) Découvrir
    les outils UNIX

    View Slide

  2. Je suis Grégoire Pineau
    Développeur @JoliCode
    Core Team @symfony
    twitter.com/@lyrixx
    github.com/@lyrixx
    Bonjour!
    2

    View Slide

  3. 3

    View Slide

  4. 4
    Disclaimer
    ● Crescendo
    ● Slides

    View Slide

  5. Le shell
    La où tout se passe
    1
    5

    View Slide

  6. 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

    View Slide

  7. 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

    View Slide

  8. ● 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

    View Slide

  9. ● 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)

    View Slide

  10. ● \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)

    View Slide

  11. Une commande
    2
    11

    View Slide

  12. 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, …)

    View Slide

  13. 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)

    View Slide

  14. 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)

    View Slide

  15. Help
    On peut trouver de l’aide via
    ● my_command --help (convention)
    ● man my_command
    ● https://tldr.sh/ (site web et commande)
    15

    View Slide

  16. man++
    16
    man() {
    env \
    LESS_TERMCAP_mb=$(printf "\e[1;31m") \
    LESS_TERMCAP_md=$(printf "\e[1;31m") \
    LESS_TERMCAP_me=$(printf "\e[0m") \
    LESS_TERMCAP_se=$(printf "\e[0m") \
    LESS_TERMCAP_so=$(printf "\e[1;41;37m") \
    LESS_TERMCAP_ue=$(printf "\e[0m") \
    LESS_TERMCAP_us=$(printf "\e[1;35m") \
    man "$@"
    }

    View Slide

  17. Les outils Unix
    3
    17

    View Slide

  18. Use case #1
    18
    Afficher l'arborescence
    d’un dossier :
    tree
    Afficher les permissions
    d’un dossier récursivement
    namei -ol /path/to/file

    View Slide

  19. Use case #2
    Extraire la troisième colonne d’un CSV
    cut -d ';' -f 3 with-markers-500000.csv
    ● -d : delimiteur
    ● -f : field
    19

    View Slide

  20. Use case #3
    Connaître qui commit le plus sur un projet git
    20

    View Slide

  21. Use case #3
    Connaître qui commit le plus sur un projet git
    21

    View Slide

  22. Use case #3
    Connaître qui commit le plus sur un projet git
    22

    View Slide

  23. Use case #3
    Connaître qui commit le plus sur un projet git
    23

    View Slide

  24. 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

    View Slide

  25. 25
    Use case #4
    Comment stopper tous les container docker d’un
    projet ?

    View Slide

  26. 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

    View Slide

  27. 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

    View Slide

  28. Use case #6
    Vérifier périodiquement ce qu’il se passe ?
    watch -n 1 ls -lh
    ● -n : intervale
    28

    View Slide

  29. Use case #7
    Stopper un processus après 30 secondes
    timeout 30 sleep 60
    29

    View Slide

  30. Use case #8
    Passer l'exécution d’une commande en tâche de fond
    sleep 60
    CTRL+Z
    jobs
    bg # ou fg
    30

    View Slide

  31. 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

    View Slide

  32. 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

    View Slide

  33. 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

    View Slide

  34. Use case #12
    Comprendre pourquoi un logiciel bloque sans lire
    le code
    $dom = new \DOMDocument();
    $dom->loadHTML('');
    $dom->validate();
    34

    View Slide

  35. 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

    View Slide

  36. Use case #13
    36
    Où placer la configuration d’un logiciel, sans lire la
    doc ni le code ?
    strace -e file -o log git

    View Slide

  37. Use case #14
    37
    Vérifier les appels réseaux d’un logiciel
    strace -e network -e /sendmmsg php index.php

    View Slide

  38. 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

    View Slide

  39. Quelques outils
    pratiques
    4
    39

    View Slide

  40. 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

    View Slide

  41. Conclusion
    5
    41

    View Slide

  42. Des questions ?
    Slide: https://bit.ly/3FI79wV
    You can find me at
    ◉ https://twitter.com/lyrixx
    ◉ https://github.com/lyrixx
    Merci!
    42

    View Slide