Lignes de commandes et système de fichiers
==========================================
<br><br>
*Ce document est un diaporama qui résume le cours correspondant (accessible [ici](lignes-commandes-droits)).*
---
# Introduction
- Les premiers systèmes d'exploitation étaient dépourvus d'interface graphique : tout se faisait en **lignes de commandes**
- Aujourd'hui, sur un ordi personnel, on peut (presque) tout faire via des interfaces graphiques
----
# Introduction
- Mais il est nécessaire de connaître quelques lignes de commandes de base :
- C'est important pour un informaticien
- Cela permet souvent d'aller plus vite, voire de faire des choses que l'on ne pourrait pas effectuer via l'interface graphique
- Ce permet d'exécuter des instructions sur un ordinateur distant (ex.: un serveur)
----
# Introduction
- Pour écrire des lignes de commandes on utilise un **terminal** ou une **console** ou une **invite de commande**
- Sous Linux :
<img class="r-stretch centre image-responsive" src="data/terminal.png" alt="illustration">
----
# Introduction
```bash
eleve@nsi-mounier16:~$
```
De la forme `nom_utilisateur@nom_machine:repertoire_courant$`
---
# Système de fichiers
---
## Arborescence
- Système de fichiers de Linux : représenté sous forme d'une **arborescence**
- Exemple (incomplet) :
<img class="r-stretch centre image-responsive" src="data/arborescence.png" alt="arborescence de fichiers">
----
## Arborescence
<img class="r-stretch centre image-responsive" src="data/arborescence.png" alt="arborescence de fichiers">
- le **répertoire racine** `/` : tout en haut point d'entrée du système de fichiers
- des **répertoires** (encadrés) contenant des **fichiers** (non encadrés) et/ou des répertoires, etc.
----
## Arborescence
<img class="r-stretch centre image-responsive" src="data/arborescence.png" alt="arborescence de fichiers">
- le **répertoire des utilisateurs** : `/home`
- contient les dossiers et fichiers personnels des utilisateurs
- il y a **un sous-répertoire** par utilisateur : c'est ce répertoire qui est noté `~`
---
## Chemin absolu et chemin relatif
- Il y a deux manières d'indiquer la position d'un répertoire ou d'un fichier dans l'arborescence
- Chemin **absolu** : à partir de la racine `/`
- Chemin **relatif** : à partir d'un répertoire quelconque
----
### Chemin absolu
<img class="r-stretch centre image-responsive" src="data/arborescence.png" alt="arborescence de fichiers" width="350">
- Exemple : chemin absolu du fichier `fiche.ods`
```bash
/home/elsa/documents/fiche.ods
```
----
### Chemin relatif
<img class="r-stretch centre image-responsive" src="data/arborescence.png" alt="arborescence de fichiers" width="350">
- Exemple : chemin relatif du fichier `photo_1.jpg` **depuis le répertoire** `max` :
```bash
images/photo_vac/photo_1.jpg
```
----
### Chemin relatif (suite)
- **Comment faire s'il faut remonter dans l'aborescence ?** --> on utilise `..`
<img class="r-stretch centre image-responsive" src="data/arborescence.png" alt="arborescence de fichiers" width="350">
- Chemin relatif de `photo_1.png` depuis le répertoire `ski` :
```bash
../photos_vac/photo_1.jpg
```
----
# ✏️ À faire
**EXERCICE 1**
---
# Les commandes pour manipuler les fichiers et les répertoires
----
## Écrire des commandes
- Au lycée : on utilise le Terminal
<img class="r-stretch centre image-responsive" src="data/terminal.png" alt="illustration">
- À la maison : une possibilité : https://www.cahier-nsi.fr/jslinux/ (login : Angie, mot de passe : NSI)
---
## Le répertoire courant
- **Répertoire courant** = endroit où on se trouve dans l'arborescence
- Indiqué juste après le `:`
- par défaut à l'ouverture : répertoire courant = répertoire personnel de l'utilisateur, noté `~`
<img class="r-t=stretch centre image-responsive" src="data/terminal_short.png" alt="illustration">
----
## Le répertoire courant (suite)
- Exemple 1 : le répertoire courant est `~`, c'est-à-dire `/home/eleve`
<img class="r-t=stretch centre image-responsive" src="data/terminal_short.png" alt="illustration">
- Exemple 2 : le répertoire courant est `~/Documents`, c'est-à-dire `/home/eleve/Documents`
<img class="centre image-responsive" src="data/pwd.png" alt="illustration">
----
## Le répertoire courant (suite)
- La commande `pwd` (**path working directory**) permet de connaitre le *chemin du répertoire courant* :
<img class="centre image-responsive" src="data/pwd1.png" alt="illustration">
<img class="centre image-responsive" src="data/pwd2.png" alt="illustration">
---
## Se déplacer dans l'arborescence : commande `cd`
- Commande `cd` : pour **change directory**, soit *changer de répertoire*
- À faire suivre par le chemin (absolu ou relatif)
```bash
cd chemin
```
----
### Exemples
<img class="r-stretch centre image-responsive" src="data/arborescence.png" alt="arborescence de fichiers" width="350">
**Exemple 1** : On se trouve dans le répertoire `elsa` et on veut se rendre dans le répertoire `documents` :
```bash
cd documents
```
```bash
cd /home/elsa/documents
```
----
### Exemples (suite)
<img class="r-stretch centre image-responsive" src="data/arborescence.png" alt="arborescence de fichiers" width="350">
**Exemple 2** : Le répertoire courant est `photos_vac` et que on veut se rendre dans le répertoire `ski` :
```bash
cd ../ski
```
```bash
cd /home/max/images/ski
```
----
### Exemples (suite)
<img class="r-stretch centre image-responsive" src="data/arborescence.png" alt="arborescence de fichiers" width="350">
**Exemple 3** : Le répertoire courant est le répertoire `boulot` et on veut se rendre dans le répertoire `documents` :
```bash
cd ..
```
```bash
cd /home/elsa/documents
```
----
### Exemples (suite)
<img class="r-stretch centre image-responsive" src="data/arborescence.png" alt="arborescence de fichiers" width="350">
**Exemple 4** : Pour revenir à son répertoire personnel, quel que soit l'endroit où on se trouve :
```bash
cd
```
```bash
cd ~
```
---
# ✏️ À faire
**EXERCICE 2**
---
## Lister le contenu d'un répertoire : commande `ls`
- Commande `ls` : pour **list**, soit *lister*
- Liste le contenu (répertoires et fichiers) du répertoire courant :
<img class="r-stretch centre image-responsive" src="data/arborescence.png" alt="arborescence de fichiers" width="350">
```bash
elsa@ordi:~/documents$ ls
boulot fiche.ods
```
----
### Exemples
<img class="r-strecth centre image-responsive" src="data/ls.png" alt="illustration">
- Le répertoire personnel de l'utilisateur `eleve` contient combien d'éléments ?
- Que contient le répertoire `~/Documents` ?
> Ne pas hésiter à comparer avec le navigateur de fichiers.
---
## Créer un répertoire : commande `mkdir`
- Commande `mkdir` : pour **make directory**, soit *créer un répertoire*
- À faire suivre par le nom (ou le chemin) du répertoire à créer :
```bash
mkdir nom_repertoire
```
----
### Exemple
- Pour créer un répertoire `NSI` dans le répertoire `Documents` en partant du répertoire personnel `~` :
<img class="centre image-responsive" src="data/mkdir.png" alt="illustration">
---
# ✏️ À faire
**EXERCICES 3 et 4**
---
## Supprimer des éléments : commande `rm`
- Commande `rm` : pour **remove**, soit *supprimer*
- Pour supprimer des fichiers ou des répertoires vides : à faire suivre par le nom du (ou des) fichier(s) à supprimer
```bash
rm nom_fichier1 nom_fichier2 nom_fichier3
```
- Pour supprimer un répertoire non vide (attention, cela supprimera tout ce qu'il contient !) il faut utiliser l'option `-r` (pour *récursif*)
```bash
rm -r nom_repertoire
```
---
## Créer un fichier : commande `touch`
- Commande `touch` : pour créer un (ou des) fichier(s) vide(s)
- À faire suivre par le nom du (ou des) fichier(s) à créer (attention, il faut indiquer l'extension du fichier) :
```bash
touch nom_fichier.extension
```
- Exemple : pour créer un fichier Python vide appelé `main.py`, on exécute la commande `touch main.py`.
---
## Copier un fichier : commande `cp`
- Commande `cp` : pour **copy**, soit *copier*
- À faire suivre par le chemin du fichier à copier puis du chemin de destination de la copie :
```bash
cp /repertoire_source/nom_fichier_a_copier /repertoire_destination/nom_fichier
```
- Remarques :
- il y a un espace entre le chemin source et le chemin destination
- Le nom du fichier et du chemin de destination ne sont pas forcément les mêmes que ceux de départ : on peut avoir
```cp main.py ../essai.py```.
---
## Déplacer un fichier : commande `mv`
- Commande `mv` : pour **move**, soit *déplacer*
- À faire suivre par le chemin du fichier à déplacer puis le chemin du répertoire cible
- Exemple : pour déplacer `bar.txt` dans le répertoire `baz` :
```bash
mv foo/bar.txt baz/
```
- On peut utiliser `mv` pour renommer un fichier : la commande suivante renomme le fichier `foo_bar.txt` en `foo_baz.txt` :
```bash
mv foo_bar.txt foo_baz.txt
```
---
# ✏️ À faire
**EXERCICES 5 et 6**
---
# Droits et permissions
----
# Droits et permissions
- Les OS récents sont **multi-utilisateurs** : plusieurs utilisateurs se partagent le même ordinateur
- Chaque utilisateur :
- a un environnement qui lui est propre
- n'a pas la possibilité de lire ou supprimer tout et n'importe quoi ! Et heureusement !
- L'OS gère pour cela les **droits et permissions** sur les fichiers et les répertoires pour les différents utilisateurs
----
# Droits et permissions
- Il existe un utilisateur particulier qui possède tous les droits : l'**administrateur**, ou **root**.
- Il peut définir des **groupes** d'utilisateurs et attribuer plusieurs utilisateurs à un groupe pour leur attribuer des droits communs
- On va s'intéresser ici aux droits relatifs aux fichiers et répertoires : autrement dit ce que chaque utilisateur a le droit de faire d'un fichier ou d'un répertoire
---
## Utilisateurs et permissions
### Trois types d'utilisateurs
Pour un fichier ou un répertoire on distingue trois types d’**utilisateurs** :
- le *propriétaire* noté `u` (pour *user*)
- le *groupe principal* noté `g` (pour *group*)
- les *autres utilisateurs* notés `o` (pour *others*, ceux qui n'appartiennent pas au groupe associé au fichier)
----
### Permissions pour les fichiers et les répertoires
| Type de permission | pour un fichier | pour un répertoire |
|---|---|---|
| `r` (lecture) | lire le contenu | lister le contenu |
| `w` (écriture) | modifier le contenu | ajouter, supprimer, renommer des fichiers |
| `x` (exécution) | exécuter le fichier | entrer dedans |
- Si une permission n'est pas attribué, la lettre `r`, `w` ou `x` est remplacée par un tiret `-`
----
## Exemples de lectures de permissions
- On peut afficher les droits des éléments d'un répertoire avec la commande
```ls -l```
<img class="r-stretch centre image-responsive" src="data/ls-l.png" alt="droits unix">
----
## Exemples de lectures de permissions
| Droits et permissions | Nb de liens | propriétaire | groupe | taille | date modif | nom |
| --- | --- | --- | --- | --- | --- | --- |
| <div style="width:200px"><code>-rw-rw-r--</code></div> | 1 | eleve | eleve | 13197 | avril 18 14:09 | <code>terminal.png</code> |
- Les 10 premiers caractères définissent l'ensemble des droits et permissions pour chaque élément
----
## Exemples de lectures de permissions
Permissions pour le fichier `terminal.png`:
```-rw-rw-r--```
- Premier caractère = nature de l'élément.
Ici **`-`** pour indiquer qu'il s'agit d'un fichier (`d` : répertoire, `l` : lien).
- Trois suivants = permissions pour le **propriétaire** (`u`)
Ici **`rw-`** donc droits en lecture et en écriture mais pas en exécution (logique : un fichier image ne s'exécute pas)
- Trois suivants = permissions pour le **groupe** (`g`)
Ici **`rw-`** donc les mêmes que pour le propriétaire
- Trois derniers = permissions pour les **autres utilisateurs** (`o`)
Ici **`r--`** donc uniquement le droit en lecture
----
## Exemples de lectures de permissions
Résumé des permissions pour le fichier `terminal.png` :
```-rw-rw-r--```
| | Lecture | Écriture | Exécution |
| ------------ | ------- | -------- | --------- |
| Propriétaire | oui | oui | non |
| Groupe | oui | oui | non |
| Autres | oui | non | non |
----
## Exemples de lectures de permissions
Si on veut connaître les droits d'un seul fichier ou répertoire il suffit d'indiquer son nom après `ls -l` :
<img class="r-stretch centre image-responsive" src="data/ls-l-nom.png" alt="droits unix">
---
# ✏️ À faire
**EXERCICES 7 et 8**
---
## Modifier les permissions d'un fichier avec `chmod`
- Il est possible de modifier les permissions d'un fichier ou d'un répertoire en utilisant la commande `chmod`
- **Qui peut le faire ?**
- le propriétaire du fichier
- l'utilisateur `root` (administrateur)
----
## Modifier les permissions d'un fichier avec `chmod`
- Cette commande s'utilise avec diverses options facultatives :
```bash
chmod [ugoa][+-=][rwx] fichier
```
Les options entre crochets désignent :
- `u`, `g`, `o` : le propriétaire, le groupe, les autres utilisateurs
- `a` : tous les utilisateurs (raccourci pour `ugo`)
- `+`, `-`, `=` : pour ajouter, enlever ou positionner le(s) droit(s)
- `r`, `w`, `x` : droits de lecture, d'écriture, d'exécution
- `-R` : récursivement (nécessaire pour agir sur un répertoire)
----
### Exemples
On part avec les permissions ci-dessous :
<img class="centre image-responsive" src="data/ls-l.png" alt="droits unix">
- **Exemple 1** : Pour ajouter le droit d'écriture aux autres utilisateurs sur le fichier `compte_rendu.odt` :
```bash
chmod o+w compte_rendu.odt
```
- Dans ce cas, tous les autres utilisateurs pourront modifier le fichier en question.
----
### Exemples (suite)
On part avec les permissions ci-dessous :
<img class="centre image-responsive" src="data/ls-l.png" alt="droits unix">
- **Exemple 2** : Pour retirer le droit de lecture au groupe sur `terminal.png` :
```bash
chmod g-r terminal.png
```
- Dans ce cas, les utilisateurs du groupe ne pourront plus lire le fichier en question.
----
### Exemples (suite)
On part avec les permissions ci-dessous :
<img class="centre image-responsive" src="data/ls-l.png" alt="droits unix">
- **Exemple 3** : Pour retirer les droits d'écriture et d'exécution au groupe et au propriétaire sur `fichier.txt` :
```bash
chmod gu-wx fichier.txt
```
- Dans ce cas, ni les membres du groupe, ni les autres utilisateurs ne pourront ni lire ni écrire dans ce fichier.
----
### Exemples (suite)
On part avec les permissions ci-dessous :
<img class="centre image-responsive" src="data/ls-l.png" alt="droits unix">
- **Exemple 4** : Pour ajouter les droits de lecture et d'écriture à tous les utilisateurs sur `fichier.txt` :
```bash
chmod a+rw fichier.txt
```
----
### Exemples (suite)
Après ce différentes modifications, on obtient les permissions suivantes :
<img class="r-stretch centre image-responsive" src="data/ls-l_2.png" alt="droits unix">
---
# ✏️ À faire
**EXERCICES 9 et 10**
---
# Bilan
- Il n'est pas nécessaire d'utiliser (ni d'avoir) une interface graphique pour utiliser un ordinateur : on peut tout faire en **lignes de commandes** dans un terminal.
- Le système d'exploitation Linux repose entièrement sur une **arborescence de fichiers et de répertoires**
- Il existe des commandes permettant de se déplacer dans cette arborescence et manipuler les fichiers
- Les OS multi-utilisateurs permettent d'utiliser un même ordinateur à plusieurs, chacun ayant des **droits et des permissions** différentes et une interface propre.
- Le propriétaire d'un fichier et l'administrateur peuvent modifier les permissions sur ce fichier avec la commande `chmod`
---
**Références** :
- Cours de David Roche sur les [Commandes Linux](https://dav74.github.io/site_nsi_prem/c14c/)
- La documentation Ubuntu pour l'aborescence de Linux : [https://doc.ubuntu-fr.org/arborescence](https://doc.ubuntu-fr.org/arborescence)
- Cours de Frédéric Junier : [Système d'exploitation et lignes de commande](https://frederic-junier.org/NSI/premiere/chapitre9/cours-systeme/systeme-cours-git/) (licence [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.fr))
- Mémento en ligne des commandes Linux de Julien Dubreuil : [https://juliend.github.io/linux-cheatsheet/](https://juliend.github.io/linux-cheatsheet/)
---
Germain Becker & Sébastien Point, Lycée Emmanuel Mounier, Angers.
Ressource éducative libre distribuée sous [Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International](http://creativecommons.org/licenses/by-nc-sa/4.0/)
![Licence Creative Commons](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)