#!/bin/bash #--- Creation d'arborescence : la commande mkdir # #1 - A l'aide des commande mkdir, creer un répertoire nommé "TP1_commandes_shell": reponse="mkdir TP1_commandes_shell" #eval $reponse # #2 - A l'aide de la commande mkdir et cd, creer dans le répertoire "TP1_commandes_shell" la hierarchie de repertoire suivante : # . # "-- a # |-- b # | |-- f # | "-- g # | "-- h # "-- c # |-- d # "-- e # # 8 directories, 0 files reponse="cd TP1_commandes_shell; mkdir a; cd a; mkdir b; mkdir c; cd b; mkdir f; mkdir g; cd g; mkdir h; cd ..; cd ..; cd c; mkdir d; mkdir e;" echo $reponse #eval $reponse # #3 - Trouver comment minimiser le nombre d'appel à mkdir et à cd pour créer cette hiérarchie (cf man mkdir) ? reponse="mkdir -p TP1_commandes_shell/a/b/g/h TP1_commandes_shell/a/b/f TP1_commandes_shell/a/c/e TP1_commandes_shell/a/c/d" echo $reponse eval $reponse # #--- Navigation de base dans le systeme de fichier, chemin d'acces --- # #4 - Dans le repertoire de chemin d'accès "a/c/d" creer un fichier vide appele "OK" avec la commande touch ? reponse="touch TP1_commandes_shell/a/OK TP1_commandes_shell/a/c/OK TP1_commandes_shell/a/c/d/OK" eval $reponse #5 - De meme, dans les répertoires de chemin d'accès a/b/g/h, creer un fichier OK par sous repertoire. reponse="touch TP1_commandes_shell/a/OK TP1_commandes_shell/a/b/OK TP1_commandes_shell/a/b/g/OK TP1_commandes_shell/a/b/g/h/OK" eval $reponse #6 - De meme, dans le repertoire situe deux repertoires au dessus du repertoire "a/b/g/h" reponse="touch TP1_commandes_shell/a/b/g/../../OK" eval $reponse # #7 - Deplacer le fichier "a/c/d/OK" vers le repertoire "a/b/f." avec la commande mv ? reponse="mv TP1_commandes_shell/a/c/d/OK TP1_commandes_shell/a/b/f" eval $reponse #8 - Faire ensuite une copie de ce meme fichier dans le même repertoire en lui ajoutant comme suffixe ".copy" avec la commande cp. reponse="cp TP1_commandes_shell/a/b/f/OK TP1_commandes_shell/a/b/f/OK.copy" eval $reponse #9 - Toujours dans le même repertoire, creer un lien symbolique appele "sauvegarde" vers la copie du fichier (cf commande ln). reponse="ln -s TP1_commandes_shell/a/b/f/OK.copy TP1_commandes_shell/a/b/f/sauvegarde" eval $reponse # #--- Droits d'acces et attributs de fichiers --- # #10 - Creer un fichier "texte.txt" dans le repertoire au dessus de "a" et le remplir avec un texte à l'aide votre éditeur préféré reponse="echo echo est mon editeur préféré > TP1_commandes_shell/texte.txt" eval $reponse #11 - Avec ls, déterminer quelle est la taille de ce fichier en octet ? reponse="ls -l TP1_commandes_shell/texte.txt" eval $reponse #12 - Déterminer l'identifiant du propriétaire de ce fichier à l'aide de la commande "ls". #13 - Quelle est la representation sous forme de chaine de caractere des droits de groupe du fichier que "texte.txt" ? # #14 - Quelle est sa représention octale de ces droits de groupes ? les trois chiffres dans l'ordre represente alors les droits # d'un type d'utilisateur (respectivement proprietaire, groupe et autres). Chaque chiffre est la representation binaire des trois types # de droit d'acces, si le bit est a 1, alors le droit est autorise, par exemple, la representation octale 777 correspond au chiffre # binaire 111 111 111, qui signifie sur tous les droits d'acces sont possibles : rwxrwxrwx. # #15 - à l'aide de la commande "du" déterminer la taille apparente et réelle en octets du répertoire "TP1_commandes_shell" ? reponse="du -s -b --apparent-size TP1_commandes_shell/" eval $reponse # #16 - Déterminer la taille apparente et réelle de votre répertoire utilisateur reponse="du -s ~" #-- Attributs de processus (PID et PPID), limites systeme -- # #17 - Executer une attente dans le shell à l'aide de la commande "sleep". Quel est le PID de cette commande ? Quel est le PPID de cette commande ? reponse="sleep 10& PID=$(echo $!);echo PID=$PID; echo PPID=$(cat /proc/$PID/stat | cut -d" " -f 4)" #18 - Déterminer la limite du nombre maximum de processus que vous pouvez creer, (voir commande ulimit). reponse="ulimit -u" #19 - Déterminer la limite du nombre maximum de fichier qu'un processus utilisateur peut ouvrir, (voir commande ulimit). reponse="ulimit -n" #20 - Le shell conserve la valeur de son PID dans la variable d'environnement $$. Pour l'afficher, la commande 'echo $$' suffit. De meme, la valeur de PID # du processus parent du shell est stockee dans la variable d'environnement $PPID. afficher la valeur de $$ puis lancer la commande bash et afficher la # valeur de $PPID. Que pouvez-vous en deduire par rapport a la relation qu'il y a entre les commandes executees dans le shell et le shell lui-meme ? reponse="les commandes executées par les shell sont des processus fils du shell" # #--- Redirections et pipes --- # #21 - Rediriger la sortie standard de la commande 'ls -l' du répertoire "TP1_commandes_shell" dans le fichier a/c/e/redirectlsl.txt ? afficher ce fichier avec "cat" ? reponse="ls -l TP1_commandes_shell > TP1_commandes_shell/a/c/e/redirectlsl.txt; cat TP1_commandes_shell/a/c/e/redirectlsl.txt" #22 - Rediriger la sortie standard de la page manuel de printf dans la section des fonctions de librairie C dans le fichier a/c/e/manprintf.txt ? reponse="man 3 printf > TP1_commandes_shell/a/c/e/manprintf.txt" #23 - Utilisant wc, déterminer quel est le nombre de ligne ou apparait le mot "man" dans la page manuel de la commande man ? reponse="grep man TP1_commandes_shell/a/c/e/manprintf.txt | wc -l" #24 - Les commandes "cat fichier | wc", "wc fichier" , et "wc < fichier" sont-elles equivalentes ? Expliquer votre reponse reponse="Oui, pour wc, le fichier est toujours entré depuis l'entrée standard" # #-- Info systeme --- # #25 - Déterminer la memoire disponible sur le systeme en Kb. (voir commande free ou cat /proc/meminfo). #26 - le champs btime du fichier /proc/stat indique la date de demarrage du systeme au format du nombre de secondes entre le 1/1/1970 et cette date. Le # programme "date" permet de convertir ces secondes dans un format lisible par un etre humain. Utiliser ce programme pour savoir a quelle date le systeme # a demarre ? Verifier votre reponse avec la commande "uptime" reponse="sec=$(cat /proc/stat | grep btime | cut -d ' ' -f 2); date --date=@$sec" eval $reponse # #--- Trouver un fichier : les variantes de la commande find. ---- # #27 - A l'aide de la commande find et sort, afficher la liste dans l'ordre alphabetique inverse de tous les fichiers de type "d" du repertoire "TP1_commandes_shell" reponse="find TP1_commandes_shell/ -type d | sort" # #28 - A l'aide de la commande find, afficher tous les fichies de type "c" du repertoire /dev dans lequel tout le monde a le droit de lire et d'ecrire. reponse="find /dev/ -type c -perm -a+r -perm -a+w" # #-- Misc -- # #29 - Quelles options activent la lecture de l'entree standard en langage C plutot qu'un fichier pour le compilateur gcc ? Utiliser ces options pour lire # un programme C envoye a gcc avec la commande echo pour compiler une suite d'instruction C sans editeur en une seule ligne shell. # Démontrer que votre syntaxe est fonctionnelle avec un simple programme C qui affiche "Hello world". echo 'void main(){printf("Hello world");}' | gcc -x c - # # #30 - Le programme printf permet de formatter des chaines de caractere de la meme maniere que la fonction printf de la librairie C. A l'aide # de ce programme, afficher la valeur de 776 en hexademical sur votre terminal. De même afficher la en decimal du nombre hexadécimal 0x308. printf "%x" 776;printf "%d" 0x308 # #31 - Nous avons vu que les processus unix sont en fait des programmes lu depuis un systeme de fichier pour etre ensuite executes en memoire. # Sous unix, le format binaire de ces programmes doit etre codifie, sans quoi le systeme d'exploitation ne pourra pas # d'executer ces programmes. L'un de ces formats binaires est ELF (Executable and Linkable Format), utilise sous Linux ainsi que sous de nombreux # systemes UNIX. Tous les fichiers au format ELF commencent par une entete decrite dans la page man de elf. En particulier, les 16 premiers octets # du fichier (voir le champ e_ident de l'entete) donnent des informations importantes sur le binaire : a) 32 bits ou 64 bits, b) format des donnees et c) la # version de ELF. # # A l'aide de la page wikipedia http://fr.wikipedia.org/wiki/Executable_and_Linkable_Format, du programme head et du programme hexdump associe # aux bonnes options, reformater les 16 premiers octets du programme "cat" au format hexadecimal imprimable et les rediriger dans un fichier. # Rajouter dans ce fichier, la signification de chaque octets/bits d'apres la documentation sur l'entete. Verifier que votre reponse avec le programme readelf. head -c 16 /bin/cat | hexdump -C > entete_cat.txt # #32 - Unix permet de gerer plusieurs type de systeme de fichiers dans une arborescence unique (ext4, ext2, cifs, nfs, procfs, sysfs, etc). Utiliser la commande mount # pour determiner le type de systeme de fichier qui est utilise a la racine ainsi que dans votre repertoire de travail utilisateur ? # reponse=mount