PROFDINFO.COM

Votre enseignant d'informatique en ligne

Section 1 - Révision et premiers pas

Retour à la page du cours

Cette section se veut une révision des notions du cours de Systèmes d'exploitation 2 (Linux) qui seront utiles dans le cadre de ce cours. Vous êtes donc invités à relire les sections pertinentes (1.5, 2.1, 4 et optionnellement 3) en parallèle avec (et en plus de) celle-ci. Ensuite, nous ferons quelques pas dans la création d'un premier script: l'automatisation de la création des comptes usagers.

1.1 - La création d'usagers

1.2 - Un premier script bash

1.3 - Le paramétrage

1.4 - Exercices

1.1 - La création d'usagers

Les étapes de la création d'un compte usager, méthode longue (des exemples de commandes sont donnés entre parenthèses à chaque étape):

  • Si le groupe dans lequel on veut mettre l'usager n'existe pas, on crée le groupe (groupadd dundermifflin)
  • Si on désire créer un répertoire de groupe, dans lequel se trouveront en sous-répertoires les maisons des usagers membres de ce groupe, on le fait (mkdir /home/dundermifflin)
    • En passant, on devrait donner ce répertoire au groupe approprié afin qu'ils aient des droits spéciaux dessus (chgrp dundermifflin /home/dundermifflin)
    • Du coup, il est une bonne pratique de changer les permissions d'accès sur ce répertoire (chmod 750 /home/dundermifflin)
  • On crée la maison de l'usager (mkdir /home/dundermifflin/dwight)
  • On crée l'usager lui-même, en spécifiant son groupe, son répertoire maison, son shell par défaut et bien entendu son nom de login (useradd -g dundermifflin -d /home/dundermifflin/dwight -s /bin/bash dwight)
  • On donne la maison à l'usager (chown dwight /home/dundermifflin/dwight)
  • On donne la maison au groupe de l'usager (chgrp dundermifflin /home/dundermifflin/dwight)
    • Ça peut être une bonne idée de changer les permissions d'accès sur la maison de l'usager (chmod 750 /home/dundermifflin/dwight)
  • On donne un mot de passe au compte (passwd dwight, puis on écrit le mot de passe frodo deux fois).

Les étapes de la création d'un compte usager, méthode courte (les différences avec la méthode longue sont en gras et italique):

  • Si le groupe dans lequel on veut mettre l'usager n'existe pas, on crée le groupe (groupadd dundermifflin)
  • Si on désire créer un répertoire de groupe, dans lequel se trouveront en sous-répertoires les maisons des usagers membres de ce groupe, on le fait (mkdir /home/dundermifflin)
    • En passant, on devrait donner ce répertoire au groupe approprié afin qu'ils aient des droits spéciaux dessus (chgrp dundermifflin /home/dundermifflin)
    • Du coup, il est une bonne pratique de changer les permissions d'accès sur ce répertoire (chmod 750 /home/dundermifflin)
  • On crée l'usager lui-même, en spécifiant son groupe, son répertoire maison (qu'on demande à être créé), son shell par défaut et bien entendu son nom de login (useradd -g dundermifflin -d /home/dundermifflin/michael -m -s /bin/bash michael)
    • Le répertoire maison est créé automatiquement, puis donné à l'usager et à son groupe.
    • Des permissions strictes sont également imposées sur le répertoire.
    • Les fichiers de /etc/skel sont copiés dans la maison de l'usager, puis lui sont donnés.
  • On donne un mot de passe au compte (passwd michael, puis on écrit le mot de passe 1234 deux fois).

Il est évident que la deuxième méthode est plus efficace: non seulement on a besoin de taper moins de commandes, mais en plus elle copie les fichiers du /etc/skel. Notez que si on l'utilise, on peut ajouter la switch -k à useradd pour spécifier un répertoire d'où copier les fichiers de départ. Ceci peut nous permettre d'utiliser autre chose que /etc/skel. On peut même se monter plusieurs répertoires de démarrage prêts d'avance pour différents types de comptes et utiliser le bon à chaque fois:

useradd -g dundermifflin -d /home/dundermifflin/pam -m -k /etc/skel_clerical -s /bin/bash pam

Retour à la table des matières de la section

