Manipulations de base et programmation shell


Objectifs

Le but du TP est de vous faire utiliser les commandes de base UNIX pour pouvoir les combiner ensuite de façon à construire des fichiers de commandes (scripts shell).

Présentation

Lorsque vous vous connectez sur la machine, il y a dans un premier temps une phase d'identification (Nom de login, Mot de passe), à la suite de cette identification toutes les opérations que vous allez réaliser seront faites au regard de vos droits sur les ressources gérées par le système (fichiers, mémoire centrale, utilisation CPU).

Sous Unix après avoir satisfait la phase d'identification, le système lance un processus (dont vous êtes le propriétaire) qui exécute un interpréteur de commandes (sh, csh, tcsh, ksh). Chaque interpréteur de commandes utilise un fichier de configuration pour initialiser votre environnement. Par défaut chaque compte étudiant utilise l'interpréteur de commandes sh.

L'interpréteur de commandes csh parcourt deux fichiers d'initialisation: les fichiers .cshrc et .login qui se trouvent dans votre répertoire de login. Dans un environnement de multi-fenêtrages, à chaque ouverture d'une fenêtre de commandes (shelltool, cmdtool, xterm) un nouveau processus est lancé et va exécuter l'interpreteur de commandes, dans ce cas seul le fichier .cshrc est parcouru (Si vous ouvrez N fenêtres de commandes vous avez N+1 interpréteurs de commandes qui s'exécutent, un par fenêtre et un suite au login).

L'interpréteur de commandes sh utilise lui le fichier .profile.

Ces fichiers correspondent aux fichiers AUTOEXEC.BAT et CONFIG.SYS du système d'exploitation MSDOS. Ils vous permettent de personnaliser votre environnement de travail.

Outils

Le TP doit se faire en utilisant l'interpréteur de commandes sh. Pour cela après avoir lancé l'environnement de multi-fenêtrages, ouvrir une fenêtre de commandes xterm (Vous créez un processus qui va exécuter un interpréteur de commandes sh).

Travail Demandé

Utilisation des commandes usuelles

La commande man

La commande man vous permet d'obtenir une aide en ligne sur une commande donnée en argument.

Question
Après avoir tapé la commande man man, noter comment est structurée l'aide (les différentes rubriques).

Question
Utiliser le manuel en ligne pour obtenir de l'aide sur la commande cal. Donner une synthèse du manuel concernant cette commande.

Le manuel est divisé en sections:

  1. Commandes utilisateur;

  2. Appels système;

  3. Les librairies (C, Entrée/Sortie, Mathématique, Fortran, etc ...);

  4. Les fichiers spéciaux (/dev/...);

  5. Les formats de fichiers d'administration et système;

  6. Les jeux;

  7. Les autres;

  8. Les outils d'administration.

Question
Constater la différence entre les commandes man kill et man 2 kill.

Question
Donner la structure d'une ligne du fichier /etc/passwd
Donner la structure d'une ligne du fichier passwd en utilisant la commande man.

Question
Même chose avec le fichier group.

Manipulation des fichiers sous UNIX

Les manipulations vont se faire dans un répertoire tpis1. Vous devez donc commencer par créer un répertoire tpis1 dans votre répertoire de login, à la suite de quoi vous vous placez dans ce répertoire (La commande ls vous servira à constater les modifications survenues dans le système de fichiers suite aux commandes exécutées).

Question
Donner les commandes pour réaliser les opérations précédentes.

Question
Donner trois méthodes pour créer un fichier texte. Créer deux fichiers dans le répertoire courant avec les noms un et deux.

Question
Copier le fichier un dans un fichier trois. Donner les commandes utilisées.

Question
Créer un répertoire sous_tpis1 dans le répertoire courant. Dans le répertoire sous_tpis1 créer un lien physique sur le fichier trois en lui donnant le nom quatre. Dans le répertoire sous_tpis1, créer un lien symbolique sur le fichier trois en lui donnant le nom cinq. Donner les commandes utilisées et constater les modifications dans le système de fichiers au fur et à mesure des commandes.

Question
Dans le répertoire tpis1 renommer le fichier trois en six. Donner la commande utilisée. Est-ce que cela pose problème ?

Question
Dans le répertoire tpis1 détruire le fichier six. Donner la commande utilisée. Est-ce que cela pose problème ?

Redirection des Entrées/Sorties

Dans le cas général une commande qui s'exécute considère les caractères frappés au clavier comme son canal d'entrée de données par défaut, et utilise l'écran comme canal de sortie des résultats. Nous allons modifier la valeur des canaux par défaut.

Question
Rediriger les sorties de la commande ls vers un fichier liste. Donner la commande utilisée.

Question
Après s'être placé dans le répertoire sous_tpis1, rediriger les sorties de la commande ls vers le fichier liste du répertoire tpis1. Donner la commande utilisée. Soit le fichier mauvais.c dont le contenu est le suivant:
#include <stdio.h>
main() {
int i;
printf("Debut de programme\n\n");
for (i=0; i<max; i++)
printf("Valeur de i = %d\n",i);
printf("Fin de programme\n");
}
Si vous le compilez avec la commande gcc -c mauvais.c, il y aura des messages erreurs.

Question
Rediriger les messages d'erreurs vers le fichier err.

Question
Soit le fichier /usr/share/man/man1/bash.1.bz2, donner la commande qui indique le nombre de lignes, le nombre de mots et le nombre de caractères.

Question
Modifier la commande précédente pour que le résultat se trouve dans le fichier bash.txt dans le répertoire tpis1.

La commande ypcat passwd donne le contenu du fichier passwd réseau.

Question
Donner la ligne de commande qui va trier le contenu du fichier passwd par ordre alphabétique avant de l'afficher sur l'écran (Le tri sera effectu´ sur le nom de login, vous n'utiliserez pas de fichier intermédiaire).

Les caractères spéciaux

Certains caractères (comme *, #, ?, [, ], $, etc ...) sont transformés par l'interpréteur de commandes avant d'être traités par la commande elle-même. Il existe différentes méthodes pour que ces caractères spéciaux perdent leur propriété.

Question
Donner deux méthodes pour faire perdre leur propriété aux caractères spéciaux.

Question
Donner la commande qui liste les fichiers qui commencent par le caractère a ou A.

Question
Donner la commande qui liste les fichiers qui finissent par .cXX désigne un chiffre.

Les droits d'accès d'un fichier

A la création d'un fichier on lui affecte des droits par défaut. Ces droits par défaut sont définis en fonction d'un masque que l'on peut modifier en utilisant la commande umask. Voici un exemple d'utilisation de la commande umask:

$ umask
022
$touch toto
$ ls -l toto
-rw-r--r-- 1 duchmol gtr 0 19 Oct 15:18:56 toto
$ umask 026
$ touch titi
$ ls -l titi
-rw-r----- 1 duchmol gtr 0 19 Oct 15:18:56 titi
$

La commande umask permet de retirer des droits aux valeurs maxi 666 pour un fichier et 777 pour un répertoire.

Question
Donner la commande qui permet de créer par défaut des fichiers qui ne seront pas accessibles en lecture/écriture par le groupe propriétaire et par les autres.

Soit un masque de création qui vaut 022

Question
Donner la commande qui ajoute les droits d'exécution sur un fichier pour tous

Question
Donner la commande qui retire les droits de lecture aux autres

La programmation Shell

L'enchaînement de commandes

Soient les lignes de commandes suivantes:

(cd /; pwd); pwd
{ cd /; pwd; } ; pwd
Question
Expliquer la différence des résultats.

Soient les commandes suivantes:

ls -l

qui liste le contenu du répertoire courant

ps -aux

qui liste les processus en cours d'exécution

who

qui liste les utilisateurs connectés

Question
Donner la ligne de commandes qui enchaine ces trois commandes et qui redirige le résultat dans le fichier listing

Les accès aux fichiers d'administration réseau sont conditionnés par la présence de la commande ypbind dans la liste des processus en exécution.

Question
Donner la ligne de commandes qui teste la présence de la commande ypbind dans la liste des processus en exécution, si oui alors on liste le fichier passwd et sinon on affiche un message d'erreur.

Question
Donner la ligne de commandes qui teste la présence d'un répertoire /tmp/poubelle, si oui détruit le contenu du répertoire et sinon affiche un message d'erreur.

Les variables d'environnement

Rappels: Une variable est définie dès qu'on lui affecte une valeur. Cette variable est visible ou encore définie uniquement pour le shell dans lequel elle a été définie. Pour la rendre visible pour les processus qui seront lancés après cette affectation (lancement d'un autre shell par exemple), il faut «exporter» la variable. Cette opération est réalisée en utilisant la commande export.

Soit le fichier export_test dont le contenu est le suivant:

echo "\$a a pour valeur $a"

Après avoir crée et ajouté les droits en exécution sur le fichier export_test, affecter à la variable a la valeur elephant rose. Exécuter une première fois la commande export_test, puis exécuter la commande export a et exécuter une deuxième fois la commande export_test. Vous export_test. Vous pouvez constater la différence de comportement, expliquer.


La programmation en langage shell

Créer le répertoire tpis2 dans votre répertoire de login.

Question
Écrire les scripts tp21 et tp22 qui affichent les entiers de 1 à 10. Écrire une version qui utilise l'instruction for et une version qui utilise l'instruction while

Question
Écrire un script tp23 qui affiche un à un les arguments du script.
Exemple:
$ tp23 arg1 arg2 arg3
arg1
arg2
arg3
$
Question
Écrire un script tp24 qui exécute la commande donnée en argument et qui affiche le status de retour.
Exemple:
$ tp24 ls
tp21 tp22 tp23 tp24
0
$
Question
Modifier le script tp24 dans un script tp25 qui affiche une chaîne de caractères plutôt que la valeur numérique.
Exemple:
$ tp25 ls
tp21 tp22 tp23 tp24 tp25
Ca marche !
$

On peut écrire des scripts shell interactifs, c'est à dire qui attendent des données en cours d'exécution. Pour cela on utilise l'instruction read. Par exemple le script shell moral décrit ci-dessous stocke la réponse de l'utilisateur dans la variable rep

echo -n "Comment vas-tu aujourd'hui (bien, mal)? "
read rep
if [ "$rep" = "bien" ]; then
echo "Super !!!"
else
echo "Ca ira mieux demain !"
fi
Question
Ecrire un script shell tp26 qui affiche un menu proposant différentes commandes qu'il peut exécuter. Le script attend une saisie de la part de l'utilisateur et exécute la commande en fonction de la saisie. Si la saisie est erronée (choix qui n'est pas dans le menu) on affiche un message d'erreur. Voici un exemple de menu:
$ tp26
a - execute who
b - execute ls -l
c - execute ps -aux
Votre choix ? b
... (résultat de l'exécution ls -l)
$

Soit un répertoire poubelle dans votre répertoire de login. Ce répertoire est utilisé pour stocker tous les fichiers qui sont en attente de destruction. Nous nous proposons d'écrire un script shell qui gérera ce répertoire poubelle. Le script acceptera les options suivantes:

Question
Ecrire le script shell tp27e qui gère l'utilisation du répertoire poubelle. En plus des deux options (-l,-r) si l'argument est un ou une liste de noms de fichier alors le(s) fichier(s) sera(seront) déplacé(s) dans le répertoire poubelle. Le script n'accepte qu'une seule option: soit -l, -r, soit une liste de fichiers.

Question
Créer le fichier recette suivant
             carottes
tomates
chou rouge
navets
pommes de terre

Donner le script shell rech1 qui permet de rechercher un mot dans le fichier recette. Le mot recherché est un argument de la commande rech1. La recherche doit être effectuée sans distinguer les majuscules et les minuscules.
Par exemple, la commande

             rech1 carottes

a pour résultat

             le mot carottes a été trouvé

la commande

             rech1 fraises

a pour résultat

             le mot fraises n'a pas été trouvé

la commande

             rech1

a pour résultat

             erreur usage: rech1 mot
Question
Donner le script shell rech2 qui permet de rechercher un mot dans tous les fichiers d'un répertoire donné en argument. Ce script doit possèder deux arguments
Il doit vérifier que le nombre d'arguments est correct et vérifier que le deuxième argument est un nom de réperoire existant. Ce script affiche en plus les fichiers dans lequel le mot a été touvé.
Exemple : Si le répertoire courant contient le répertoire rep constitué des trois fichiers recette1 recette2 recette3
             contenu de recette1
chocolat banane
contenu de recette2
ananas banane
contenu de recette3
chocalat banane cerise

la commande

             rech2 chocolat rep

affiche

             Le mot chocolat a été trouvé dans le fichier recette1
Le mot chocolat a été trouvé dans le fichier recette3

Question
Modifier le script précédent pour qu'il affiche en plus le nombre de fichiers du répertoire et le nombre de fichiers du répertoire dans lesquels le mot a été trouvé.

Question
Ecrire un script shell add qui effectue l'addition de tous ses arguments suposés numériques

Question
Ecrire un script shell calcul qui réalise une calculette élémentaire. Celui ci possède trois arguments opérande 1, opérateur est opérande 2
Par exemple la commande

            calcul 17 + 22

affiche

            39

la commande

            calcul 17 '*' 22

affiche

            374

la commande

            calcul 17 , 22

affiche

            opérateur inconnu