2. TP de système #2 : un peu de programmation shell !

2.1 Exercice #1 : utilisation d'un menu pour contrôler la commande tar

2.1.1 Motivation

Les utilisateurs novices d'Unix sont régulièrement déroutés par la complexité des lignes de commande à mettre en oeuvre. Dans cet exercice, vous allez créer un script destiné à les aider à utiliser la commande tar en les guidant par l'intermédiaire de menus.

La commande permettant de lire au clavier une variable est read. Par exemple, la succession de commandes read i; echo ${i} lit au clavier une chaîne de caractère avec read (la lecture se poursuit jusqu'au moment où vous appuyez sur la touche entrée) et l'affiche avec echo.

2.1.2 Déroulement du programme

Le programme devra se dérouler en 3 étapes :

  1. Choix de l'opération à exécuter : vous présenterez le menu suivant :
    Choisissez une operation :
    Creer une nouvelle archive 1
    Ajouter des fichiers dans une archive 2
    Lister le contenu d'une archive 3
    Extraire le contenu d'une archive 4
    Quitter le programme 0

    Bien entendu, il n'y a qu'une seule opération possible !
  2. Dans un second temps, vous permettez de choisir une ou plusieurs options à l'aide du menu suivant :
    Choisissez une ou plusieurs options :
    Mode verbeux 1
    Respect des permissions 2
    Fin 0
  3. Dans un troisième temps, vous faîtes choisir le nom du fichier archive, il vous est demandé de faire les vérifications suivantes :
    1. Si l'opération est la création et que le fichier existe, proposez :
      1. L'écrasement de l'archive
      2. Le changement du nom du fichier
      3. Le passage en mode « ajout »
      4. L'abandon de l'opération
    2. Pour toute autre opération, si le fichier n'existe pas, proposez :
      1. Le changement du nom du fichier
      2. L'abandon de l'opération
  4. Finalement, vous demanderez le nom des fichiers à archiver

Indication : le mieux est de construire en quatre parties une chaîne représentant la ligne de commande :

2.1.3 Pour aller plus loin dans l'exercice

Si vous désirez aller plus loin dans l'exercice, il vous est possible d'apporter les améliorations suivantes :

Vers la solution !

2.2 Exercice #2 utilisation d'expressions arithmétiques

Ecrivez un script shell qui prend sur sa ligne de commande un nombre et un nom de fichier de base et qui effectue l'opération suivante :

Ecrire " Ceci est le fichier numéro i " dans le fichier " nom_de_base.i "

... où i varie entre 1 et le deuxième argument de la ligne de commande du script (le premier étant nom_de_base). Vous utiliserez les possibilités suivantes :

  1. Utilisez les expressions arithmétiques du Korn shell dans une boucle while
  2. En Bourne shell, utilisez la syntaxe " à la Fortran " des expressions de test ainsi que la commande expr
  3. Utilisez une boucle for sans recourir aux expressions arithmétiques. Il sera nécessaire d'utiliser un micro programme écrit en C et qui génère une suite de nombres
  4. N'oubliez pas d'inclure un mécanisme de gestion du nombre d'arguments !

Quelle méthode vous paraît la plus simple ? Ceux qui, à la suite de cet exercice, considèreront toujours qu'un mécanisme évolué de gestion des opérations arithmétiques dans les scripts shell ne s'imposait pas sont priés de passer me voir dans mon bureau !

Vers la solution !

2.3 Exercice #3 utilisation de sed pour changer l'extension de plusieurs fichiers

2.3.1 Motivation

Cet exercice est tout spécialement intéressant pour les gens en provenance de MSDOS et son résulat me sert régulièrement dans mes tâches quotidiennes d'administration système. En effet, supposons que vous vouliez changer l'extension d'un grand nombre de fichiers depuis .htm vers .html. Sous MSDOS, et, pourvu que les fichiers soient situés dans le même répertoire, vous faîtes ren *.htm *.html et le tour est joué ! Et là, vous voulez réitérer la commande sous Unix et vous vous rendez compte du résultat désastreux du au globbing par le shell ! Cet exercice vous propose de résoudre ce problème. En outre, vous pourrez utiliser cette commande sur des fichiers contenus dans une arborescence complète.

2.3.2 Comment procéder ?

Voici le modus operandi de l'opération :

  1. Extrayez avec find la liste des fichiers .htm
  2. Modifiez le texte obtenu avec sed de manière à avoir sur une même ligne le nom du fichier initial, puis le nom modifié
  3. Appliquez mv sur la liste obtenue avec xargs -n2
  4. Le tour est joué !

2.3.3 Un Exemple concret :

  1. Liste de fichiers :
    ./toto.htm
    ./titi.htm
    ./sousrep/t2.htm
  2. Après modification par sed
    ./toto.htm ./toto.html
    ./titi.htm ./titi.html
    ./sousrep/t2.htm ./sousrep/t2.html
  3. L'application de xargs -n2 mv se traduira par :
    mv ./toto.htm ./toto.html
    mv ./titi.htm ./titi.html
    mv ./sousrep/t2.htm ./sousrep/t2.html

    Ce qui donne bien le résultat attendu.

2.3.4 Travail à effectuer :

Ecrire un script prenant en paramètres :

... et réalisant l'opération ci-dessus !

Vers la solution !

2.4 Exercice #4 utilisation de awk pour punir des utilisateurs indélicats !

2.3.1 Introduction

Parfois, vous voulez limiter l'utilisation de quelques commandes pendant certaines heures de la journée sans toutefois vouloir recourir à la gestion par groupes d'utilisateurs ou de crontabs. Vous instaurez donc un système basé sur la confiance ... Toutefois, vous vous rendez rapidement compte que, si la majorité de vos utilisateurs joue le jeu, quelques têtes brulées persistent à braver votre autorité, voyons comment les recenser ... en utilisant en particulier les commandes ps, grep et awk.

2.4.2 Travail à effectuer :

Ecrivez un script permettant d'extraire de manière unique le nom des utilisateurs utilisant une commande passée en argument.

2.4.3 Pour aller plus loin dans l'exercice :

  1. Créez un fichier contenant le nom des commandes interdites et passez le en revue pour rechercher les utilisateurs indélicats.
  2. Prévoyez d'appliquer régulièrement votre commande (pensez à cron)

Vers la solution !

2.5 Utilisation de sed : passage de code source vers HTML et réciproquement

2.5.1 Motivation

Soit une belle page ouaib contenant du code source. Vous faîtes un beau copier coller vers votre éditeur de code source (vi par exemple), et, oh ! malheur ! celui-ci est rempli de cabalistique HTML remplaçant certains des caractères les plus courants en programmation : "<>&".

Exemple inverse, vous voulez insérer du code source dans une page HTML. Vous faîtes l'insertion brutale et au moment de la visualisation, tout est de travers car certains des caractères de votre code source ont été décodés comme des débuts de balise HTML.

Or, il n'est rien de plus fastidieux que de réaliser à la main la conversion d'un format vers l'autre, aussi, vous saisissez vous de sed pour écrire les 2 scripts de transformation !. Il y a un seul piège à éviter, celui concernant le caractère &.

2.5.2 Les caractères à transcrire

Voici une liste minimale des caractères à convertir :

Code Source HTML
< &lt;
> &gt;
& &amp;
" &quot;

Comme vous le voyez, le caractère le plus difficile à traiter est &.

Vers la solution !