Aller au contenu principal

Cours - Découverte du terminal et de la ligne de commande

Premier contact avec le terminal​

Installer une machine virtuelle​

  • Un ordinateur "simulé" dans un ordinateur
    • VirtualBox est un logiciel permettant ce genre de chose
  • Une machine virtuelle possède tous les élément d'une vraie machine, mais en virtuelle :
    • un clavier et une souris virtuelles
    • un écran virtuel
    • un disque dur virtuel
    • de la RAM virtuel
    • un processeur virtuel
    • un lecteur CD virtuel
    • ...
  • Parti pris pour l'OS : Linux Mint avec Cinnamon, et pré-installé

Installer une machine pour s'exercer​

Avec virtualbox : il s'agit d'un logiciel pour virtualiser des ordinateurs (VM)​

  • Il est à la fois simple et open source donc c'est une bonne alternative

Installation​

  • A télécharger et installer depuis https://virtualbox.org sur Windows ou MacOS
  • A installer avec le gestionnaire de paquet sur Linux (voir partie gestionnaire de paquet)

Première machine virtuelle​

Il est possible soit

OSBoxes : un site qui fourni des images Linux pré-installées

Télécharger une Linux Mint préinstallée sur OSboxes.org

  • Installer Virtualbox
  • Créer une nouvelle machine virtuelle
    • De type Linux / Other-linux (64 bit)
    • 2048 Mo de RAM devraient suffir
    • Au moment de choisir le disque dur : fournir le fichier VDI de OSboxes / Linux Mint
  • Démarrer la machine et observer les étapes de démarrage
  • Mot de passe : ilovelinux

Se connecter​

Pour cette première connexion, nous allons passer par un tty plutôt que par le login graphique.

Pour ce faire, appuyer sur Ctrl+Alt+F2 (ou F3, F4, ...)

Debian Stretch <nom_de_machine> tty0

<nom_de_machine> login: █
...
<nom_de_machine> login: votre_login
Password: █ # <<<< le mot de passe ne s'affiche pas du tout quand on le tape !

...
Last login: Wed 19 Sep 16:23:42 on tty2
votre_login@machine:~$

Premières commandes​

Changez votre mot de passe :

  • Taper passwd puis Entrée puis suivez les instructions
votre_login@machine:~$ passwd
Changing password for votre_login.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
votre_login@machine:~$ █

Premières commandes​

  • Taper pwd puis Entrée et observer
  • Taper ls puis Entrée et observer
  • Taper cd /var puis Entrée et observer
  • Taper pwd puis Entrée et observer
  • Taper ls puis Entrée et observer
  • Taper ls -l puis Entrée et observer
  • Taper echo 'Je suis dans la matrice' puis Entrée et observer

Discussion​

  • Nous nous sommes connecté à une machine
  • Nous avons eu accès à un terminal
  • Le terminal permet de taper des commandes pour interagir "directement" avec l'OS
  • Des commandes comme dans "passer commande"
  • Certaines affichent des choses, d'autres changent des états
  • Vous pouvez ouvrir d'autres TTy / consoles avec Ctrl+Alt+F1, F2, F3, ..

Origine historique : le tty (teletype)​

La ligne de commande​

Structure d'une commande​

  evince  --fullscreen     presentation.pdf
| '------------' '------------'
| | |
v v v
nom argument 1 argument 2
(une option)
  • Des options longues (classiquement avec --) comme --fullscreen
  • Des options courtes correspondantes (classiquement avec -) comme -f

(des fois, il y a seulement l'option courte ou seulement l'option longue)

Une commande peut être simple :

cd

ou assez complexe :

dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service

Effet d'une commande​

Certaines commandes affichent des choses :

alex@shadow~$ ls -l /var/
total 36
drwxr-xr-x 2 root root 4096 Jul 11 12:58 backups
drwxr-xr-x 13 root root 4096 Jul 8 00:28 cache
drwxr-xr-x 51 root root 4096 Jul 8 00:28 lib

D'autres font des choses sans rien afficher (generalement veut dire que ça a marché) :

alex@shadow:~$ mkdir /var/toto
alex@shadow:~$

Eventuellement, je valide en réutilisant ls pour voir que le dossier a bien été créé

Mais les commandes il faut toute les apprendre par coeur ...?​

  • Il y en a des milliers (et on peut créer les siennes)
  • Chacune peut avoir des dizaines d'options combinables entre elles
  • Il ne s'agit pas de connaitre les commandes par coeur mais plutôt
    • d'avoir une vue d'ensemble des possibilités
    • de savoir aller chercher et apprendre de nouvelles commandes si besoin
    • savoir être méthodique et débugger les erreurs du quotidien (typo, ...)

Méthode de travail : le Tai Chi du terminal​

  • Je recule la tête de mon écran et réfléchi à ce que je veux faire
  • Je regarde où j'en suis
  • J'écris ma commande
  • Je relis attentivement ce que je viens de taper
  • J'appuie sur entrée
  • J'enlève les mains du clavier pour regarder l'effet produit
  • Je LIS ATTENTIVEMENT et analyse la réponse de la machine pour valider que c'est ce à quoi je m'attendais
    • Je ne culpabilise pas ni ne désespère si il y a un message d'erreur - c'est normal et arrive à tout le monde tout le temps !
    • Si je pense que ça a marché, je valide via une autre commande (e.g. verifier avec ls que le dossier à bien été créé)

passwd - Changer son password​

pwd - Afficher le dossier courant​

Print current working directory

cd - Naviguer dans les dossiers​

cd  /un/dossier   # Change de dossier courant
cd # Revient dans le home
cd .. # Remonte d'un dossier (par exemple /home si on était dans /home/alex)
cd - # Retourne dans le dossier où on était juste avant

N.B : On ne peut pas faire cd /un/fichier ! Ça n'a pas de sens !

ls - Liste les fichiers d'un dossier​

ls            # Liste les fichiers du repertoire courant
ls /usr/bin # Liste les fichiers du repertoire /usr/bin
ls -a # (ou --all) Liste les fichiers (y compris cachés)
ls -l # Avec des détails (type, permissions, proprio, date de modif)
ls -t # Trie par date de modification
ls -h # (ou --human-readable) Tailles lisibles comme '24K' ou '3G'