1.2 - Un premier script bash

Un script n'est au départ rien d'autre qu'un fichier texte. Ce fichier sera interprété par le shell (l'interpréteur de commandes), en l'occurence bash.

Pour créer le script, il nous suffit de créer un fichier texte avec l'outil de notre choix (par exemple vi ou nano). On y écrira des commandes qui seront exécutées une après l'autre dans l'ordre, comme une séquence. Chacune de ces commandes pourrait être tapée directement à l'invite et le résultat serait exactement le même.

En plus des commandes, on verra qu'il existe tout un tas de mots réservés qui nous permettront d'implémenter des alternatives, des répétitives, des variables et toutes ces fonctionnalités qui ont fait notre bonheur lors des cours de programmation.

La première ligne de notre script (l'entête) devra nécessairement être celle-ci:

#!/bin/bash

Cette ligne indique qu'il faut utiliser /bin/bash pour interpréter notre script. En effet, chaque shell possède ses propres commandes et, si les commandes Linux sont assez similaires d'un shell à l'autre, tout ce qui a trait aux scripts varie beaucoup. Lorsqu'on démarre un script qui n'a pas d'entête, notre shell par défaut sera l'interpréteur. Par contre, s'il a une entête, c'est le shell spécifié dans cette entête qui l'interprétera, ce qui nous assure qu'il fonctionnera peu importe qui l'exécute et sur quel serveur.

Supposons qu'on décide de faire un script qui s'occupe de créer un groupe et de créer un répertoire correspondant au groupe sous /home (en plus de gérer ses permissions). Créons donc un nouveau fichier qu'on appellera CreerGroupe et ajoutons-y le contenu suivant:

#!/bin/bash

# creation du groupe
/usr/sbin/groupadd usagers

# creation du répertoire "racine" de ce groupe
mkdir /home/usagers

# don du répertoire "racine" du groupe au groupe
chgrp usagers /home/usagers

# changement des droits sur le répertoire "racine"
chmod 750 /home/usagers

À noter:

  • À l'exception de la ligne d'entête, une ligne qui commence par un # est un commentaire, qui sera donc ignoré par bash.
  • C'est une bonne idée d'utiliser le chemin complet des commandes qui ne font pas partie des commandes de base (comme /usr/sbin/groupadd). Ainsi, si celui qui l'utilise n'a pas le même PATH que nous, le script fonctionnera quand même.
  • Ce script est équivalent à écrire les 4 commandes qu'il contient une après l'autre à l'invite de commandes. Il permet donc de créer le groupe "usagers" et son répertoire, ainsi que d'en gérer les permissions.

Pour exécuter notre script, on devra enregistrer le fichier texte, puis le rendre exécutable. N'oublions pas que sous Linux, un fichier est exécutable si on a la permission de l'exécuter, rien de plus! On fera donc quelque chose comme:

chmod u+x CreerGroupe

On peut ensuite l'appeler en tapant son nom. Si le répertoire dans lequel on se trouve ne fait pas partie du PATH, on n'a qu'à le préfixer de son chemin (absolu si on veut, mais relatif est beaucoup plus simple):

./CreerGroupe

Est-ce que ça a produit un effet? Rien ne semble s'être passé. Toutefois, la plupart du temps c'est une bonne chose en Linux. N'oubliez pas que bien souvent, si une commande fonctionne, elle ne donne aucun feedback. C'est si une erreur survient qu'on aura quelque chose à lire...

Pour vérifier si notre script a fonctionné, on peut aller voir le fichier /etc/group, qui contient une ligne pour chaque groupe. On peut également aller voir dans le répertoire /home si le répertoire a bel et bien été créé et donné au groupe:

cat /etc/group
ls -l /home

Qu'arrive-t-il si on tente d'exécuter le script de nouveau?

./CreerGroupe

On confirme ce que je disais quelques lignes plus haut: quand un problème surgit, le script nous donne des messages! Du coup, on découvre (ou confirme) que notre script n'est pas particulièrement utile puisqu'il ne peut que créer le groupe "usagers". Une fois qu'il a rempli son travail, il ne peut plus rien faire d'autre.

Retour à la table des matières de la section

1.3 - Le paramétrage

Évidemment, on aimerait bien pouvoir utiliser notre premier script pour créer d'autres groupes, différents à chaque usage. On pourra arriver à ce but en utilisant les paramètres.

Un paramètre, on le sait (normalement), c'est une information qu'on passe à une commande pour qu'elle fasse son travail. Par exemple, si je fais:

cp fichier /home/georges

j'appelle la commande cp et je lui passe deux paramètres: fichier et /home/georges. Il est convenu que le premier paramètre est la source (le fichier à copier) et le deuxième la destination (où le copier).

On pourra utiliser des paramètres dans nos scripts très facilement. À chaque paramètre est associé une variable spéciale, représentée par un simple numéro. Comme pour toute variable en Linux, pour accéder à son contenu, on doit la préfixer d'un signe de dollar ($).

Le contenu du premier paramètre sera donc $1, celui du deuxième $2, et ainsi de suite jusqu'à $9. Au delà du neuvième paramètre, il faut inclure le nombre entre accolades, comme ceci: ${10}. Il n'y a théoriquement pas de limite au nombre de paramètres, bien que ce soit en pratique assez rare qu'on se rende à dix.

Dans notre script, tout paramètre positionnel précédé d'un signe de dollar sera remplacé par sa valeur, telle qu'entrée par l'usager qui a lancé l'exécution du script.

Si on veut que CreerGroupe puisse créer n'importe quel groupe (et pas seulement le groupe usagers), on n'a qu'à remplacer "usagers" par "$1" dans notre script. Ainsi, on pourra l'appeler en lui passant le nom du groupe que l'on veut créer à chaque fois. CreerGroupe devient donc:

#!/bin/bash

# creation du groupe
/usr/sbin/groupadd $1

# creation du répertoire "racine" de ce groupe
mkdir /home/$1

# don du répertoire "racine" du groupe au groupe
chgrp $1 /home/$1

# changement des droits sur le répertoire "racine"
chmod 750 /home/$1

De cette façon, on peut exécuter notre script ainsi:

./CreerGroupe reseaux

$1 sera remplacé par "reseaux" partout dans le code, qui sera ensuite exécuté. Magie!

Notez:

  • $0 contient le nom du script. Ça peut parfois être utile lorsqu'on donne un message d'aide pour expliquer comment utiliser le script. On peut faire référence au nom du script, quel qu'il soit, même si quelqu'un l'a renommé.
  • Un paramètre positionnel non utilisé est remplacé par du vide. Par exemple, si quelqu'un fait:
    ./CreerGroupe

Pour l'instant, on ne peut rien y faire. On supposera que l'usager utilise notre script correctement, mais on apprendra très bientôt à vérifier les paramètres avant de commencer le travail, à donner des messages d'erreurs, et à vérifier qu'une opération a fonctionné avant de décider de poursuivre.

Retour à la table des matières de la section

1.4 - Exercices

  1. Assurez-vous d’avoir bien écrit CreerGroupe, et d’être en mesure de le faire fonctionner correctement.
  2. Essayez d’écrire DetruireGroupe qui essaie de détruire le groupe passé en paramètre et d’éliminer le répertoire lui étant associé. Présumez pour l’instant qu’on parle d’un groupe qui existe et dont aucun usager ne fait encore partie.
  3. Essayez d’écrire RenommerGroupe qui essaie de changer le nom du groupe passé en paramètre et celui du répertoire lui étant associé. Présumez pour l’instant qu’on parle d’un groupe qui existe dont aucun usager ne fait encore partie.
  4. Essayez d’écrire un script CreerUsager pour créer un usager d’un groupe donné. Votre script devra prendre en paramètre le nom du groupe et le nom de l'usager, appeler CreerGroupe pour qu'il s'occupe de la création du groupe, puis créer correctement l'usager et son répertoire maison. On supposera à chaque fois qu'on crée un usager qui n'existe pas déjà. Vous pourrez tester avec des groupes qui n'existent pas non plus, mais remarquez que si le groupe existe déjà, CreerGroupe affichera des erreurs mais CreerUsager fonctionnera tout de même très bien (ce coup-ci c'est un avantage que de poursuivre l'exécution malgré les erreurs!).

Voyez les solutions de ces exercices ici.

Retour à la table des matières de la section