Correct Exam Syst Exploit 1
Correct Exam Syst Exploit 1
Correct Exam Syst Exploit 1
Exercice 1 : (5 pts)
1. On suppose que le répertoire courant est « /home/smi » et que « rep » est un sous répertoire
du répertoire « smi ». Donner les résultats des commandes suivantes :
% (cd rep; pwd)
% pwd
% a=5
% { v=10 ; echo "a = $a v = $v" ; cd ~/rep; pwd ; }
%pwd
2. Soit « fiche » un fichier du répertoire courant.
a. Donner les droits d’accès du fichier « fiche » après avoir exécuté la commande suivante :
% chmod 651 fiche
b. Donner les droits d’accès du fichier « fiche » après avoir exécuté la commande suivante :
% chmod u=rx,o=rx fiche
Réponses
1.
% (cd rep; pwd)
Affiche: /home/smi/rep
% pwd
Affiche: /home/smi
% a=5
% { v=10 ; echo "a = $a v = $v" ; cd ~/rep; pwd ; }
Affiche:
a=5 v=10
/home/smi/rep
%pwd
Affiche: /home/smi/rep
2.
2.a.
% chmod 651 fiche
Réponse: Le fichier « fiche » aura les droits suivants : rw- r-x --x
En effet : 6 = 110 correspond aux droit rw-
5 = 101 correspond aux droits r-x
1= 001 correspond aux droits --x
2.b.
% chmod u=rx,o=rx fiche
Réponse: le fichier « fiche » aura les droits suivant : r-x r-x r-x
Exercice 2 :
1. Lister tous les noms des fichiers dont le premier caractère est la lettre « a » ou « A » et l’avant
dernier caractère est la lettre « t ».
Réponse:
- En utilisant la commande « grep »
% ls | grep "^[aA].*t.$" ou % ls | grep "^[aA]" | grep "t.$"
- Sans utiliser la commande « grep »
% ls -d [aA]*t?
c. Afficher toutes les lignes du fichier « fiche » qui commencent avec un chiffre.
Réponse :
% grep "^[0-9]" < fiche
d. Afficher toutes les lignes qui se terminent avec un chiffre suivi de *
Réponse:
% grep "[0-9]\*$" < fiche
e. Afficher toutes les lignes dont le deuxième caractère est un chiffre ou la lettre « m ».
Réponse :
% grep "^.[0-9m]" < fiche
Exercice 3 : (8 pts)
Soit «etudiant» un fichier du répertoire courant. Chaque ligne de ce fichier contient le nom, le
prénom et la filière d’un étudiant séparés par « ; ». Elle a la forme suivante : prénon;nom;filière
1. Ecrire une commande qui affiche le contenu du fichier « etudiant ».
Réponse:
% cat etudiant
ou
% head -n +1 etudiant # afficher à partir de la première ligne du fichier « etudiant »
Solution 1 :
#!/bin/bash
let i=1 # on initialise les numéros des lignes du fichier « etudiant » à 1
let n=`wc -l < etudiant` # n désigne le nombre de lignes du fichier « etudiant »
while test $i -le $n ; do # tant que le numéro de la ligne courante est inférieur à n
# on extrait les champs 1 et 2 (prénom et nom) de la ligne courante, et on les
# sauvegarde dans la variable « ligne »
ligne=`tail -n +$i < etudiant | head -n 1 | cut -f1,2 -d";" `
echo "$ligne;$i" # afficher prénom;nom;i où i est le numéro de la ligne courante.
let i=$i+1
done
Solution 2 :.
#!/bin/bash
let i=1 # on initialise les numéros des lignes du fichier « etudiant » à 1
# on extrait les champs 1 et 2 et on les sauvegarde dans la variable var
var=` cut -f1,2 -d";" etudiant ` # ou var=$(cut -f1,2 -d";" etudiant)
for v in $var ; do
echo "$v;$i" # afficher prénom;nom;i où i est le numéro de la ligne courante.
let i=$i+1
done
b. Ecrire un script shell en utilisant la commande « read » pour parcourir les lignes du fichier.
Réponse 1:
#!/bin/bash
let i=1 # on initialise les numéros des lignes du fichier « etudiant » à 1
while read ligne ; do # on lit le fichier « etudiant » ligne par ligne
lg =`echo $ligne | cut -f1,2 -d";"` # on extrait le prénom et le nom (champs 1 et 2)
echo "$lg;$i" # afficher prénom;nom;i où i est le numéro de la ligne courante.
let i=$i+1
done < etudiant # la lecture ‘effectue à partir du fichier « etudiant »
Réponse 2 :
#!/bin/bash
let i=1 # on initialise les numéros des lignes du fichier « etudiant » à 1
# on extrait le prénom et le nom (champs 1 et 2) du fichier « etudiant » puis on
# parcourt ces champs en utilisant les pipes avec la boucle « while ».
5. L’objectif dans cette question est de construire, à partir du fichier « etudiant » les noms des
logins (« logname ») des utilisateurs et les sauvegarder dans un nouveau fichier nommé
« login ». Chaque nom de login a la forme suivante : « première lettre du prénom.nom ».
Exemple : le nom de login de l’étudiant « mostafa;daoudi;smi » est « m.daoudi ».
1ère Solution :
#!/bin/bash
# si le fichier « login » existe on le supprime
if test -e login ; then
rm login
fi
let i=1
let n=`wc -l < etudiant` # n désigne le nombre de lignes du fichier « etudiant »
cut -c1 < etudiant > tmp # on sauvegarde les premières lettres des prénoms dans le
fichier « tmp »
cut -f2 -d";" < etudiant > log # on sauvegarde les noms dans le fichier « log »
while test $i -le $n ; do
c=`tail -n +$i < tmp | head -n 1` # on sauvegarde la première lettre de la ligne courante
# (ligne i) dans la variable c
lg=`tail -n +$i < log | head -n 1` # on sauvegarde le de la ligne courante (ligne i) dans la
# variable g
echo "$c.$lg" >> login # on forme le logname: c.lg
let i=$i+1
done
2ème Solution:
#!/bin/bash
# si le fichier « login » existe on le supprime
if test -e login ; then
rm login
fi
let i=1
let n=`wc -l < etudiant` # n désigne le nombre de lignes du fichier « etudiant »
cut -c1 < etudiant > tmp # on sauvegarde les premières lettres des prénoms dans le
# fichier « tmp »
cut -f2 -d";" < etudiant > log # on sauvegarde les noms dans le fichier « log »
past tmp log -d”.” > login
3ème Solution :
#!/bin/bash
if test -e compte ; then
rm login
fi
let n=`wc –l etudiant`
let i=1
while test $i –le $n ; do
# on récupère la première lettre du prénom de la ligne courante.
c=`tail -n +$i < etudiant | head -n 1 | cut -c1`
# on récupère le nom (le deuxième champs) de la ligne courante.
lg=`tail -n +$i < etudiant | head -n 1 | cut -f2 -d";"`
# on forme la ligne i du fichier « login ».
echo "$c.$lg" >> login
let i=$i+1 # on incrémente le numéro de la ligne
done