(on peut combiner les options et arguments)

  • Utiliser ls et cd, c'est comme naviguer avec un explorateur de fichier graphique !
ls *.py        # Liste tous les fichiers du repertoire courant finissant par .py
ls *.py *.png # Liste tous les fichiers du repertoire courant finissant par .py ou *.png
ls *.{py,png} # Liste tous les fichiers du repertoire courant finissant par .py ou *.png
echo ls *.{py,.png} # Affiche la commande precedente telle qu'elle va être executée
  • * corresponds à un "joker" / wildcard, et est interprété comme "n'importe quelle suite de caractère"
  • utile pour spécifier "tous les fichiers qui suivent un même format"
  • l'expansion survient avant que la commande soit éxécutée et se fait par rapport aux fichiers du dossier courant
  • Par ex:
    • Si le dossier contient les fichiers foo.py et bar.py
    • ... alors taper ls *.py équivaut à taper ls foo.py bar.py
    • ... et taper juste * équivant à taper foo.py bar.py
    • ... et on peut écrire ls '*.py' pour parler d'un fichier qui s'apelle littéralement *.py

Nettoyer son terminal​

  • clear efface tout ce qui est affiché dans le terminal
  • reset permet de réinitialiser le terminal (utile pour certaines situation où le terminal est "cassé")
  • exit permet de fermer un terminal
  • (logout est similaire à exit)

Obtenir de l'aide sur des commandes​

man nom_de_commande

(mode paginateur: navigation avec les fleches, /mot pour chercher un mot, q pour quitter)

Ou avec --help ou -h :

nom_de_comande --help
  • Si une commande prends trop longtemps, il est possible de l'annuler avec [Ctrl]+C
alex@shadow:~$ sleep 30
[...]
[Ctrl]+C
alex@shadow:~$
  • [Ctrl]+C est à utiliser avec parcimonie ! Interrompre certaines commande peut causer des problèmes...
  • (N.B. : [Ctrl]+C / [Ctrl]+V ne fais pas copier/coller dans la console !)

Copier-coller dans le terminal​

(Dans tous les cas, on commence par selectionner le texte avec la souris)

  • Méthode 1. Clic droit "copier", clic droit "coller"
  • Méthode 2. Ctrl + Insert, Shift + Insert
  • Méthode 3. Clic du milieu

Raccourcis et astuces de ninja​

[Tab]​

  • [Tab] x1 permet d'autocompléter les noms de commande et les noms de fichier (si pas d'ambiguité)
  • [Tab] x2 permet de suggérer les différentes possibilités
  • Double-effect kisscool : utiliser [Tab] vous permet de valider au fur à mesure que la commande et le fichier existe !

Historique​

  • Vous pouvez utiliser ↑ pour retrouver les commandes précédentes
  • Ou aussi : history

Utilisez [Tab] !​

Utilisez [Tab] !​

Utilisez [Tab] !​

Utilisez [Tab] !​

Utilisez [Tab] !​

Utilisez [Tab] !​

et LISEZ ATTENTIVEMENT ce que la machine vous raconte !​

4. Le système de fichier​

4. Le système de fichier​

Généralités​

  • (En anglais : filesystem, abrégé fs)
  • La façon dont sont organisés et référencé les fichiers
  • Une abstraction de la mémoire
  • Analogie : une bibliothèque avec seulement les pages des livres dans les étagères
  • Le fs connait le nom, la taille, l'emplacemenent des différents morceaux, la date de création, ...

4. Le système de fichier​

Partitionnement d'un disque​

  • Un disque peut être segmenté en "partitions"
  • Chaque partition héberge des données indépendantes des autres et sous un format / filesystem différent

4. Le système de fichier​

Quelques systèmes de fichier classiques​

  • FAT16, FAT32 : disquettes, Windows 9x (~obsolète)
  • NTFS : système actuellement utilisé par Windows
  • EXT3, EXT4 : système typiquement utilisé par Linux (Ubuntu, Mint, ...)
  • HFS+ : système utilisé par MacOS
  • TMPFS : système de fichier pour gérer des fichiers temporaires (/tmp/)

4. Le système de fichier​

Quelques systèmes de fichier "avancés"​

  • ZFS
    • snapshots
    • haute dispo
    • gestion RAID, auto-réparation, diverses optimisations
  • BTRFS / "better FS"
    • similaire à zfs, mais la peinture est encore fraiche
  • LVM (gestionnaire de volumes logiques)
    • snapshots
    • gestion flexible des partitions "à chaud"
    • fusion de plusieurs disques
  • RAID n
    • un ensemble de schema d'architecture de disque pour créer de la redondance en cas de perte de disque
    • données copiées sur plusieurs disques (grappe)

4. Le système de fichier​

Quelques systèmes de fichier exotiques(?) / autre​

  • Tahoe-LAFS
  • FUSE
  • IPFS

4. Le système de fichier​

Sous UNIX / Linux : "Tout est fichier"​

  • fichiers ordinaires (-) : données, configuration, ... texte ou binaire
  • répertoires (directory, d) : gérer l'aborescence, ...
  • spéciaux :
    • block et char (b, c) (clavier, souris, disque, ...)
    • sockets (s), named pipe (p) (communication entre programmes)
    • links (l) ('alias' de fichiers, ~comme les raccourcis sous Windows)

4. Le système de fichier​

