L3 Info UFR Sciences&Techniques I5TC1
Exercices Fichiers + programmation shell et awk
1 Les droits
Exercice 1-Modification des droits
Soit les droits courants rwx r-x r-x, ´ecrire les passages - sous deux formes- vers les droits suivants :
i) rw- r-- r-- ii) rw- --- --- iii) r-x r-x r-x iv) rwx --- --- Exercice 2-
Quelles commandes, parmi les propositions suivantes, nous garantissent qu’un autre utilisa-
teur que son propri´etaire (et root) ne puisse pas supprimer le fichier/home/enseignant/otogni/hello.c?
Soit un utilisateur n’´etant ni root ni le propri´etaire du fichier hello.c ni du r´epertoire otogni. Parmi les propositions suivantes, quelles commandes interdisent d’effacer le fichier /home/enseignant/otogni/hello.c `a au moins `a cet utilisateur ?
1. chmod a-x /home/enseignant/otogni
2. chmod go-w /home/enseignant/otogni/hello.c 3. chmod go-w /home/enseignant/otogni
4. chmod a-rwx /home/enseignant/otogni/hello.c
Exercice 3-Copie de fichier
Soit un r´epertoire licence (dont le groupe licence est propri´etaire) et deux r´epertoires util- isateurstotoettutu. Il y a dans le r´epertoire toto un fichiersource (dont toto est propri´etaire).
i) On suppose que toto et tutu sont tous deux du groupe licence. Quels droits faut-il avoir au minimum sur les r´epertoires licence,toto et tutu pour que:
- tutu puisse recopier dans son r´epertoire le fichier source - toto puisse recopier chez tutu son fichier source
ii) On suppose que sur tous ces points de l’arborescence les droits sont rwx pour le pro- pri´etaire. Pr´eciser, dans les deux cas ci-dessus la suite des instructions `a utiliser.
iii) Idem en supposant que toto est du groupe licence mais que tutu est du groupe maitrise.
Exercice 4-Suppression
Etant donn´ee l’arborescence ci-dessus, en supposant que tata est du groupe maitrise et que tutu et toto sont du groupe licence, les affirmations suivantes sont-elles vraies ?
i) toto peut vider f2, toto peut effacer f2 ii) toto peut vider f4, toto peut effacer f4 iii) tata peut vider f2, tata peut effacer f2 iv) tata peut vider f1, tata peut effacer f1 v) root peut vider f2, root peut effacer f2 vi) root peut vider f5, root peut effacer f5 Exercice 5-Droits standards
i) Pourquoi cette diff´erence entre les droits standards des fichiers et ceux des r´epertoires ? ii) Avec quel param`etre faut-il utiliser la commande umask pour cr´eer des fichiers avec les droits rw---puis des fichiers ex´ecutables avec rwxr--r--?
2 Substitutions
Exercice 6-Exemples de substitution sur les variables (list´ees par la commande set) dont voici un extrait ci-dessous:
dk=/dos/floppy HOME=/root IFS=
LOGNAME=root
MAIL=/var/spool/mail/root
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:.
TERM=xterm
Expliquer le comportement de chacune des lignes de commandes suivantes:
echo $HOME est votre point de login echo Voir le fichier $HOME/essai echo mettre une disquette dans $dk0 echo mettre une disquette dans ${dk}0
Exercice 7-Exemples de substitution avec valeur par d´efaut sur les variables connues.
Expliquer le comportement de chacune des lignes de commandes suivantes:
echo $racine est votre point de login echo Voir le fichier ${racine-essai}
echo Rappel de votre point de login $racine echo Voir le fichier ${racine=glue}
echo Rappel de votre point de login $racine
Exercice 8-Quotation: expliquer le comportement de chacune des lignes de commandes suiv- antes:
A=’echo *’
echo ’$A’
echo "$A"
echo $A
$A
3 Le shell
Exercice 9-R´epertoire courant
Ecrire, sans utiliser de structure de contrˆole, les commandes suivantes:
i) nf: affichage du nombre de fichiers du r´epertoire courant,
ii) ra: affiche oui si le r´epertoire courant est le r´epertoire d’accueil, nonsinon;
iii) prc : affiche la profondeur du r´epertoire courant;
iv) ouest: ouest <nom> affiche <nom> est dans <rep> o`u <rep> est le r´epertoire d’accueil de<nom>,si nom est un utilisateur d´efini et<nom> n’existe passinon.
Exercice 10-Bilan sur un fichier
Ecrire un programme shell qui lit un nom de fichier et affiche les renseignements le concer- nant sous la forme :
nom du fichier : blabla num´ero de i-noeud : blabla nom du propri´etaire : blabla nom du groupe : blabla taille : blabla
nombre de liens : blabla Exercice 11-Acc`es `a un fichier
Ecrire un programme shell qui - lit un nom de fichier
- teste si ce fichier est accessible (dans le r´epertoire courant ou via le PATH)
- teste si le propri´etaire de ce fichier est pr´esent sur la machine (et sinon lui envoie un message)
Exercice 12-En-tˆete programmes C
Ecrire le script ifdef tel que l’ex´ecution de ifdef <nom>.h place en tˆete de <nom>.h les lignes
#ifndef <NOM>_H
#define <NOM>_H et la ligne
#endif /* <NOM>_H */
`a la fin.
Exercice 13-Formatage de fichier
Ecrire un programme shell qui formate un fichier pour envoi sur une imprimante.
i) Le programme lit un nom de fichier et une taille de page (en nombre de lignes) puis g´en`ere une version format´ee du fichier de telle sorte que :
- le fichier soit d´ecoup´e en pages de la taille indiqu´ee
- chaque page comprenne un en-tˆete qui indique la date, le nom, la taille du fichier et son type ainsi que le nom de l’utilisateur (en fait le nom du compte) en majuscules.
ii) Mˆeme chose en ajoutant dans l’en-tˆete de chaque page le num´ero de page.
Exercice 14-Duplication de fichier
Ecrire un script qui copie un fichier en v´erifiant que le fichier destination n’existe pas d´ej`a.
Un des param`etres pass´es `a cette commande indique si on peut ou non ´ecraser les fichiers existants (sinon la copie n’est pas faite).
Exercice 15-Bilan d’un r´epertoire
Ecrire un script qui affiche, selon la demande, certaines entr´ees du r´epertoire courant `a savoir :
- les ex´ecutables - les r´epertoires - les fichiers lisibles - les fichiers modifiables
Le plus simple est de passer en param`etre `a ce script l’option correspondante de la commande test ou ls, auquel cas il faudra v´erifier que l’option pass´ee en param`etre est correcte.
Exercice 16-ifdef am´elior´e
Modifier le script ifdef de fa¸con `a ce qu’il
• ne modifie pas le fichier s’il commence d´ej`a par une ligne#ifndef <NOM>_H,
• accepte l’option-C: ajout du commentaire /* Fichier <nom>.h */
• rajoute automatiquement le suffixe .h s’il n’est pas pr´esent dans<nom>.
Exercice 17-Lecture ligne `a ligne d’un fichier de donn´ees
On dispose d’un fichier contenant une liste de noms de fichiers `a traiter lors d’une commande.
i) On demande `a l’utilisateur un nom de r´epertoire (si ce r´epertoire n’existe pas, on le cr´e´e).
Pour chacun des fichiers `a traiter, on recopie dans le r´epertoire le fichier (sauf s’il existe d´ej`a dans le r´epertoire).
Exercice 18-Nettoyage d’arborescence
Ecrire un script qui re¸coit en param`etre un nom de r´epertoire et efface du sous-arbre corre- spondant tous les fichiers core et .o (en listant dans un fichier les noms des fichiers supprim´es).
Exercice 19-Affichage des droits
Ecrire un script qui re¸coit en param`etre un nom de fichier (ordinaire, sp´ecial ou r´epertoire) et affiche explicitement les droits d’acc`es `a ce fichier. Par exemple pour rwsr-x–t on affichera :
Propri´etaire : lecture ´ecriture ex´ecution Groupe : lecture ex´ecution
Autres :
Droits sp´eciaux positionn´es : uid sticky Exercice 20-Historique
Ecrire un script permettant d’ajouter au shell un m´ecanisme d’historique, le nom du fichier
`a utiliser pour garder l’historique sera pass´e en param`etre. On devra reconnaitre les commandes suivantes :
! ex´ecute la derni`ere commande
!n ex´ecute la commande num´ero n
!% liste le fichier historique courant
!d d´etruit le fichier historique courant
!s nom sauvegarde le fichier historique dans un fichiernom
!q fin du processus
Toute autre ligne de commande sera pass´ee au shell et archiv´ee.
4 Le langage AWK
Exercice 21-Que produisent les scripts awk suivants?
i) {print $2 , $1}
ii) $1 != p {print ; p = $1 }
Exercice 22-Ecrire les scripts awk permettant d’afficher
i) les deux premiers champs en ordre invers´e avec des champs s´epar´es par des virgules et/ou des espaces et tabulations
ii) la somme et la moyenne du premier champ iii) toutes les lignes entre ”start” et ”stop”
Exercice 23-Ecrire les scripts awk suivants:
i) afficher toutes les lignes plus longues que 72 caract`eres ii) afficher tous les champs de chaque ligne en ordre inverse
iii) tester si tous les enregistrements d’un fichier ont le mˆeme nombre d’´el´ements
iv) inserer des num´eros de page dans un fichier, sachant que le fichier d’entr´ee contient d´ej`a une ligne commen¸cant par ”Page” `a chaque endroit ou le num´ero de page doit ˆetre ins´er´e
v) afficher le nombre d’occurences de chacun des mots d’un fichier texte vi) idem, en triant les mots par ordre d´ecroissant
Exercice 24- Je garde la trace de mes d´epenses et de mes rentr´ees d’argent dans le fichier textecomptes.txt, chaque ligne ayant la forme suivante: date d´epense rentr´ee motif(l’un des deux champs d´epense ou rentr´ee vaut toujours 0). Par exemple,
$ cat compte.txt
21/10/02 53 0 chaussures 05/12/02 0 35000 salaire 10/12/02 75 0 courses
Ecrire les scripts awk suivants:
i) v´erification que l’un des deux champs d´epense ou rentr´ee vaut 0 pour chaque ligne.
ii) affichage du total des d´epenses, des rentr´ees et des p´eriodes durant lesquelles le compte
`a ´et´e `a d´ecouvert.
iii) affichage du nombre de jours min, max et moyen entre deux d´epenses.
Annexe: Syntaxe de awk
Variables pr´ ed´ efinies:
• FS S´eparateur de champs
• RS S´eparateur de d’enregistrement
• NF Le nombre de champs dans l’enregistrement courant
• FNR Le nombre d’enregistrements lus dans le fichier de donn´ees courant, en comptant l’enregistrement courant
• NR Le nombre total d’enregistrements lus dans tous les fichiers de donn´ees
• FILENAMELe nom du fichier de donn´ees courant
Instructions de contrˆ ole:
if (expr) instr1 [;else instr2]
while (expr) instr do instr while (expr)
for (expr1; expr2; expr3) instr for (var in tableau) instr
Fonctions pr´ ed´ efinies sur les chaˆınes:
• index(s,t)retourne la position dans la chaˆıne s o`u la chaˆıne t apparrait pour la premi`ere fois
• match(s,er) retourne la position dans la chaˆıne s o`u l’expression r´eguli`ere er apparrait pour la premi`ere fois
• length(s) calcule le nombre de caract`eres de s
• split(s,a,fs)divise la chaˆıne s en utilisant le s´eparateur fs et range les ´el´ements obtenus dans le tableau a (dans a[1], a[2], etc)
• substr(s,p[,n]) sin n’est pas sp´ecifi´e, retourne la sous-chaˆıne de s commen¸cant par le
p-i`eme caract`ere; sinon retourne la sous-chaˆıne de s commen¸cant par le p-i`eme caract`ere
et contenantn caract`eres.
• sub(r,s[,t]) substitue la chaˆıne s `a la premi`ere occurence de l’expression r´eguli`ere r dans t. La valeur retourn´ee par sub est le nombre de substitutions qui ont ´et´e faites.
• gsub(r,s[,t])comme sub, sauf que la substitution est faite globalement (i-e. pour toute occurence de r dans t). La valeur retourn´ee par sub est le nombre de substitutions qui ont ´et´e faites.
• tolower(s) passage en minuscules,toupper(s) passage en majuscules.
Autres fonctions pr´ ed´ efinies:
• print produit un affichage, par d´efaut sur la sortie standard, mais on peut utiliser les redirections.
• printf s’utilise de la mˆeme fa¸con qu’en C.
• system(cmd) ex´ecute la commande UNIX cmd dans un sous-shell.
• getline [var] lit le prochain enregistrement sur l’entr´ee standard dans la variable var (dans $0 si pas de param`etre).
R´ esultats d’ex´ ecutions de quelques commandes usuelles
togni@ufrsciencestech:~$ ls -il total 7092
17170526 drwxr-xr-x 2 togni etudiant 4096 Feb 20 2004 C
18169933 drwxr-xr-x 2 togni etudiant 4096 Oct 18 2004 Desktop 16547920 drwxr-xr-x 2 togni etudiant 4096 Nov 28 2005 Documents
5750911 -rwxrwxrwx 1 togni etudiant 13282 May 6 2004 IPScan 5750909 -rw-rw-rw- 1 togni etudiant 12575 May 6 2004 IPScan.c 5750910 -rw-rw-rw- 1 togni etudiant 12600 May 6 2004 IPScan.o 5750894 -rw-r--r-- 1 togni etudiant 1441 May 7 2004 Paquet 5750945 -rwxr-xr-x 1 togni etudiant 152 Jan 3 2005 Ping 5750946 -rwxr-xr-x 1 togni etudiant 157 Jan 3 2005 Ping~
5750942 -rwxr-xr-x 1 togni etudiant 6768 Jan 3 2005 Pong 5750943 -rwxr-xr-x 1 togni etudiant 6848 Jan 10 2005 Pong.bin 5750944 -rw-r--r-- 1 togni etudiant 470 Jan 10 2005 Pong.c .
. .
5750913 -rw-r--r-- 1 togni etudiant 130524 May 14 2004 spider091503.pdf 5750914 -rw-r--r-- 1 togni etudiant 1144422 Oct 25 2004 these.ps
5750938 -rw-r--r-- 1 togni etudiant 3999 Oct 10 2006 titi 5750961 -rw-r--r-- 1 togni etudiant 33 Oct 24 2006 toto
5750925 -rw-r--r-- 1 togni etudiant 1924 Nov 4 2004 udpServer.c togni@ufrsciencestech:~$ ypcat passwd |more
dg203361:x:53106:50001:David GRENOT:/home1/dg203361:/bin/bash vd142681:x:53022:50001:Virginie DANTEN:/home1/vd142681:/bin/bash xf213358:x:53068:50001:Xavier FEILLES:/home1/xf213358:/bin/bash mn142958:x:51623:50001:Maud NAULIER:/home1/mn142958:/bin/bash .
. .
vl353673:x:51502:50001:Virginie LAMBERT:/home1/vl353673:/bin/bash cb135021:x:51167:50001:Charlene BISSON:/home1/cb135021:/bin/bash dm151826:x:52681:50001:Damien MOREL:/home1/dm151826:/bin/bash
mb111666:x:51144:50001:Marie-Cecile BELOEIL:/home1/mb111666:/bin/bash lt346787:x:51774:50001:Lucie TEILLAUD:/home1/lt346787:/bin/bash
gb138986:x:51985:50001:Gaetan BOUGNOUX:/home1/gb138986:/bin/bash togni@ufrsciencestech:~$ ypcat group
ssib:x:1001:
GL1STC06:x:50048:sa841552,ca614422,ba129963,ya745425,wa466497,aa695748,ta826047,aa592095,da117013,bb318819,bb683817,rb169399,ab105418,mb809760,mb188953,sb818431,nb446255,cb508622,bb122391,mb116114,cb182581,fb152733,ab202762,ab134345,ab358096,rb169069,jb267210,fb175026,jb246228,mb270606,hb253427,jb668909,mb175536,mb310936,fb108996,tb885388,jb439493,ab877006,mb186981,vb128289,mb184667,lb173093,eb192954,cb174569,bb144703,jc273700,gc337453,bc297856,bc184228,mc107768,jc156635,mc109795,ac639138,pc170714,cc882836,rc235202,lc113578,fc163650,oc542431,mc787551,mc937370,aa142660,mb454333,ab111714,tb643174,tb119968,jb165157,fc482997,bc119105,qc945560,ac156139,ac653852,fd605839,ad419887,bd391487,jm148431,rd511702,kb730452 M1IQ04:x:50007:aa433115,aa267418,vb184539,tc358854,cc138661,am199865,rr964445,sw341552,ja331626,rf583928,lm829187,cm984249
G3LMIQ05:x:50021:pa206460,db181226,gb193206,pb150125,lb894869,nb877863,rb195774,rb446644,af156400,sh371704,rh181226,bl279121,fl719332,jm350052,gm164254,om613192,dm957211,lm238698,nm429991,tp124445,fp930386,br174285,sr995964,ps521697,ss548486,ds177708,tv126798 .
.
etudiant:!:50001:
.
.
togni@ufrsciencestech:~$ finger baril
Login: baril Name: Jean-Luc Baril
Directory: /home1/baril Shell: /bin/bash
Last login Mon Nov 20 15:34 2006 (CET) on ttypa from newgromit.iem No mail.
No Plan.
togni@ufrsciencestech:~$ file *
C: directory
Desktop: directory
Documents: directory
IPScan: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), not stripped IPScan.c: ISO-8859 C program text
IPScan.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
Paquet: ASCII text
togni@ufrsciencestech:~$ wc Pong.c 29 35 470 Pong.c
togni@ufrsciencestech:~$ wc -l Pong.c 29 Pong.c