TDTP EC521 Sysexploi ISVD
TDTP EC521 Sysexploi ISVD
TDTP EC521 Sysexploi ISVD
Programmation Shell
L3 PRO Intégration Systèmes Voix Données
Vincent Vigneron
{vincent.vigneron}@ufrst.univ-evry.fr
1 TD 1 2
2 TD 2 5
3 TP 1 8
4 TP 2 11
5 TP 3 14
Un mot sur les comptes-rendus de TP Les comptes-rendus de TP sont pour la 15/10 sur la pla-
teforme E-M EDIA. Je souhaite savoir quelles commandes vous avez tapés pour répondre aux ques-
tions, quel est le résultat de ces commandes (dans la limite des 5 premières lignes,si le résultat est très
long). Si certaines questions vous sont posées dans le texte du TP, n’hésitez pas à écrire vos réponses
personnelles dans le compte-rendu. Au début de ce TP, vous apprendrez quelques manipulations de
base sous Unix que vous pourrez employer pour faciliter la rédaction de vos comptes-rendus.
Les pages qui suivent alternent exercices à réaliser en TD et exercices à réaliser en TP. Attention, ce
n’est pas une thèse. Faites au plus court !
1
Chapitre 1
TD 1
L’objet de ces 2 premiers TD est l’étude des commandes externes du SHELL et de certains méta-
caractères. La connaissance de la syntaxe des principales commandes externes du SHELL est un pré-
requis.
2 Création d’arborescence
Sans bouger du répertoire racine (celui qui est à la base de l’arborescence ; il s’agit ici de ∼), créez
l’arborescence suivante :
2
3 Navigation dans l’arborescence
1. Dans votre répertoire personnel, créer un répertoire test. Créer sous-répertoires pub et bin
du répertoire test.
2. Modifier les droits d’accès de façon que :
(a) le répertoire test et son sous-répertoire pub soient accessibles en lecture et exécution
pour tous, et en écriture pour le propriétaire seul.
(b) le répertoire bin soit accessible en exécution pour tous, et en lecture et écriture pour le
propriétaire et son groupe.
3. Aller dans le répertoire test. Créer un fichier doc.txt. Recopier le fichier dans pub.
4. Aller dans bin. Afficher à l’écran le contenu de test/pub/doc.txt.
5. Afficher la liste des fichiers contenus dans test et ses sous-répertoires.
6. Supprimer du répertoire test et de ses sous-répertoires tous les fichiers se terminant par le
caractère ∼.
7. Afficher à l’écran le contenu des fichiers toto et titi qui se trouvent dans le répertoire d’ac-
cueil de l’utilisateur (fictif) Makeba. Supprimer ces deux fichiers
5 Visualisation de fichiers
Lister tous les fichiers :
1. se terminant par ’5’,
2. commençant par ’annee4’,
3. commençant par ’annee4’ et de 7 lettres maximum,
3
4. commençant par ’annee’ avec aucun chiffre numérique,
5. commençant par ’a’ ou ’A’
6. contenant la chaîne ’ana’,
Écrire une commande qui affiche l’ensemble des processus dont vous n’êtes pas propriétaire (votre
8
nom d’utilisateur se trouvant dans la variable d’environnement $USER).
Donner la syntaxe qui lance la commande sleep en arrière plan (background) pendant une durée de
9
5 minutes.
Créer un sous-répertoire de /tmp ayant pour nom votre nom de login. Positionnez vous dans /tmp.
10
Créer dans le sous-répertoire précédent un fichier qui est la copie conforme de votre fichier .profile
. Ce nouveau fichier doit avoir un nom ayant pour préfixe .profile et pour suffixe votre nom d’uti-
lisateur. Protégez le contenu de ce sous-répertoire contre tout regard indiscret y compris le votre.
11 commande find
1. Ecrire une commande find qui va rechercher à partir de votre répertoire HOME, les fichiers
nommés core ou a.out et les supprimer.
2. Chercher tous les fichiers dont le nom est ’passwd’.
3. Chercher tous les fichiers dont la date de la dernière modification remonte à plus de 10 mi-
nutes.
4. Trouver tous les fichiers du groupe ’root’.
5. Chercher tous les fichiers dont la taille est supérieure à 20Mo.
6. Chercher tous les répertoires se trouvant sous /etc.
7. Chercher tous les fichiers de l’utilisateur ’antoine’
4
Chapitre 2
TD 2
L’objet de ce TD est l’étude des fonctions des scripts sh. On commence par une série simple.
Écrire une procédure de commande params qui affiche le nom du script ($0), le nombre de para-
12
mètres ($#) et la liste des paramètres ($*)
Écrire un script qui fait la même chose que params mais qui affiche la liste des paramètres à raison
13
d’un par ligne, (quel que soit le nombre de paramètres même > 10)
Écrire un script sh qui réalise la somme de tous les arguments acquis à partir de la ligne de com-
14
mande.
Écrire un script qui affiche uniquement les noms des fichiers exécutables dans le répertoire courant.
18
Modifier ce script pour qu’il accepte une option :
19
-x affichage des fichiers exécutables,
-d affichage des répertoires
-r affichage des fichiers lisibles
-w affichage des fichiers modifiables.
Écrire un script qui copie tous les fichiers exécutables du répertoire courant dans un autre répertoire
20
dont le nom est donné en argument.
Écrire une procédure de commande del qui a pour but de remplacer rm, en conservant les fichiers
21
effacés dans un répertoire $HOME/.del. Dans le cas où un fichier de même nom existe déjà dans le
répertoire, on suffixera le nom par =n ou n est le numéro de version.
22 numérique
Écrire un programme numerique qui teste si une valeur passée en paramètre est numérique (c’est
à dire que le code retour de la commande expr "$variable" + 0 est 0).
Exemple :
5
$> numerique 13
ok numerique
$> numerique a34fd
non numerique
$>
Écrire un programme affichen qui prend un paramètre numérique n et génère en sortie la liste des
23
n premiers entiers.
Exemple :
$> affichen 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
$>
Écrire un script permettant de positionner à 640 les autorisations d’accès de tous les fichiers nor-
24
maux du répertoire courant. Si un nom de fichier est donné le traitement ne portera que sur ce fi-
chier.
Modifier le script précédent pour que le premier paramètre soit considéré comme la permission à
25
attribuer. Si le premier paramètre n’est pas un chiffre en base 8, il devra être interprété comme un
nom de fichier et la valeur par défaut 640 lui sera appliqué.
Par exemple :
— ch 644 : Tous les fichiers normaux passent en 644.
— ch : Tous les fichiers normaux passent en 640.
— ch toto titi : Les fichiers toto et titi passent en 640.
Créez un script question. Vous lui donnerez en paramètre le texte d’une question à laquelle corres-
26
pond une réponse de type Oui/Non. Le script doit afficher la question à l’écran et attendre la réponse.
Si la réponse commence par O ou o il renvoie 0, et si elle commence par n ou N il renvoie 1. Dans tous
les autres cas, la question est reposée une nouvelle fois.
Créez un script appelé Supprime. Vous lui confierez des noms de fichiers et pour chaque fichier,
27
il s’agira de vérifier que ce sont des fichiers normaux. Aucun autre type de fichier ne sera accepté.
Pour les fichiers autorisés, la question devra être posée, s’il faut les supprimer ou non. Une réponse
positive entraînera la suppression du fichier.
Réécrire ce script shell précédent en transformant question en une fonction.
28 Numbers. . .
Ecrire un script shell qui lit 2 nombres entrés en arguments par l’utilisateur et qui affiche une
phrase, bien évidemment correcte, du type Le nombre 3 est inférieur au nombre 5 (dans le cas où les
deux nombres entrés sont 3 et 5). Attention, penser à gérer le cas de l’égalité 1 .
29 Espaces
Ecrire un script shell qui renomme, dans le répertoire courant, tous les fichiers comportant des
blancs dans leur nom, en supprimant les blancs dans le nouveau nom. Si le temps le permet, faites
en sorte que si un fichier avec le nouveau nom existe déjà, un numéro soit ajouté au nom pour le
rendre unique.
Indice : Étant donné une chaîne $ f contenant des espaces, echo "$f" | sed ’s/ //g’ permet de
supprimer ces espaces.
1. La commande test XXX -le YYY teste si XXX est plus petit ou égal à YYY. La commande test XXX -eq YYY teste
l’égalité.
6
30 Aspirateurs de site
On se propose d’écrire un petit script d’une ligne pour télécharger des webcomics, en l’occur-
rence xkcd (http://xkcd.com).
Une petite analyse du site permet de voir que la i ème image se trouve sur la page web http://xkcd.com/i.
Par exemple, la page web de la 3 ème image est http://xkcd.com/3.
Écrire une boucle for permettant d’afficher toutes les urls correspondantes aux images de 1 à 15. On
utilisera pour ce faire les commandes seq et echo. On se propose de télécharger la page web et de
l’afficher sur la sortie standard. Pour se faire, on peut utiliser par exemple “wget -O -” (attention, O
majuscule ici) ou “curl -o -”. Il reste alors à extraire la ligne qui nous intéresse à l’aide de la com-
mande grep. Enfin, dernière étape, extraire de cette ligne l’URL. On utilise une fois de plus grep. La
commande extrayant l’URL est donc au final :
wget http://xkcd.com/1 -O - | grep hotlink | grep -o ’http.*jpg’
Il est donc désormais possible d’itérer sur chaque page, d’extraire à chaque fois l’URL de l’image, et
de télécharger l’image à l’aide de wget.
7
Chapitre 3
TP 1
32
— Où que vous soyez, quel est l’effet de la commande cd sans paramètre ?
— Combien y a-t-il de noms de répertoires dans la racine ?
— Donnez un exemple de nom de fichier se trouvant dans votre répertoire personnel (a) par un
chemin relatif (b) par un chemin absolu.
33
1. Changez les droits d’un fichier fic1 pour que tous ceux de votre groupe puissent écrire dedans.
2. Donnez en une seule ligne le droit d’exécution à tous les utilisateurs d’un fichier script qui n’a
jusqu’alors que des droits standards (-rw-r- - r- - ).
3. Le fichier toto a les droits suivants : -rwxr- - r- - . Modifiez-en les droits en une ligne de
commande de sorte que le propriétaire n’ait plus que le droit de lecture.
4. Modifier les droits du fichier toto (-rwxr- - r- - ) de sorte que le groupe et les autres utili-
sateurs aient les mêmes droits que le propriétaire.
5. Quelle option permet de modifier récursivement les droits d’un répertoire et des fichiers qu’il
contient ?
8
6. Quelle option de mkdir permet de créer un répertoire en spécifiant les droits sur ce répertoire ?
7. Affichez et interprétez les droits de /usr/sbin/mount.
34
— Cherchez dans toute l’arborescence les fichiers dont le nom se termine par .c, redirigez les
erreurs vers la “poubelle” /dev/null
a. commençant par X ou x.
b. Dont les noms ne contiennent pas de chiffre.
— Chercher dans /usr les fichiers dont la taille dépasse 1Mo (2000 blocs de 500Ko) et dont les
droits sont fixés à 755 (-rwxr-xr-x).
— Combien il y a de fichiers dans toute l’arborescence vous appartenant et ayant les droits fixés
à 666 (-rw-rw-rw-).
— Trouver tous les fichiers core dans l’arborescence et supprimez les (après confirmation).
35
— Copiez le fichier /etc/passwd dans votre “home directory”. Editez uniquement les champs
contenant le login et le “home directory”.
— Triez passwd sur le nom
— Extraire les nom de login et UID puis triez suivant les UID, le tout en une seule commande ;
vous dirigerez le tout vers un fichier uid_save
— Dans le fichier de résultat précédent remplacer ’:’ par un espace ’ ’.
— Éditez les cinq dernières lignes du fichier.
— Éditez les cinq premiers caractères du fichier.
Créer un répertoire essai-grep dans votre home directory. Dans ce répertoire créer les fichiers sui-
36
vants
37
— Copiez le fichier /etc/passwd dans votre home directory. Editez la ligne commençant par
votre nom de login.
— Dans le fichier passwd qui est dans votre home directory, éditez les lignes commençant par
des noms de login ne contenant pas de chiffre.
— Éditez les lignes du fichier passwd commençant par des noms de login de 3 ou 4 caractères.
38
— Créez un fichier droit dans le répertoire essai_droit. Par défaut ce fichier a les droits 644
(rw-r- - r- - ). En partant du répertoire courant, pour chaque commande de l’exercice
précédent, essayez d’accéder au répertoire essai_droit (commande cd), de faire un ls dans
essai_droit et de modifier le fichier avec un éditeur quelconque (vi ou emacs par exemple).
9
— Tapez la commande umask, de manière à ce que les fichiers lors de leur création aient par
défaut les droits 640 (rw-r- - - - -), et les répertoires 750 (rwxr-x- - -).
39
1. Afficher le nombre de sessions ouvertes (c-à-d connexions) sur la machine tout en générant le
détail de ses connexions dans le fichier connectes.
2. Afficher les L lignes qui entourent la ligne numéro N d’un fichier F. Utiliser cette méthode pour
afficher une partie du texte qui entoure la ligne où se trouve une chaîne S qu’on cherche dans
un fichier F (utiliser la commande grep).
3. Copier sur une clé USB tous les fichiers .sql modifiés ce jour.
40
— Écrire une commande utilisant at pour exécuter le script traitement à 16h15 le 24 janvier
2020, sachant que nous sommes en septembre 2018.
— Exécuter le script traitement se trouvant dans bin de votre répertoire de connexion :
— Le Vendredi à 17h00
— La semaine prochaine au même moment
— Deux jours plus tard
41
On récupère le dictionnaire de la langue française qui se trouve sur la page E - MEDIA dans le fichier
suivant td01-dict.txt.
1. compter le nombre de lignes, le trier alphabétiquement et supprimer les 13 premières lignes.
2. Combien de fois le mot anti y apparait-il ? et le mot pro ?
3. Affichez le contenu du dictionnaire entre les lignes 200 et 215.
4. Créez un fichier contenant tous les mots de plus de 26 caractères.
10
Chapitre 4
TP 2
aaaa bbbb cccc dddd eeee ffff gg | AAAA BBBB CCCC DDDD EEEE FFFxF GG
gg hhhh iiii jjjj kkkk llll mmmm | GG HHHH IIII JJJJ KKKK LLLL MMMM
nnnn oooo pppp qqqq rrrr ssss tt | NNNN OOOO PPPP QQQQ RRRR SSSS TT
tt uuuu vvvv wwww xxxx yyyy zzzz | TT UUUU VVVV WWWW XXXX YYYY ZZZZ
A l’aide des commandes who, cut, uniq et wc, construire une commande permettant de compter
43
le nombre d’utilisateur connectés au système.(N’oubliez pas que man est votre ami !)
44 Manipulation de fichiers
Afficher les trois informations suivantes (provenant de /etc/passwd) : nom de connexion de
l’utilisateur, nom complet (champ libre) et shell attribué à l’utilisateur. Si /etc/passwd avait ce
contenu :
11
45 Comptes clients
Soit compte le fichier des comptes clients d’une entreprise. On suppose qu’il a la structure sui-
vante : 5 chiffres pour le code banque, 5 chiffres pour le code guichet, 10 chiffres pour le numéro
de compte, 1 lettre pour compléter le numéro de compte, 2 chiffres pour la clé RIB, 30 caractères
pour la désignation du client. Produire en sortie les informations suivantes (séparées par la barre
verticale) : Désignation du client, son numéro à 10 chiffres et la lettre complétant ce numéro. Soit
gestion le fichier des gestionnaires des comptes. Il se compose de lignes ayants les champs (séparés
par la barre verticale) suivants : Désignation du gestionnaire, lettre du numéro de compte des clients
dont il est responsable. Produire en sortie un listing avec les informations suivantes : Désignation du
gestionnaire, le client dont il est responsable, le numéro de son compte.
Construire un fichier NTD (nom, téléphone, département) où chaque ligne est un nom suivi du nu-
méro de téléphone puis du numéro de département. Comment faire pour avoir tous les noms dans
le fichier NTD ? Comment obtenir un fichier DNT où chaque ligne est composée (dans cet ordre) du
numéro de département, du nom et du numéro de téléphone ? Soit numéros le fichier des numéros
de téléphones :
024867-0256
024867-1234
024867-5555
024867-7358
Sélectionner à partir du fichier tele les lignes où figurent les numéros du fichier ci-dessus.
Créer un script shell nommé change qui affichera la date de dernière modification d’un fichier puis
47
la modifiera avec l’heure actuelle et enfin ré-affichera la date de dernière modification du fichier.
Cette procédure acceptera 1 paramètre qui sera le nom du fichier.
Lorsque vous exécuterez change mon_fic, le 8 octobre à 15 heures 12 vous obtiendrez le résultat :
12
Créer un script shell réalisant la création d’un répertoire Blabla contenant 10 fichiers nommés Un à
48
Dix. Chaque fichier contient une seule ligne :
Créer un script permettant d’afficher la liste des fichiers du répertoire /etc accessibles en lecture et
50
un autre pour les fichiers du répertoire /etc uniquement accessibles en écriture.
Créer un script nommé table permettant d’afficher des tables de multiplication. table 5 10 aura
51
pour résultat l’affichage :
0 x 5 = 0
1 x 5 = 5
2 x 5 = 10
3 x 5 = 15
4 x 5 = 20
5 x 5 = 25
13
Chapitre 5
TP 3
Sachant que la commande echo $PATH affiche les chemins de recherche des fichiers, sachant que
52
sed ’s/:/ /g’ permet de remplacer “:” par espace dans l’entrée standard, écrivez un script tree2
qui affiche tous les fichiers accessibles par votre chemin.
Écrire une procédure de commande permettant de purger du répertoire $HOME/.del des fichiers qui
53
n’ont pas été modifiés depuis plus de 5 jours.
A l’aide des commandes cut et grep, construire une commande permettant d’afficher la liste des
54
utilisateurs du système (stockés dans /etc/passwd) dont le login commence par 2008 et leur nom.
Les lignes résultantes doivent ressembler à ceci :
20080002:fairbanks bill
20080006:trevelyan alex
20080007:bond james
Écrire un script qui, à partir d’un fichier généré par la commande ls, copie les fichiers mentionnés
55
dans le fichier ls vers un répertoire spécifié en argument.
\$ copyall
Nom du fichier ls : list1
Répertoire destination : /usr/mime/pasdoue
Copie terminé !
\$
Sachant que sleep n est une commande Unix qui attend n secondes puis qui renvoie vrai, écrire
56
une procédure de commande qui attend la connexion de quelqu’un. Par exemple
Dans le fichier /etc/passwd, se trouvent tous les utilisateurs connectés au système. Pour chaque
58
utilisateur, une série d’information est stockée dans une ligne. Cette ligne est constituée de champs
séparée par : .nom:mot-de-passe:UID:GID:Infos:repertoire:shell
Créez un script permettant d’afficher pour un utilisateur son numéro (UID) et le numéro de son
groupe ( GID).
14
Ecrire un script sans paramètre qui affiche l’UID et le GID de tous les utilisateurs du système.
59
Ecrire une procédure qui affiche à l’écran le nombre de fichiers accessibles en lecture, puis ceux
60
accessibles en écriture et enfin ceux exécutables dans le répertoire transmis en paramètre.
Créez un script permettant de renommer tous les fichiers du répertoire courant dont l’extension est
62
donnée en premier paramètre en remplaçant cette extension par celle donnée en deuxième para-
mètre.
Ecrire un script qui donne la liste des utilisateur s ne possédant pas de mot de passe.
65
Ecrire un script qui affiche les utilisateurs ainsi que leur mot de passe (cryptés) séparés par un ; avec
66
une ligne blanche entre chaque utilisateur
Écrire un script qui compte les occurrences de chaque mot dans un fichier texte.
67
Écrire un script qui compte le nombre de lignes non vides dans un fichier.
68
Écrire un script qui calcule la taille moyenne des fichiers du répertoire courant.
69
Ecrire un script qui écrit les 10 premiers éléments de la suite de Fibonacci.
70
Écrire un script de gestion de documentation par pointeur.
71
Définition : Renvoyer un texte définissant le mot passé en argument. La liste des mots définis et les
numéros de lignes de début et de fin de définition des mots sont contenus dans le fichier texte.ptr.
Les définitions sont dans le fichier texte.txt.
Écrire un script permettant de ranger des fichiers dans des répertoires selon leur extensions. tester
72
son fonctionnement. Par exemple le fichier.jpg sera ranger dans le répertoire jpg.
15
Chapitre 6
Choisissez un µ-projet parmi ceux présentés ci-dessous. Tous les scripts shell, dont on donne ici
la description sont des outils d’administration Unix que vous pourriez être amené a développer plus
tard. Ce sont des outils utiles pour les développement et la mise au point d’applications informa-
tiques et pour l’administration UNIX.
— Programme de recherche d’une chaîne et des lignes qui l’entourent dans un groupe de fi-
chiers : recherche d’une chaîne dans tous les fichiers précisés en paramètre en affichant la
ligne contenant la chaîne ainsi que la ligne située avant et la ligne situe après (ces groupes de
3 lignes étant séparées par une ligne comportant des points).
— Programme liste tous les sous-répertoires et les fichiers associées d’un répertoire de façon
“indentée”
— Programme recherchant une chaîne de caractère dans une arborescence de répertoire :
cherche une chaîne donnée dans les fichiers situes sous un répertoire donné y compris ceux
de répertoires situés sous ce premier répertoire.
— script pour se connecter successivement à une liste de machines : script pour se connecter
a toutes les machines UniX suivantes :
liste=”
bali
barbade
cervin
sumatra
“
— recherche d’une chaîne de caractères dans tous les fichiers ASCII, situés dans une arbores-
cence :
Exemple / Ex. : findtext /etc 255.255.255.0
— purge des fichiers anciens et temporaires ou temporaires trop gros par exemple core, log
— surveillance de la saturation des disques : test si capa des disques est pleine
— script calculant le top 5 des applications/processus les plus consommatrices de cpu du sys-
tème
— script permettant de ranger des fichiers dans des répertoires selon leur extensions tester
son fonctionnement. Par exemple le fichier .jpg sera ranger dans le répertoire jpg.
En utilisant, entre autres, la commande cut, modifier le script initial de manière à lui faire
traiter toutes les extensions de fichier existantes dans le répertoire courant.
— Annuaire constitué d’enregistrements contenant un nom et un téléphone. Ecrire les scripts
sh qui réalisent les fonctions suivantes :
16
— une fonction recherche qui recherche un nom passé en paramètre dans le fichier annuaire
et qui affiche si le nom est trouvé ou pas.
— une fonction ajoute qui ajoute un nom passé en paramètre dans le fichier annuaire.
— une fonction supprime qui supprime un nom passé en paramètre dans le fichier annuaire.
— une fonction affiche qui réalise l’affichage de l’annuaire
Écrire ensuite une fonction qui créer un menu pour gérer un annuaire qui appellera les fonc-
tions recherche, ajoute, supprime et affiche déterminées précédemment.
— “Hacker . . .” Quelle est la fonction du script suivant ? (tester le)
#!/bin/bash
nmap -sT 74.125.225.0/24 -p 5505 -oG essai
cat aloha | grep open > essai_open
cat essai_open | cut -f2 -d ":" | cut -f1 -d "(" > essai_vuln
17