Un fichier​

  • Un inode (numéro unique représentant le fichier)
  • Des noms (chemins d'accès)
    • Un même fichier peut être à plusieurs endroits en meme temps (hard link)
  • Des propriétés
    • Taille
    • Permissions
    • Date de création, modification

4. Le système de fichier​

Nommage des fichiers​

  • Noms sensibles à la casse
  • (Eviter d'utiliser des espaces)
  • Un fichier commençant par . est "caché"
  • Les extensions de fichier sont purement indicatives : un vrai mp3 peut s'apeller musique.jpg et vice-versa
  • Lorsqu'on parle d'un dossier, on l'ecrit plutôt avec un / à la fin pour expliciter sa nature

4. Le système de fichier​

Arborescence de fichier​

coursLinux/
├── dist/
│   ├── exo.html
│   └── presentation.html
├── exo.md
├── img/
│   ├── whatisthissorcery.jpg
│   └── bottomlesspit.png
├── presentation.md
└── template/
   ├── index.html
   ├── remark.min.js
   └── style.scss

4. Le système de fichier​

Filesystem Hierarchy Standard​

4. Le système de fichier​

Filesystem Hierarchy Standard​

  • / : racine de toute la hierarchie
  • /bin/, /sbin/ : programmes essentiels (e.g. ls)
  • /boot/ : noyau et fichiers pour amorcer le système
  • /dev/, /sys : périphériques, drivers
  • /etc/ : fichiers de configuration
  • /home/ : répertoires personnels des utilisateurs
  • /lib/ : librairies essentielles
  • /proc/, /run : fichiers du kernel et processus en cours
  • /root/ : répertoire personnel de root
  • /tmp/ : fichiers temporaires
  • /usr/ : progr. et librairies "non-essentielles", doc, données partagées
  • /var/ : fichiers / données variables (e.g. cache, logs, boîtes mails)

4. Le système de fichier​

Répertoires personnels​

  • Tous les utilisateurs ont un répertoire personnel
  • Classiquement /home/<user>/ pour les utilisateurs "normaux"
  • Le home de root est /root/
  • D'autres utilisateurs ont des home particulier (/var/mail/, ...)

4. Le système de fichier​

Designation des fichiers​

"Rappel" :

  • . : désigne le dossier actuel
  • .. : désigne le dossier parent
  • ~ : désigne votre home

Un chemin peut être :

  • Absolu : /home/alex/dev/yunohost/script.sh
  • Relatif : ../yunohost/script.sh (depuis /home/alex/dev/apps/)

Un chemin relatif n'a de sens que par rapport à un dossier donné... mais est souvent moins long à écrire

4. Le système de fichier​

Designation des fichiers​

  • Pour parler d'un dossier ou fichier toto dans le répertoire courant
ls toto
## ou bien
ls ./toto
  • Pour parler d'un dossier ou fichier toto à la racine
ls /toto

4. Le système de fichier​

Chemins relatifs​

  • d'exemples, tous équivalents (depuis /home/alex/dev/apps/)
  • /home/alex/dev/yunohost/script.sh
  • ~/dev/yunohost/script.sh
  • ../yunohost/script.sh
  • ./../yunohost/script.sh
  • ./wordpress/../../yunohost/script.sh
  • ../.././music/.././../camille/.././alex/dev/ynh-dev/yunohost/script.sh

4. Le système de fichier​

Manipuler des fichiers (1/5)​

  • ls : lister les fichiers
  • cat <fichier> : affiche le contenu d'un fichier dans la console
  • wc -l <fichier> : compte le nombre de lignes dans un fichier

Exemples :

ls /usr/share/doc/                       # Liste les fichiers de /usr/share/doc
wc -l /usr/share/doc/nano/nano.html # 2005 lignes !

4. Le système de fichier​

Manipuler des fichiers (2/5)​

  • head <fichier>, tail <fichier> : affiche les quelques premières ou dernières ligne du fichier
  • less <fichier> : regarder le contenu d'un fichier de manière "interactive" (paginateur)
    • ↑, ↓, ⇑, ⇓ pour se déplacer
    • /mot pour chercher un mot
    • q pour quitter
tail -n 30 /usr/share/doc/nano/nano.html # Affiche les 30 dernieres lignes du fichier
less /usr/share/doc/nano/nano.html # Regarder interactivement le fichier

4. Le système de fichier​

Manipuler des fichiers (2/5)​

4. Le système de fichier​

Manipuler des fichiers (3/5)​

  • touch <fichier> : créer un nouveau fichier, et/ou modifie sa date de modification
  • nano <fichier> : éditer un fichier dans la console
    • (nano créera le fichier si besoin)
    • [Ctrl]+X pour enregistrer+quitter
    • [Ctrl]+W pour chercher
    • [Alt]+Y pour activer la coloration syntaxique
  • vi ou vim <fichier> : alternative à nano
    • plus puissant (mais plus complexe)

4. Le système de fichier​

Manipuler des fichiers (4/5)​

  • cp <source> <destination> : copier un fichier
  • rm <fichier> : supprimer un fichier
  • mv <fichier> <destination> : déplace (ou renomme) un fichier

Exemple

cp cours.html coursLinux.html  # Créée une copie avec un nom différent
cp cours.html ~/bkp/linux.bkp # Créée une copie de cours.html dans /home/alex/bkp/
rm cours.html # Supprime cours.html
mv coursLinux.html linux.html # Renomme coursLinux.html en linux.html
mv linux.html ~/archives/ # Déplace linux.html dans ~/archives/

4. Le système de fichier​

Manipuler des fichiers (5/5)​

  • wget : télécharger un fichier depuis les Internets

Exemple

$ wget https://dismorphia.info/documents/formationLinux/toto

--2021-12-05 17:12:45-- https://dismorphia.info/documents/formationLinux/toto
Resolving dismorphia.info (dismorphia.info)... 92.92.115.142
Connecting to dismorphia.info (dismorphia.info)|92.92.115.142|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6 [application/octet-stream]
Saving to: ‘toto’

toto 100%[=============>] 6 --.-KB/s in 0s

2021-12-05 17:12:46 (3.20 MB/s) - ‘toto’ saved [6/6]
$ cat toto
pouet

4. Le système de fichier​

Manipuler des dossiers (1/3)​

  • pwd : connaître le dossier de travail actuel
  • cd <dossier> : se déplacer vers un autre dossier

4. Le système de fichier​

Manipuler des dossiers (2/3)​

  • mkdir <dossier> : créer un nouveau dossier
  • cp -r <source> <destination> : copier un dossier et l'intégralité de son contenu

Exemples :

mkdir ~/dev           # Créé un dossier dev dans /home/alex
cp -r ~/dev ~/dev.bkp # Créé une copie du dossier dev/ qui s'apelle dev.bkp/
cp -r ~/dev /tmp/ # Créé une copie de dev/ et son contenu dans /tmp/

4. Le système de fichier​

Manipuler des dossiers (3/3)​

  • mv <dossier> <destination> : déplace (ou renomme) un dossier
  • rmdir <dossier> : supprimer un dossier vide
  • rm -r <dossier> : supprimer un dossier et tout son contenu récursivement

Exemples :

mv dev.bkp  dev.bkp2   # Renomme le dossier dev.bkp en dev.bkp2
mv dev.bkp2 ~/trash/ # Déplace dev.bkp2 dans le dossier ~/trash/
rm -r ~/trash # Supprime tout le dossier ~/trash et son contenu

4. Le système de fichier​

  • ln <source> <destination>
  • Le même fichier ... à plusieurs endroits !
  • Supprimer une instance de ce fichier ne supprime pas les autres

4. Le système de fichier​

  • ln -s <cible> <nom_du_lien>
  • Similaire à un "raccourci", le fichier n'est pas vraiment là .. mais comme si
  • Supprimer le fichier pointé par le symlink "casse" le lien

4. Le système de fichier​

  • Dans ce exemple, le lien a été créé avec
    • ln -s ../../../conf/ynh.txt conf.json
  • conf.json est "le raccourci" : on peut le supprimer sans problème
  • ynh.txt est la cible : le supprimer rendra inopérationnel le raccourci

4. Le système de fichier​

  • On croise plus souvent des symlinks que des hardlinks (les symlinks sont + intuitifs)
  • On peut avoir des symlinks de répertoires (à la différence des hardlinks)
    • Attention tout de même à certains comportements étrange (.. en étant à l'intérieur d'un symlink)
  • On peut avoir des symlinks entre des filesystem différents ! (à la différence des hardlinks)

4. Le système de fichier​

Recap dossiers importants (l'essentiel)​

  • /home/<user>/ : le répertoire personnel de <user>
  • /etc/ : là où habitent les fichiers de configuration
  • /var/log/ : là ou habitent les fichiers de logs
  • /root/ : le répertoire personnel de root

4. Le système de fichier​

Recap des commandes​

  • ls : lister les fichiers d'un dossier
  • cat : afficher le contenu d'un fichier
  • head, tail : afficher les N premières / dernière ligne d'un fichier
  • less : afficher le contenu d'un fichier avec un mode interactif
  • touch : créer un fichier vide (ou changer sa date de modif sans rien faire)
  • nano, vim : éditer un fichier (et le créer si besoin)
  • cp : copier un fichier (ou dossier avec -r)
  • mv : déplacer ou renommer un fichier ou un dossier
  • rm : supprimer un fichier (ou un dossier avec -r)
  • wc -l : compter les lignes d'un fichier
  • ln -s : créer un lien symbolique
  • wget : télécharger un fichier sur les Internets

5. Utilisateurs et groupes​

5. Utilisateurs et groupes​

Généralités​

  • une entité / identité (!= être humain) qui demande des choses au système
  • possède des fichiers, peut en créer, modifier, naviguer, ...
  • peut lancer des commandes / des processus

5. Utilisateurs et groupes​

Répertoire des utilisateurs​

Classiquement, les utilisateurs sont répertoriés dans /etc/passwd

alex:x:1000:1000:Super Formateur Linux:/home/alex:/bin/bash
  • identifiant / login
  • x (historique)
  • uid (id utilisateur)
  • gid (id de groupe)
  • commentaire
  • répertoire home
  • shell de démarrage

5. Utilisateurs et groupes​

root​

  • Dieu sur la machine, uid=0, gid=0
  • With great power comes great responsabilities
    • Si un attaquant devient root, l'OS est entièrement compromis (à jamais)

5. Utilisateurs et groupes​

Parenthèse sur la terminologie​

Le terminal / la console​

Dans le temps, il s'agissait d'une machine sans interface graphique, similaire à un minitel qui permettait d'interagir avec le "vrai" ordinateur (mainframe) à distance.

De nos jours, par abus de language un terminal est en fait un émulateur de terminal, c'est-à-dire un programme qui émule la même fonctionnalité. (La distinction terminal/mainframe a disparu)

Le shell​

Il s'agit du programme qui gère l'invite de commande et l'execution des commandes tapées.

Classiquement, il s'agit de bash. Il existe d'autres shell comme sh, zsh, fish, ...

Lorsque l'on programme dans certains languages de scripting, on parle aussi de shell python, perl, ruby, javascript, ...

Un shell que vous utilisez peut potentiellement être situé sur une autre machine que celle devant laquelle vous êtes !

5. Utilisateurs et groupes​

Passer root (ou changer d'utilisateur)​

su                  # Demande à ouvrir un shell en tant que root
su camille # Demande à ouvrir un shell en tant que camille
su -c "ls /root/" # Executer 'ls /root/' en tant que root (de manière ephemere)
exit # Quitter un shell

5. Utilisateurs et groupes​

Sudo​

  • On peut autoriser les utilisateurs à faire des choses en root en leur donnant les droits 'sudo'
su -c "ls /root/"   # Executer 'ls /root/' en tant que root (de manière ephemere)
sudo ls /root/ # Meme chose mais avec sudo
sudo whoami # Renvoie "root"
sudo su # Ouvrir un shell root via sudo...
  • Suivant la commande demandée, le mot de passe n'est pas le même...
    • su : mot de passe root
    • sudo : mot de passe utilisateur

5. Utilisateurs et groupes​

su vs sudo​

  • Generalement, on essaye de ne pas rester en root constamment.
    • sudo permet de faire juste une commande en root, ponctuellement
  • On peut avoir plusieurs personnes partageant des droits d'administrateur
    • avec sudo, pas besoin de se mettre d'accord sur un mot de passe commun
  • sudo permet aussi de garder une historique "par utilisateur / être humain" de qui à fait quoi sur la machine
    • chaque commande effectuée avec sudo est logguée dans /var/log/auth.log
    • utile pour les audits de sécurité

5. Utilisateurs et groupes​

Les groupes​

  • Chaque user à un groupe associé qui possède le même nom
  • Des groupes supplémentaires peuvent être créés
  • Ils permettent ensuite de gérer d'accorder des permissions spécifiques
  • Ils sont indexés dans le fichier /etc/group (similaire à /etc/passwd)

Exemples de groupes qui pourraient exister:

  • students
  • usb
  • power

N.B : lorsqu'on ajoute un utilisateur à un groupe, il doit se reloguer pour que le changement soit propagé...

5. Utilisateurs et groupes​

Mot de passe​

  • Autrefois dans /etc/passwd (accessibles à tous mais hashés)
  • Maintenant dans /etc/shadow (accessibles uniquement via root)
alex:$6$kncRwIMqSb/2PLv3$x10HgX4iP7ZImBtWRChTyufsG9XSKExHyg7V26sFiPx7htq0VC0VLdUOdGQJBJmN1Rn34LRVAWBdSzvEXdkHY.:0:0:99999:7:::

(Parenthèse sur le hashing)​

$ md5sum coursLinux.html
458aca9098c96dc753c41ab1f145845a

...Je change un caractère...

$ md5sum coursLinux.html
d1bb5db7736dac454c878976994d6480

(Parenthèse sur le hashing)​

Hasher un fichier (ou une donnée) c'est la transformer en une chaîne :

  • de taille fixe
  • qui semble "aléatoire" et chaotique (mais déterministe !)
  • qui ne contient plus l'information initiale

Bref : une empreinte caractérisant une information de manière très précise

5. Utilisateurs et groupes​

Commandes utiles​

whoami                  # Demander qui on est...!
groups # Demander dans quel groupe on est
id # Lister des infos sur qui on est (uid, gid, ..)
passwd <user> # Changer son password (ou celui de quelqu'un si on est root)
who # Lister les utilisateurs connectés
useradd <user> # Créé un utilisateur
userdel <user> # Supprimer un utilisateur
groupadd <group> # Ajouter un groupe
usermod -a -G <group> <user> # Ajouter un utilisateur à un groupe

6. Permissions​

6. Permissions​

Généralités​

  • Chaque fichier a :
    • un utilisateur proprietaire
    • un groupe proprietaire
    • des permissions associés
  • (root peut tout faire quoi qu'il arrive)
  • Système relativement minimaliste mais suffisant pour pas mal de chose
    • (voir SELinux pour des mécanismes avancés)
$ ls -l coursLinux.html
-rw-r--r-- 1 alex alex 21460 Sep 28 01:15 coursLinux.html

^ ^ ^
| | '- groupe proprio
| '- user proprio
les permissions !

6. Permissions​

6. Permissions​

6. Permissions​

Permissions des fichiers​

  • r : lire le fichier
  • w : écrire dans le fichier
  • x : executer le fichier

6. Permissions​

Permissions des dossiers​

  • r : lire le contenu du dossier
  • w : créer / supprimer des fichiers
  • x : traverser le répertoire

(On peut imager que les permissions d'un dossier soient r-- ou --x)

6. Permissions​

Gérer les propriétaires​

(Seul root peut faire ces opérations !!)

chown <user> <cible>          # Change l'user proprio d'un fichier
chown <user>:<group> <cible> # Change l'user et groupe proprio d'un fichier
chgrp <group> <cible> # Change juste le groupe d'un fichier

Exemples :

chown camille:students coursLinux.md  # "Donne" coursLinux.md à camille et au groupe students
chown -R camille /home/alex/dev/ # Change le proprio récursivement !

(ACHTUNG: si l'on fait un malencontreux chown -R, il peut être difficile de revenir en arrière)

6. Permissions​

Gérer les permissions​

chmod <changement> <cible>   # Change les permissions d'un fichier

Exemples

chmod u+w   coursLinux.html  # Donne le droit d'ecriture au proprio
chmod g=r coursLinux.html # Remplace les permissions du groupe par "juste lecture"
chmod o-rwx coursLinux.html # Enlève toutes les permissions aux "others"
chmod -R +x ./bin/ # Active le droit d'execution pour tout le monde et pour tous les fichiers dans ./bin/

(ACHTUNG: si l'on fait un malencontreux chmod -R, il peut être difficile de revenir en arrière)

6. Permissions​

Représentation octale​

6. Permissions​

6. Permissions​

Gérer les permissions .. en octal !​

chmod <permissions> <cible>

Exemples

chmod 700 coursLinux.html  # Fixe les permissions à rwx------
chmod 644 coursLinux.html # Fixe les permissions à rw-r--r--
chmod 444 coursLinux.html # Fixe les permissions à r--r--r--

6. Permissions​

Chown vs. chmod​

6. Permissions​

Lorsque l'on fait :

$ /etc/passwd

On tente d'executer le fichier !

Obtenir comme réponse

-bash: /etc/passwd: Permission denied

ne signifie pas qu'on a pas les droits de lecture sur le fichier, mais bien que l'on a "juste" pas le droit de l'executer (car ça n'a en fait pas de sens de chercher à l'executer)

6. Permissions​

Permissions "théoriques" vs permissions réelles​

Pour pouvoir accéder à /home/alex/img/pikachu.jpg j'ai besoin de :

  • Pouvoir entrer (x) dans le dossier /
  • Pouvoir entrer (x) dans le dossier /home/
  • Pouvoir entrer (x) dans le dossier /home/alex/
  • Pouvoir entrer (x) dans le dossier /home/alex/img/
  • Pouvoir lire (r) le fichier /home/alex/img/pikachu

6. Permissions​

Permissions "théoriques" vs permissions réelles​

Une commande pour lister toutes les permissions sur un chemin: namei -l

$ namei -l ~/img/pikachu.jpg
f: /home/alex/img/pikachu.jpg
drwxr-xr-x root root /
drwxr-xr-x root root home
drwxr-x--- alex alex alex
drwxr-xr-x alex alex img
-rw-r--r-- alex alex pikachu.jpg

6. Permissions​

On peut un peu casser son système si on fait chmod -x /

(plus personne n'a le droit de rentrer dans la racine !)

6. Permissions​

Permissions avancées : les ACL​

7. Processus​

7. Processus​

Généralités​

  • Un processus est une instance d'un programme en cours d'éxécution

  • (Un même programme peut tourner plusieurs fois sous la forme de plusieurs processus)

  • Un processus utilise des ressources :

    • code qui s'execute dans le CPU, ou en attente en cache/RAM
    • données du processus en cache/RAM
    • autres ressources (port, fichiers ouverts, ...)
  • Un processus a des attributs (iidentifiant, proprio, priorité, ...)

7. Processus​

Execution (1/2)​

La machine comprends seulement du code machine ("binaire").

Un programme est donc soit :

  • compilé (par ex. un programme en C)
  • interprété par un autre programme, qui lui est compilé (par ex. un programme en python, interprété par l'interpreteur python)

Rappel : UNIX est multi-tâche, multi-utilisateur

  • partage de temps, execution parallèle
  • coordonnées par le kernel

7. Processus​

Execution (2/2)​

Un processus est lancé soit :

  • en interactif (depuis un shell / la ligne de commande)
  • de manière automatique (tâche programmées, c.f. at et jobs cron)
  • en tant que daemon/service

En mode interactif, on peut interragir directement avec le processus pendant qu'il s'execute

7. Processus​

Attributs​

  • Propriétaire
  • PID (processus ID)
  • PPID (processus ID du parent !)
  • Priorité d'execution
  • Commande / programme lancé
  • Entrée, sortie

7. Processus​

Lister les processus et leurs attributs (1/2)​

ps aux            # Liste tous les processus
ps ux -U alex # Liste tous les processus de l'utilisateur alex
ps -ef --forest # Liste tous les processus, avec des "arbres de parenté"
pstree # Affiche un arbre de parenté entre les processus

Exemple de ps -ef --forest

  935   927  0 Sep25 ?      00:00:52  \_ urxvtd
3839 935 0 Sep26 pts/1 00:00:00 \_ -bash
16076 3839 0 00:49 pts/1 00:00:49 | \_ vim coursLinux.html
20796 935 0 Sep27 pts/2 00:00:00 \_ -bash
2203 20796 0 03:10 pts/2 00:00:00 | \_ ps -ef --forest
13070 935 0 00:27 pts/0 00:00:00 \_ -bash
13081 13070 0 00:27 pts/0 00:00:00 \_ ssh dismorphia -t source getIrc.sh

7. Processus​

Lister les processus et leurs attributs (2/2)​

Et aussi :

top               # Liste les processus actif interactivement
-> [shift]+M # trie en fonction de l'utilisation RAM
-> [shift]+P # trie en fonction de l'utilisation CPU
-> q # Quitte

7. Processus​

Gérer les processus interactif​

<commande>            # Lancer une commande de façon classique
<commande> & # Lancer une commande en arrière plan
[Ctrl]+Z puis 'bg' # Passer la commande en cours en arrière-plan
fg # Repasser une commande en arrière-plan en avant-plan
jobs # Lister les commandes en cours d'execution

7. Processus​

Tuer des processus​

kill <PID>     # Demande gentillement à un processus de finir ce qu'il est en train de faire
kill -9 <PID> # Tue un processus avec un fusil à pompe
pkill <nom> # (pareil mais via un nom de programme)
pkill -9 <nom> # (pareil mais via un nom de programme)

Exemples

kill 2831
kill -9 2831
pkill java
pkill -9 java

7. Processus​

7. Processus​

Un petit outil en passant​

watch permet d'afficher le résultat d'une commande et de relancer cette commandes toutes les 2 secondes

Par exemple :

watch 'ps -ux -U alex --forest' # Surveiller les process lancé par l'utilisateur alex
watch ls -l ~/Documents # Surveiller le contenu de ~/Documents
watch free -h # Surveiller l'utilisation de la RAM

7. Processus​

screen​

screen permet de lancer une commande dans un terminal que l'on peut récupérer plus tard

  1. On ouvre une session avec screen
  2. On lance ce que l'on veut dedans
  3. On peut sortir de la session avec <Ctrl>+A puis D.
  4. La commande lancée continue à s'executer
  5. On peut revenir dans la session plus tard avec screen -r

7. Processus​

Processus et permissions (1/3)​

  • Un processus est rattaché à l'identité de l'utilisateur qui l'a lancé
  • Il est donc soumis aux permissions que cet utilisateur possède, par exemple pour lire ou écrire un fichier..

7. Processus​

Processus et permissions (2/3)​

  • Un processus est rattaché à l'identité de l'utilisateur qui l'a lancé
  • Il est donc soumis aux permissions que cet utilisateur possède, par exemple pour lire ou écrire un fichier..

Problème​

  • Lorsqu'un user veut changer son mot de passe, il faut modifier /etc/shadow ... que seul root peut lire et écrire !
  • Pourtant ... le programme /usr/bin/passwd permet effectivement de changer son mot de passe !

7. Processus​

Processus et permissions (3/3)​

  • Un processus est rattaché à l'identité de l'utilisateur qui l'a lancé
  • Il est donc soumis aux permissions que cet utilisateur possède, par exemple pour lire ou écrire un fichier..

Problème​

  • Lorsqu'un user veut changer son mot de passe, il faut modifier /etc/shadow ... que seul root peut lire et écrire !
  • Pourtant ... le programme /usr/bin/passwd permet effectivement de changer son mot de passe !
 > ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 63960 Feb 7 2020 /usr/bin/passwd

Le s correspond à une permission spéciale : le SUID bit, qui fait en sorte que lorsque le programme est lancé par n'importe quel user, il s'éxécute quand même en tant que root !

7. Processus​

Priorité des processus (1/2)​

  • Il est possible de régler la priorité d'execution d'un processus
  • "Gentillesse" (niceness) entre -20 et 19
    • -20 : priorité la plus élevée
    • 19 : priorité la plus basse
  • Seul les process du kernel peuvent être "méchant"
    • niceness négative, et donc les + prioritaires

7. Processus​

Priorité des processus (2/2)​

nice -n <niceness> <commande> # Lancer une commande avec une certaine priorité
renice <modif> <PID> # Modifier la priorité d'un process

Exemples :

## Lancer une création d'archive avec une priorité faible
nice -n 5 tar -cvzf archive.tar.gz /home/
## Redéfinir la priorité du processus 9182
renice +10 9182

8. Personnaliser son environnement​

8. Personnaliser son environnement​

Variables d'envionnement​

Lorsque vous êtes dans un shell, il existe des variables d'environnement qui définissent certains comportements.

Par exemple, la variable 'HOME' contient /home/padawan et corresponds à l'endroit où cd retourne par défaut (si pas de dossier donné en argument)

Autre exemples :

SHELL : /bin/bash (généralement)
LANG, LC_ALL, ... : langue utilisée par les messages
USER, USERNAME : nom d'utilisateur

8. Personnaliser son environnement​

Changer une variable d'envionnement​

Exemple :

HOME=/usr/cache/

Afficher une variable​

$ echo $HOME
/usr/cache/

8. Personnaliser son environnement​

Lister les variables d'envionnement​

env permet de lister les variables d'environnement

$ env
LC_ALL=en_US.UTF-8
HOME=/home/alex
LC_MONETARY=fr_FR.UTF-8
TERM=rxvt-unicode-256color
[...]

8. Personnaliser son environnement​

Personnaliser l'invite de commande​

  • La variable PS1 décrit l'apparence de l'invite de commande !
  • Généralement, PS1 vaut : \u@\h:\w$
  • \u corresponds au nom d'utilisateur
  • \h corresponds au nom de la machine (host)
  • \w corresponds au repertoire de travail (working directory)
  • \n corresponds ... à un retour à la ligne !

PS2 corresponds à l'invite de commande de deuxième niveau !

8. Personnaliser son environnement​

Ecrire du texte en couleur​

(Syntaxe absolument abominable :'( !)

echo -e "\033[31mCeci est en rouge\033[0m"
echo -e "\033[32mCeci est en vert\033[0m"
echo -e "\033[33mCeci est en jaune\033[0m"
echo -e "\033[7mCeci est surligné\033[0m"
echo -e "\033[31;1;7;6mCeci est surligné rouge gras surligné clignotant\033[0m"

Couleurs : 30 à 38 Effets : 0 à 7

8. Personnaliser son environnement​

PS1 en couleur ...​

PS1="\[\033[31;1;7;6m\]\u\[\033[0m\]@\h:\w$ "

N.B. : pour les couleurs dans le PS1, ne pas oublier d'ajouter des \[ et \] autour des machines pour les couleurs ... sinon le terminal buggera à moitié...

8. Personnaliser son environnement​

Définir des aliases​

Un alias est un nom "custom" pour une commande et des options

alias ll='ls -l'
alias rm='rm -i'
alias ls='ls --color=auto'

On peut connaître les alias existants avec juste alias

(Mauvaise blague : définir alias cd='rm -r' !)

8. Personnaliser son environnement​

Les fichiers de profil​

  • Le fichier ~/.bashrc est lu à chaque lancement de shell
  • Il permet de définir des commandes à lancer à ce moment
  • Par exemple, des alias à définir ou des variables à changer...
  • Pour appliquer les modifications, il faut faire source ~/.bashrc

Autres fichiers de profils : ~/.profile et /etc/bash_profile

9. Commandes "avancées"​

redirections et assemblages​

9 - Redirections, assemblages​

Schema fonctionnel d'une commande​

  • Une commande est une boîte avec des entrées / sorties
  • et un code de retour ($?)
    • 0 : tout s'est bien passé
    • 1 (ou toute valeur différente de 0) : problème !

9 - Redirections, assemblages​

Entrées / sorties​

  • arguments : donnés lors du lancement de la commande (ex: /usr/ dans ls /usr/)
  • stdin : flux d'entrée (typ. viens du clavier)
  • stdout : flux de sortie (typ. vers le terminal)
  • stderr : flux d'erreur (typ. vers le terminal aussi !)

9 - Redirections, assemblages​

Code de retour​

$ ls /toto
ls: cannot access '/toto': No such file or directory
$ echo $?
2

9 - Redirections, assemblages​

Rediriger les entrées/sorties (1/3)​

  • cmd > fichier : renvoie stdout vers un fichier (le fichier sera d'abord écrasé !)
  • cmd >> fichier : ajoute stdout à la suite du fichier
  • cmd < fichier : utiliser 'fichier' comme stdin pour la commande
  • cmd <<< "chaine" : utiliser 'chaine" comme stdin pour la commande

Exemples

ls -la ~/ > tous_mes_fichiers.txt  # Sauvegarde la liste de tous les fichiers dans le home
echo "manger" >> todo.txt # Ajoute "manger" a la liste des choses à faire
wc <<< "une grande phrase" # Compte le nomde de mot d'une chaine

9 - Redirections, assemblages​

Rediriger les entrées/sorties (2/3)​

  • commande 2> fichier : renvoie stderr vers un fichier (le fichier sera d'abord écrasé !)
  • commande 2>&1 : renvoie stderr vers stdout !
  • commande &> fichier : renvoie stderr et stdout vers un fichier (le fichier sera d'abord écrasé !)

Exemples :

ls /* 2> errors  # Sauvegarde les erreurs dans 'errors'
ls /* 2>&1 > log # Redirige les erreurs vers stdout (la console) et stdout vers 'log'
ls /* > log 2>&1 # Redirige tout vers 'log' !
ls /* &> log # Redirige tout vers 'log' !

9 - Redirections, assemblages​

Rediriger les entrées/sorties (3/3)​

Fichiers speciaux :

  • /dev/null : puit sans fond (trou noir)
  • /dev/urandom : generateur aleatoire (trou blanc)

9 - Redirections, assemblages​

Rediriger les entrées/sorties (3/3)​

Fichiers speciaux :

  • /dev/null : puit sans fond (trou noir)
  • /dev/urandom : generateur aleatoire (trou blanc)
ls /* 2> /dev/null           # Ignore stderr
mv ./todo.txt /dev/null # Façon originale de supprimer un fichier !
head -c 5 < /dev/urandom # Affiche 5 caractères de /dev/urandom
cat /dev/urandom > /dev/null # Injecte de l'aleatoire dans le puit sans fond

9 - Redirections, assemblages​

Assembler des commandes​

Executer plusieurs commandes à la suite :

  • cmd1; cmd2 : execute cmd1 puis cmd2
  • cmd1 && cmd2 : execute cmd1 puis cmd2 mais seulement si cmd1 reussie !
  • cmd1 || cmd2 : execute cmd1 puis cmd2 mais seulement si cmd1 a échoué
  • cmd1 && { cmd2; cmd3; } : "groupe" cmd2 et cmd3 ensemble (attention à la syntaxe !!)

Que fait cmd1 && cmd2 || cmd3 ?

10. Commandes avancées​

pipes et outils​

10 Pipes et boîte à outils​

Pipes ! (1/3)​

  • cmd1 | cmd2 permet d'assembler des commandes de sorte à ce que le stdout de cmd1 devienne le stdin de cmd2 !

Exemple : cat /etc/login.defs | head -n 3

  • (Attention, par défaut stderr n'est pas affecté par les pipes !)

10 Pipes et boîte à outils​

Pipes ! (2/3)​

Lorsqu'on utilise des pipes, c'est generalement pour enchaîner des opérations comme :

  • générer ou récupérer des données
  • filtrer ces données
  • modifier ces données à la volée

Sous Linux : tout est fichier / tout est flux de texte

10 Pipes et boîte à outils​

Pipes ! (3/3)​

Precisions techniques

  • La transmission d'une commande à l'autre se fait "en temps réel". La première commande n'a pas besoin d'être terminée pour que la deuxieme commence à travailler.
  • Si la deuxieme commande a terminée, la première peut être terminée prématurément (SIGPIPE).
    • C'est le cas par exemple pour cat tres_gros_fichier | head -n 3

10 Pipes et boîte à outils​

Boîte à outils : tee​

tee permet de rediriger stdout vers un fichier tout en l'affichant quand meme dans la console

tree ~/documents | tee arbo_docs.txt  # Affiche et enregistre l'arborescence de ~/documents
openssl speed | tee -a tests.log # Affiche et ajoute la sortie de openssl à la suite de tests.log

10 Pipes et boîte à outils​

Boîte à outils : grep (1/3)​

grep permet de trouver des lignes qui contiennent un mot clef (ou plus generalement, une expression)

$ ls -l | grep r2d2
-rw-r--r-- 1 alex alex 0 Oct 2 20:31 r2d2.conf
-rw-r--r-- 1 r2d2 alex 1219 Jan 6 2018 zblorf.scd
$ cat /etc/login.defs | grep TIMEOUT
LOGIN_TIMEOUT 60

(on aurait aussi pu simplement faire : grep TIMEOUT /etc/login.defs)

10 Pipes et boîte à outils​

Boîte à outils : grep (2/3)​

Une option utile (parmis d'autres) : -v permet d'inverser le filtre

$ ls -l | grep -v "alex alex"
total 158376
d---rwxr-x 2 alex droid 4096 Oct 2 15:48 droidplace
-rw-r--r-- 1 r2d2 alex 1219 Jan 6 2018 zblorf.scd

On peut créer un "ou" avec : r2d2\|c3p0

$ ps -ef | grep "alex\|r2d2"
## Affiche seulement les lignes contenant alex ou r2d2

10 Pipes et boîte à outils​

Boîte à outils : grep (3/3)​

On peut faire référence à des débuts ou fin de ligne avec ^ et $ :

$ cat /etc/os-release | grep "^ID"
ID=manjaro

$ ps -ef | grep "bash$"
alex 5411 956 0 Oct02 pts/13 00:00:00 -bash
alex 5794 956 0 Oct02 pts/14 00:00:00 -bash
alex 6164 956 0 Oct02 pts/15 00:00:00 -bash
root 6222 6218 0 Oct02 pts/15 00:00:00 bash

10 Pipes et boîte à outils​

Boîte à outils : tr​

tr ('translate') traduit des caractères d'un ensemble par des caractère d'un autre ensemble ...

$ cat /etc/os-release \
| grep "^ID" \
| tr '=' ' '
ID manjaro

$ echo "coucou" | tr 'a-q' 'A-Q'
COuCOu

10 Pipes et boîte à outils​

Boîte à outils : awk​

awk est un processeur de texte assez puissant ...

  • En pratique, il est souvent utilisé pour "récupérer seulement une ou plusieurs colonnes"
  • Attention à la syntaxe un peu compliquée !
$ cat /etc/os-release  \
| grep "^ID" \
| tr '=' ' ' \
| awk '{print $2}' \
manjaro

$ who | awk '{print $1 " " $4}'
alex 22:10
r2d2 11:27

10 Pipes et boîte à outils​

Boîte à outils : awk​

  • L'option -F permet de specifier un autre délimiteur
cat /etc/passwd | awk -F: '{print $3}'  # Affiche les UID des utilisateurs

(Equivalent à cat /etc/passwd | cut -d: -f 3)

10 Pipes et boîte à outils​

Boîte à outils : sort​

sort est un outil de tri :

  • -k permet de spécifier quel colonne utiliser pour trier (par défaut : la 1ère)
  • -n permet de trier par ordre numérique (par défaut : ordre alphabetique)
ps -ef | sort         # Trie les processus par proprietaire (1ere col)
ps -ef | sort -k2 -n # Trie les processus par PID (2eme col., chiffres)

10 Pipes et boîte à outils​

Boîte à outils : uniq​

uniq permet de ne garder que des occurences uniques ... ou de compter un nombre d'occurence (avec -c)

uniq s'utilise 90% du temps sur des données déjà triées par sort

who | awk '{print $1}' | sort | uniq                   # Affiche la liste des users loggués
who | awk '{print $1}' | sort | uniq -c # Compte le nombre de shell par user loggué

10 Pipes et boîte à outils​

Boîte à outils : sed​

sed est un outil de manipulation de texte très puissant ... mais sa syntaxe est complexe.

Comme premier contact : utilisation pour chercher et remplacer : s/motif/remplacement/g

Exemple :

ls -l | sed 's/alex/padawan/g' # Remplace toutes les occurences de alex par padawan

10 Pipes et boîte à outils​

Boîte à outils : find​

find permet de trouver (recursivement) des fichiers répondant à des critères sur le nom, la date de modif, la taille, ...

Exemples:

## Lister tous les fichiers en .service dans /etc
find /etc -name "*.service"

## Lister tous les fichiers dans /var/log modifiés il y a moins de 5 minutes
find /var/log -mmin 5

10 Pipes et boîte à outils​

Recap (QUELQUES outils)​

(en tout cas leur utilisation la plus commune)

  • tee : montrer la sortie dans le terminal tout en la copiant dans un fichier
  • tr : supprimer / remplacer certains caractères
  • grep : garder seulement les lignes qui matchent (ou pas) une expression
  • awk : garder seulement une colonne de donnée
  • cut : garder seulement une colonne de donnée (similaire à awk mais différent)
  • sort : trier des données
  • uniq : garder seulement des lignes uniques (ou compter combien d'occurences)
  • sed : chercher et remplacer une expression par une autre
  • find : chercher des fichiers qui correspondent à certains critères (nom, date de modif, ...)