T5.2 OS et commandes UNIX⚓︎
5.2.1 Système d'exploitation⚓︎
Le système d’exploitation (OS) est le logiciel système qui gère l'ordinateur, en jouant un rôle d’intermédiaire entre les programmes, les éléments matériels de l’ordinateur (notamment la mémoire) ainsi que les périphériques d'entrée/sortie. C’est le premier programme exécuté au démarrage de la machine, et c’est le seul qui reste en permanence en exécution.
La partie de l'OS qui gère la communication avec les éléments matériels s'appelle le noyau (kernel).
Outre le noyau, l'OS comporte des applications, une interface graphique, la gestion des fichiers, le terminal...
Historiquement, les premiers systèmes d’exploitation ne disposaient pas d’interface graphique. D’ailleurs, à cette époque, la souris n’existait même pas. On interagissait donc avec le système essentiellement par échange de texte. L’écran servait à recevoir les infor- mations fournies par le système sous forme de phrase, d’affichage de valeur ou de tableau textuel. Aujourd’hui, même si les interfaces graphiques modernes permettent d’effectuer la plupart des opérations, il est important de connaitre quelques-unes de ces lignes de commandes qui se saisissent dans un (émulateur de) terminal, qui lance un shell par défaut.
Vocabulaire
L'émulateur de terminal (souvent appelé terminal tout court) est un programme qui s'exécute dans le gestionnaire de fenêtre. Il sert à exécuter des programmes en mode texte, c'est-à-dire où toute l'interaction avec l'utilisateur se fait avec l'écran (pour afficher du texte) et le clavier (pour lire du texte).
Par défaut le terminal exécute un shell.
Il existe de nombreux émulateurs de terminaux sous Unix: xterm, rxvt-unicode, LXTerminal, gnome-terminal, konsole, xfce4-terminal...
Le shell (aussi appelé invite de commande ou interpréteur de commandes) est un programme avec une interface en mode texte. Le shell affiche un prompt (représenté par le symbole $) et lit les commandes tapées par l'utilisateur. Ces commandes permettent d'effectuer des tâches courantes sur les fichiers et répertoires, de lancer d'autres programmes, etc. Le shell offre aussi un langage permettant d'effectuer des tâche conditionnelles et / ou répétitive à l'aide de structures de controle (conditionnelles, boucles for et while, etc.) Les suites de commandes que l'on souhaite réutiliser peuvent être sauvegardées dans un fichier appelé script.
Il existe de nombreux shell sous Unix. Les plus utilisés dans le monde Linux sont bash et zsh.
Une commande est en général un petit programme externe lancé par le shell. Par exemple, la commande ls
permet d'afficher la liste des fichiers contenus dans le répertoire courant. Il est également possible d'exécuter des programmes très complexes (comme un traitement de texte ou un navigateur internet), mais cela est rarement fait depuis le shell.
Principalement, les commandes servent à lancer des petits programmes ou à travailler sur les fichiers et les répertoires. Dans les systèmes de type "UNIX" (par exemple GNU/Linux ou macOS), nous avons un système de fichier en arborescence :
Repertoire courant et chemins
On parle de chemin dans une arborescence de fichiers lorsqu'on veut changer de répertoire ou faire une référence vers un fichier qui ne se situe pas dans le même répertoire que celui où «on travaille».
Le répertoire courant est celui où on se situe, c'est-à-dire celui où l'on se trouve lors d'une navigation dans l'arborescence de fichiers ou bien celui dans lequel on est en train de travailler sur un fichier (python, html, document texte, etc.) à travers un logiciel.
Par exemple, si Elsa décide de suivre le TP sur l'image dans un fichier images.py
qu'elle enregistrera dans le répertoire boulot
avec Thonny, le répertoire courant pour Thonny sera boulot
. Il est alors impératif d'enregistrer le fichier ada.png
dans ce répertoire pour pouvoir l'importer avec imageio.imread('ada.png')
par exemple.
Le chemin absolu d'un fichier est son chemin complet depuis la racine /
.
Par exemple le chemin absolu du fichier fiche.ods
dans l'illustration précédente est /home/elsa/documents/fiche.ods
.
Le chemin relatif d'un fichier est son chemin depuis le répertoire courant.
On indique qu'on «remonte» d'un répertoire avec ..
.
Par exemple, si le répertoire courant est ski
, le chemin relatif du fichier photo_1.jpg
est ../photos_vac/photo_1.jpg
.
Si par mégarde Elsa a enregistré le fichier ada.png
dans le répertoire elsa
, il faudra l'importer avec imageio.imread('../../ada.png')
.
5.2.2 Commandes⚓︎
Pour découvrir un certain nombre de commandes UNIX, parmi les plus courantes, nous allons jouer à un jeu:
Travail à faire
En jouant à Terminus:
- noter au fur et à mesure les commandes découvertes, à quoi elles servent et comment on les utilise (tableau conseillé):
Nom de la commande | Description | Utilisation |
---|---|---|
ls |
Lister les éléments du dossier | Saisir ls puis Entrée |
- faire un plan du jeu sous forme d'une arborescence, par exemple:
5.2.3 Compléments sur les commandes⚓︎
Prenons l'exemple de l'arborescence du dossier /home/jeanmichel/
de l'ordinateur personnel de Jean-Michel B.:
.
+-- Travail
| +-- reforme
+-- projet_flou.odt
| +-- HTML
| | +-- images
| | | +-- toto.png
| | | +-- tata.png
| | | +-- tutu.png
| | +-- styles
| | | +-- style.css
| | +-- scripts
| | | +-- script.js
| | +-- index.html
| | +-- page1.html
| | +-- page2.html
+-- Photos
| +-- Ibiza
| | +-- reveillon.png
Chemins
On a vu la commande cd
qui permet de changer de répertoire (dossier). Par exemple, pour aller dans le répertoire images
depuis la racine, on peut taper successivement:
~$ cd Travail/
~/Travail$ cd HTML/
~/Travail/HTML$ cd images/
~/Travail/HTML/images$
On peut plus rapidement préciser le chemin relatif:
~$ cd Travail/HTML/images/
~/Travail/HTML/images$
Pour revenir à la racine /home/jeanmichel/
, on peut taper successivement 3 fois la commande cd ..
, ou bien plus rapidement:
~/Travail/HTML/images$ cd ../../../
~$
Et pour aller du répertoire images
au répertoire scripts
, on utilisera le chemin relatif:
~/Travail/HTML/images$ cd ../scripts/
~/Travail/HTML/scripts$
Ou bien le chemin absolu (mais c'est plus long...):
~/Travail/HTML/images$ cd /home/jeanmichel/Travail/HTML/scripts/
~/Travail/HTML/scripts$
Options et arguments
On peut ajouter aux commandes UNIX une ou plusieurs options, qui s'écrivent soit:
- avec une lettre précédée d'un tiret;
- avec un mot-clé précédé de 2 tirets.
Tester par exemple dans un de vos répertoires les commandes suivantes:
$ ls
$ ls -l
$ ls -l -h
Attention, l'usage de rm
est dangereux, soyez attentif !
La commande rm
permet de supprimer définitivement un fichier, il n'y a pas de corbeille dans le shell! Mais pas un répertoire non vide.
Pour effacer tous les fichiers d'un répertoire:
$ rm *
Et pour supprimer tout le contenu d'un répertoire, y compris les sous-répertoires, on utilise l'option -r
:
$ rm -r *
On peut parfois préciser plusieurs arguments à une commande pour ne pas répéter plusieurs fois son utilisation. Par exemple pour créer deux répertoires images/
et data/
en même temps dans le répertoire courant:
$ mkdir images/ data/
toto.txt
, tata.txt
et tutu.txt
:
$ touch toto.txt tata.txt tutu.txt
À propos de grep
Comme vu dans l'activité «Terminus», la commance grep
permet de rechercher une chaîne de caractéres dans un fichier. La syntaxe générale est:
$ grep options "recherche" chemin
--ignore-case
ou-i
: pour ignorer la casse (minuscules/majuscules indifférentes);-c
: pour afficher seulement le nombre d'occurences de la recherche;-l
: pour afficher le nom des fichiers contenant la recherche (chemin
est alors un répertoire);-r
: pour rechercher dans tous les fichiers et sous-répertoires dechemin
, qui est un répertoire.
Pour rechercher dans plusieurs fichiers (comme dans l'activité Terminus) on peut utiliser *
qui remplace n'importe quel mot. Par exemple, pour rechercher 'password'
dans tous les fichiers txt
de l'activité, on aurait pu taper:
$ grep 'password' *.txt
5.2.4 Utilisateurs et droits⚓︎
Un système UNIX est un système multi-utilisateur. Toute personne physique ou tout programme interagissant avec le système est un utilisateur (user). Cet utilisateur est authentifié sur le système par un nom unique et un identifiant unique (UID). Chaque utilisateur possède certains droits lui permettant d'effectuer certaines opérations et pas d'autres (avoir accès aux répertoires et fichiers, aux périphériques, installer des logiciels...).
Pour connaître les utilisateurs de votre système, on consulte le fichier /etc/passwd
(faites-le) où on trouve tous les utilisateurs au format:
nom:motdepasse:UID:GID:informations:repertoire:shell
Chaque utilisateur appartient à un ou plusieurs groupes, qui servent à ressembler plusieurs utilisateurs pour leur attribuer des droits (permissions d'accès) communs aux fichiers ou applications.
Pour connaître les utilisateurs de votre système, on consulte le fichier /etc/group
(faites-le).
Parmi les utilisateurs, il y a un super-utilisateur appelé root
qui a tous les pouvoirs sur le système. Son UID est 0. Pour exécuter une commande réservée au super-utilisateur, un utilisateur doit utiliser la commande sudo
(super user do) qui nécessite de connaître le mot de passe root qui en général n'est connu que de l'administrateur du système.
En particulier le super-utilisateur peut modifier les droits (en attribuer ou en retirer) des utilisateurs et des groupes.
Les types de droits r-w-x
- les droits en lecture (symbolisés par la lettre
r
) : il est possible de lire le contenu de ce fichier - les droits en écriture (symbolisés par la lettre
w
) : il est possible de modifier le contenu de ce fichier - les droits en exécution (symbolisés par la lettre
x
) : il est possible d'exécuter le contenu de ce fichier (quand le fichier est du code exécutable)
Les types d'utilisateurs u-g-o
Tout fichier UNIX:
- possède un propriétaire (par défaut l'utilisateur qui l'a créé) : u comme user;
- est associé à un groupe dont on définit les actions sur ce fichier: g comme group;
- peut être éventuellement manipulé par tous les autres utilisateurs : o comme others.
Lecture des droits
Voici ce que me donne la commande ls
avec l'option -l
pour obtenir des informations sur le contenu du répertoire /Travail/1NSI/Archi/
:
- Le premier caractère
-
oud
indique s'il s'agit d'un fichier ou d'un répertoire; - les 9 caractères suivants représentent dans l'ordre les droits pour les 3 types d'utilisateurs (par paquets de 3 caractères), dans l'ordre ugo. Par exemple pour le premier fichier, le propriétaire u a les droits
rw-
, c'est-à-dire lecture, écriture, pas d'éxécution (il ne s'agit pas d'un fichier exécutable), les utilisateurs du groupe ont les mêmes droitsrw-
et les autres utilisateurs o ont les droitsr--
, c'est-à-dire seulement lecture. Pour les dossiers, tous les utilisateurs ont le droit d'éxécutionx
, qui consiste à explorer le répertoire. - ensuite on lit le nombre de liens (notion non étudiée cette année);
- on trouve ensuite le nom du propriétaire du fichier, le nom du groupe, la taille du fichier en octets, la date et l'heure de la dernière modification et enfin le nom du fichier ou répertoire.
Modification des droits
Il est important de ne pas perdre de vu que l'utilisateur "root" a la possibilité de modifier les droits de tous les utilisateurs.
Le propriétaire d'un fichier peut également modifier les permissions d'un fichier ou d'un répertoire à l'aide de la commande chmod
.
Elle s'utilise ainsi, en précisant l'utilisateur (a pour tous), l'ajout + ou la suppression - ou la réinitialisation = de la permission et enfin le type de permission:
chmod [u g o a] [+ - =] [r w x] nom_du_fichier
chmod g+w toto.txt
toto.txt
.
5.2.5 Exercices⚓︎
Exercice 1
Exercice 2
Décrire (papier/crayon) l'effet de chacune des commandes suivantes en supposant qu'elle sont exécutées les unes à la suite des autres.
cd ~
mkdir T5
mkdir T5/TP_shell
cd T5/TP_shell
touch toto.txt
ls -l
chmod g-rwx,o-rwx toto.txt
ls -l
cd ..
rm -r TP_shell
Ouvrir un terminal et effectuer ces commandes. Vérifier que tout se déroule comme décrit dans la partie 1.
Exercice 3
On suppose que l'on se trouve dans un répertoire vide TEST/
et qu'on exécute les commandes suivantes. Dessiner l'arborescence finale des fichiers et répertoires en utilisant TEST/
comme racine de l'arborescence.
mkdir series films mangas musique
touch films/sw.txt mangas/HxH.txt
cd series/
mkdir ../musique/rap/ got/ oitnb/
cd ..
cp */*.txt series/got/
rm -r mangas
Exercice 4
Consulter la page de manuel d'utilisation de la commande head
. Trouver comment l'utiliser pour n'afficher que les 5 premières lignes d'un fichier toto.txt
.
Exercice 5
Commencer par télécharger ce fichier dans votre répertoire /home/nsi/Téléchargements/
.
- Dans votre répertoire personnel, créez un répertoire
Shell/
puis un répertoireExo5/
dans ce répertoireShell/
. - Déplacez le fichier
pg6318.txt
dans le répertoireExo5/
que vous venez de créer. - Consultez les 25 premières lignes de ce fichier, puis renommez-le judicieusement.
- Créez un fichier nommé
reponses.txt
. - Consulter le manuel de la commande
echo
. - Écrivez votre nom dans ce fichier à l'aide de la commande
echo
. - Cherchez les mots
rouge
,bleu
etjaune
dans le fichier texte et ajoutez au fichierreponses.txt
celui qui n'y apparaît pas. - Vérifier en affichant le contenu du fichier
reponses.txt
. - Cherchez en quelle ligne apparaît pour la première fois le mot
traître
. - Ajouter cette réponse au fichier
reponses.txt
.
Exercice 6
Ouvrir un terminal, puis sans quitter le répertoire courant:
- créer un répertoire
Exo6/
puis les répertoiresExo6/NSI/
etExo6/Divers/
. - créer un fichier
hello.py
dans le répertoireExo6/NSI/
. - écrire
print("hello world")
dans ce fichier. - se déplacer dans le répertoire
Exo6/NSI/
. - afficher le contenu de ce fichier
hello.py
. - accorder tous les droits à «tout le monde» sur le fichier
hello.py
. - exécuter ce fichier à l'aide du programme
python3
.
Exercice 7
On imagine qu'un répertoire nommé Bibliothèque
dans le répertoire Travail
du répertoire personnel contient plusieurs fichiers textes (format txt
) dont le fichier brouillon.txt
.
Le répertoire courant est /home/nsi/Documents/Images
.
- En une seule commande, se déplacer dans le répertoire
Bibliothèque
. - Afficher le contenu de ce répertoire.
- Chercher toutes les occurences du mot "informatique" dans les fichiers texte de ce répertoire.
- Supprimer le fichier
brouillon.txt
.
TP noté
Commencer par télécharger ce fichier dans votre répertoire /home/nsi/Téléchargements/
.
Les instructions suivantes doivent toutes être réalisées à l'aide d'une commande (ou plusieurs si besoin) dans le terminal, qu'il faut donc ouvrir maintenant... Moins vous utiliserez de commandes, mieux ce sera.
- Consultez le répertoire courant (dans lequel vous vous situez). Si ce n'est pas votre répertoire personnel (
/home/nsi/
), revenez-y. - Supprimez le fichier
.bash_history
(ne pas oublier le point). - Créez un répertoire
Terminal/
dans le répertoireDocuments/
, puis un répertoireTP/
dans ce répertoireTerminal/
. - Déplacez le fichier
foo.txt
que vous avez téléchargé vers le répertoireTP/
que vous venez de créer . - Renommez ce fichier en
queneau1014poemes.txt
. - Si le répertoire courant n'est pas
/home/nsi/Documents/Terminal/TP/
, s'y rendre. Sans quitter ce répertoire, créez un répertoireSauvegarde/
dans le répertoireTerminal/
. - Créez une copie du fichier
queneau1014poemes.txt
dans le répertoireSauvegarde/
sous le nomqueneau_save.txt
. - Dans le répertoire
TP/
, consultez les 14 premières lignes duqueneau1014poemes.txt
. - Parmi les 3 mots suivants, lequel(s) n'y figure(nt) pas (peu importe la casse)? Malabar, Bretzel, Cacahuète?
- Donnez le nombre d'occurences du mot «frère».
- En quelle ligne trouve-t-on le mot «illustre»?
- On peut écrire du texte (par exemple «Bonjour») dans un fichier (par exemple «toto.txt») grâce à la commande
echo Bonjour > toto.txt
. Pour ajouter du texte, on remplace>
par>>
. Créez un fichierreponses.txt
dans lequel vous écrirez les réponses aux questions 8, 9 et 10. - Vérifiez en affichant le contenu du fichier
reponses.txt
. - Consultez le contenu du répertoire
TP/
, en affichant les détails sur les droits. - Modifiez les droits sur le fichier
reponses.txt
pour que les utilisateurs du groupe n'aient que la permission «lecture» et que les autres utilisateurs n'aient aucun droit d'accès. - Supprimez le répertoire
Terminal/
et tout son contenu. - Fermez le terminal.
Vous pouvez maintenant aller sur Moodle. Dans le dépôt «TP shell» de la section «Évaluations», déposez le fichier .bash_history
situé dans /home/nsi/
. Si vous ne le voyez pas, affichez les fichiers cachés (Ctrl + H).
Le corrigé en vidéo:
Les commandes (a minima):
pwd
cd~
rm .bash_history
mkdir Documents/Terminal/ Documents/Terminal/TP/
mv Téléchargements/foo.txt Documents/Terminal/TP/
cd Documents/Terminal/TP/
mv foo.txt queneau1014poemes.txt
mkdir ../Sauvegarde/
cp queneau1014poemes.txt ../Sauvegarde/queneau_save.txt
head -n 14 queneau1014poemes.txt
grep -i Malabar queneau1014poemes.txt
grep -i Bretzel queneau1014poemes.txt
grep -i Cacahuète queneau1014poemes.txt
grep -c frère queneau1014poemes.txt
grep -n illustre queneau1014poemes.txt
touch reponses.txt
echo 8. Cacahuète > reponses.txt
echo 9. 2 fois >> reponses.txt
echo 10. ligne 113 >> reponses.txt
cat reponses.txt
ls -l
chmod g-w,o-r reponses.txt
cd ../..
rm -r Terminal/
exit