Aller au contenu

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/
Et trois fichiers 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
Voici quelques options utiles:

  • --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 de chemin, 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 - ou d 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 droits rw- et les autres utilisateurs o ont les droits r--, c'est-à-dire seulement lecture. Pour les dossiers, tous les utilisateurs ont le droit d'éxécution x, 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
Par exemple,
chmod g+w toto.txt
attribuera la permission "écriture" au groupe associé au fichier toto.txt.

5.2.5 Exercices⚓︎

Exercice 1

  1. Donner les chemins absolus:

    • du fichier grub.cfg
    • du répertoire photos_vac
  2. Le répertoire courant est grub. Donner le chemin relatif du fichier abi.

  3. Le répertoire courant est documents. Donner les chemins relatifs:

    • du fichier rapport.odt
    • du dossier images

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.

  1. cd ~
  2. mkdir T5
  3. mkdir T5/TP_shell
  4. cd T5/TP_shell
  5. touch toto.txt
  6. ls -l
  7. chmod g-rwx,o-rwx toto.txt
  8. ls -l
  9. cd ..
  10. 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.

  1. mkdir series films mangas musique
  2. touch films/sw.txt mangas/HxH.txt
  3. cd series/
  4. mkdir ../musique/rap/ got/ oitnb/
  5. cd ..
  6. cp */*.txt series/got/
  7. 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/.

  1. Dans votre répertoire personnel, créez un répertoire Shell/ puis un répertoire Exo5/ dans ce répertoire Shell/.
  2. Déplacez le fichier pg6318.txt dans le répertoire Exo5/ que vous venez de créer.
  3. Consultez les 25 premières lignes de ce fichier, puis renommez-le judicieusement.
  4. Créez un fichier nommé reponses.txt.
  5. Consulter le manuel de la commande echo.
  6. Écrivez votre nom dans ce fichier à l'aide de la commande echo.
  7. Cherchez les mots rouge, bleu et jaune dans le fichier texte et ajoutez au fichier reponses.txt celui qui n'y apparaît pas.
  8. Vérifier en affichant le contenu du fichier reponses.txt.
  9. Cherchez en quelle ligne apparaît pour la première fois le mot traître.
  10. Ajouter cette réponse au fichier reponses.txt.

Exercice 6

Ouvrir un terminal, puis sans quitter le répertoire courant:

  1. créer un répertoire Exo6/ puis les répertoires Exo6/NSI/ et Exo6/Divers/.
  2. créer un fichier hello.py dans le répertoire Exo6/NSI/.
  3. écrire print("hello world") dans ce fichier.
  4. se déplacer dans le répertoire Exo6/NSI/.
  5. afficher le contenu de ce fichier hello.py.
  6. accorder tous les droits à «tout le monde» sur le fichier hello.py.
  7. 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.

  1. En une seule commande, se déplacer dans le répertoire Bibliothèque.
  2. Afficher le contenu de ce répertoire.
  3. Chercher toutes les occurences du mot "informatique" dans les fichiers texte de ce répertoire.
  4. 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.

  1. Consultez le répertoire courant (dans lequel vous vous situez). Si ce n'est pas votre répertoire personnel (/home/nsi/), revenez-y.
  2. Supprimez le fichier .bash_history (ne pas oublier le point).
  3. Créez un répertoire Terminal/ dans le répertoire Documents/, puis un répertoire TP/ dans ce répertoire Terminal/.
  4. Déplacez le fichier foo.txt que vous avez téléchargé vers le répertoire TP/ que vous venez de créer .
  5. Renommez ce fichier en queneau1014poemes.txt.
  6. 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épertoire Sauvegarde/ dans le répertoire Terminal/.
  7. Créez une copie du fichier queneau1014poemes.txt dans le répertoire Sauvegarde/ sous le nom queneau_save.txt.
  8. Dans le répertoire TP/, consultez les 14 premières lignes du queneau1014poemes.txt.
  9. Parmi les 3 mots suivants, lequel(s) n'y figure(nt) pas (peu importe la casse)? Malabar, Bretzel, Cacahuète?
  10. Donnez le nombre d'occurences du mot «frère».
  11. En quelle ligne trouve-t-on le mot «illustre»?
  12. 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 fichier reponses.txt dans lequel vous écrirez les réponses aux questions 8, 9 et 10.
  13. Vérifiez en affichant le contenu du fichier reponses.txt.
  14. Consultez le contenu du répertoire TP/, en affichant les détails sur les droits.
  15. 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.
  16. Supprimez le répertoire Terminal/ et tout son contenu.
  17. 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