Exercices Fichiers + programmation shell et awk 1
Transcription
Exercices Fichiers + programmation shell et awk 1
L3 Info I5TC1 UFR Sciences&Techniques Exercices Fichiers + programmation shell et awk 1 Les droits Exercice 1- Modification des droits Soit les droits courants rwx r-x r-x, écrire 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 2Quelles commandes, parmi les propositions suivantes, nous garantissent qu’un autre utilisateur que son propriétaire (et root) ne puisse pas supprimer le fichier /home/enseignant/otogni/hello.c? Soit un utilisateur n’étant ni root ni le propriétaire du fichier hello.c ni du répertoire otogni. Parmi les propositions suivantes, quelles commandes interdisent d’effacer le fichier /home/enseignant/otogni/hello.c à au moins à 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épertoire licence (dont le groupe licence est propriétaire) et deux répertoires utilisateurs toto et tutu. Il y a dans le répertoire toto un fichier source (dont toto est propriétaire). 1 i) On suppose que toto et tutu sont tous deux du groupe licence. Quels droits faut-il avoir au minimum sur les répertoires licence,toto et tutu pour que: - tutu puisse recopier dans son répertoire 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 propriétaire. Préciser, dans les deux cas ci-dessus la suite des instructions à utiliser. iii) Idem en supposant que toto est du groupe licence mais que tutu est du groupe maitrise. Exercice 4- Suppression Etant donnée 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érence entre les droits standards des fichiers et ceux des répertoires ? ii) Avec quel paramètre faut-il utiliser la commande umask pour créer des fichiers avec les droits rw------- puis des fichiers exécutables avec rwxr--r--? 2 2 Substitutions Exercice 6- Exemples de substitution sur les variables (listées 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 echo echo echo $HOME est votre point de login Voir le fichier $HOME/essai mettre une disquette dans $dk0 mettre une disquette dans ${dk}0 Exercice 7- Exemples de substitution avec valeur par défaut sur les variables connues. Expliquer le comportement de chacune des lignes de commandes suivantes: echo echo echo echo echo $racine est votre point de login Voir le fichier ${racine-essai} Rappel de votre point de login $racine Voir le fichier ${racine=glue} Rappel de votre point de login $racine Exercice 8- Quotation: expliquer le comportement de chacune des lignes de commandes suivantes: A=’echo *’ echo ’$A’ echo "$A" echo $A $A 3 Le shell Exercice 9- Répertoire courant Ecrire, sans utiliser de structure de contrôle, les commandes suivantes: i) nf: affichage du nombre de fichiers du répertoire courant, ii) ra: affiche oui si le répertoire courant est le répertoire d’accueil, non sinon; iii) prc : affiche la profondeur du répertoire courant; 3 iv) ouest: ouest <nom> affiche <nom> est dans <rep> où <rep> est le répertoire d’accueil de <nom>,si nom est un utilisateur défini et <nom> n’existe pas sinon. Exercice 10- Bilan sur un fichier Ecrire un programme shell qui lit un nom de fichier et affiche les renseignements le concernant sous la forme : nom du fichier : blabla numéro de i-noeud : blabla nom du propriétaire : blabla nom du groupe : blabla taille : blabla nombre de liens : blabla Exercice 11- Accès à un fichier Ecrire un programme shell qui - lit un nom de fichier - teste si ce fichier est accessible (dans le répertoire courant ou via le PATH) - teste si le propriétaire de ce fichier est présent sur la machine (et sinon lui envoie un message) Exercice 12- En-tête programmes C Ecrire le script ifdef tel que l’exécution de ifdef <nom>.h place en tête de <nom>.h les lignes #ifndef <NOM>_H #define <NOM>_H et la ligne #endif /* <NOM>_H */ à 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énère une version formatée du fichier de telle sorte que : - le fichier soit découpé en pages de la taille indiquée - chaque page comprenne un en-tête 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ême chose en ajoutant dans l’en-tête de chaque page le numéro de page. Exercice 14- Duplication de fichier Ecrire un script qui copie un fichier en vérifiant que le fichier destination n’existe pas déjà. Un des paramètres passés à cette commande indique si on peut ou non écraser les fichiers existants (sinon la copie n’est pas faite). Exercice 15- Bilan d’un répertoire 4 Ecrire un script qui affiche, selon la demande, certaines entrées du répertoire courant à savoir : - les exécutables - les répertoires - les fichiers lisibles - les fichiers modifiables Le plus simple est de passer en paramètre à ce script l’option correspondante de la commande test ou ls, auquel cas il faudra vérifier que l’option passée en paramètre est correcte. Exercice 16- ifdef amélioré Modifier le script ifdef de façon à ce qu’il • ne modifie pas le fichier s’il commence déjà 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ésent dans <nom>. Exercice 17- Lecture ligne à ligne d’un fichier de données On dispose d’un fichier contenant une liste de noms de fichiers à traiter lors d’une commande. i) On demande à l’utilisateur un nom de répertoire (si ce répertoire n’existe pas, on le créé). Pour chacun des fichiers à traiter, on recopie dans le répertoire le fichier (sauf s’il existe déjà dans le répertoire). Exercice 18- Nettoyage d’arborescence Ecrire un script qui reçoit en paramètre un nom de répertoire et efface du sous-arbre correspondant tous les fichiers core et .o (en listant dans un fichier les noms des fichiers supprimés). Exercice 19- Affichage des droits Ecrire un script qui reçoit en paramètre un nom de fichier (ordinaire, spécial ou répertoire) et affiche explicitement les droits d’accès à ce fichier. Par exemple pour rwsr-x–t on affichera : Propriétaire : lecture écriture exécution Groupe : lecture exécution Autres : Droits spéciaux positionnés : uid sticky Exercice 20- Historique Ecrire un script permettant d’ajouter au shell un mécanisme d’historique, le nom du fichier à utiliser pour garder l’historique sera passé en paramètre. On devra reconnaitre les commandes suivantes : ! exécute la dernière commande !n exécute la commande numéro n !% liste le fichier historique courant !d détruit le fichier historique courant !s nom sauvegarde le fichier historique dans un fichier nom !q fin du processus Toute autre ligne de commande sera passée au shell et archivée. 5 4 Le langage AWK Exercice 21- Que produisent les scripts awk suivants? i) {print $2 , $1} ii) $1 != p {print ; p = $1 } Exercice 22- E crire les scripts awk permettant d’afficher i) les deux premiers champs en ordre inversé avec des champs séparés 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- E crire les scripts awk suivants: i) afficher toutes les lignes plus longues que 72 caractères ii) afficher tous les champs de chaque ligne en ordre inverse iii) tester si tous les enregistrements d’un fichier ont le même nombre d’éléments iv) inserer des numéros de page dans un fichier, sachant que le fichier d’entrée contient déjà une ligne commençant par ”Page” à chaque endroit ou le numéro de page doit être inséré v) afficher le nombre d’occurences de chacun des mots d’un fichier texte vi) idem, en triant les mots par ordre décroissant Exercice 24- J e garde la trace de mes dépenses et de mes rentrées d’argent dans le fichier texte comptes.txt, chaque ligne ayant la forme suivante: date dépense rentrée motif (l’un des deux champs dépense ou rentrée 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érification que l’un des deux champs dépense ou rentrée vaut 0 pour chaque ligne. ii) affichage du total des dépenses, des rentrées et des périodes durant lesquelles le compte à été à découvert. iii) affichage du nombre de jours min, max et moyen entre deux dépenses. 6 Annexe: Syntaxe de awk Variables prédéfinies: • FS Séparateur de champs • RS Séparateur de d’enregistrement • NF Le nombre de champs dans l’enregistrement courant • FNR Le nombre d’enregistrements lus dans le fichier de données courant, en comptant l’enregistrement courant • NR Le nombre total d’enregistrements lus dans tous les fichiers de données • FILENAME Le nom du fichier de données courant Instructions de contrôle: if (expr) instr1 [;else instr2] while (expr) instr do instr while (expr) for (expr1; expr2; expr3) instr for (var in tableau) instr Fonctions prédéfinies sur les chaı̂nes: • index(s,t) retourne la position dans la chaı̂ne s où la chaı̂ne t apparrait pour la première fois • match(s,er) retourne la position dans la chaı̂ne s où l’expression régulière er apparrait pour la première fois • length(s) calcule le nombre de caractères de s • split(s,a,fs) divise la chaı̂ne s en utilisant le séparateur fs et range les éléments obtenus dans le tableau a (dans a[1], a[2], etc) • substr(s,p[,n]) si n n’est pas spécifié, retourne la sous-chaı̂ne de s commençant par le p-ième caractère; sinon retourne la sous-chaı̂ne de s commençant par le p-ième caractère et contenant n caractères. • sub(r,s[,t]) substitue la chaı̂ne s à la première occurence de l’expression régulière r dans t. La valeur retournée par sub est le nombre de substitutions qui ont été 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ée par sub est le nombre de substitutions qui ont été faites. • tolower(s) passage en minuscules, toupper(s) passage en majuscules. 7 Autres fonctions prédéfinies: • print produit un affichage, par défaut sur la sortie standard, mais on peut utiliser les redirections. • printf s’utilise de la même façon qu’en C. • system(cmd) exécute la commande UNIX cmd dans un sous-shell. • getline [var] lit le prochain enregistrement sur l’entrée standard dans la variable var (dans $0 si pas de paramètre). 8 Résultats d’exécutions de quelques commandes usuelles togni@ufrsciencestech:~$ ls -il total 7092 17170526 drwxr-xr-x 2 togni etudiant 4096 Feb 20 18169933 drwxr-xr-x 2 togni etudiant 4096 Oct 18 16547920 drwxr-xr-x 2 togni etudiant 4096 Nov 28 5750911 -rwxrwxrwx 1 togni etudiant 13282 May 6 5750909 -rw-rw-rw1 togni etudiant 12575 May 6 5750910 -rw-rw-rw1 togni etudiant 12600 May 6 5750894 -rw-r--r-1 togni etudiant 1441 May 7 5750945 -rwxr-xr-x 1 togni etudiant 152 Jan 3 5750946 -rwxr-xr-x 1 togni etudiant 157 Jan 3 5750942 -rwxr-xr-x 1 togni etudiant 6768 Jan 3 5750943 -rwxr-xr-x 1 togni etudiant 6848 Jan 10 5750944 -rw-r--r-1 togni etudiant 470 Jan 10 . . . 5750913 -rw-r--r-1 togni etudiant 130524 May 14 5750914 -rw-r--r-1 togni etudiant 1144422 Oct 25 5750938 -rw-r--r-1 togni etudiant 3999 Oct 10 5750961 -rw-r--r-1 togni etudiant 33 Oct 24 5750925 -rw-r--r-1 togni etudiant 1924 Nov 4 2004 2004 2005 2004 2004 2004 2004 2005 2005 2005 2005 2005 C Desktop Documents IPScan IPScan.c IPScan.o Paquet Ping Ping~ Pong Pong.bin Pong.c 2004 2004 2006 2006 2004 spider091503.pdf these.ps titi toto 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 M1IQ04:x:50007:aa433115,aa267418,vb184539,tc358854,cc138661,am199865,rr964445,sw341552,j G3LMIQ05:x:50021:pa206460,db181226,gb193206,pb150125,lb894869,nb877863,rb195774,rb446644 . . etudiant:!:50001: . 9 . 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), dynamic IPScan.c: ISO-8859 C program text IPScan.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not st Paquet: ASCII text togni@ufrsciencestech:~$ wc Pong.c 29 35 470 Pong.c togni@ufrsciencestech:~$ wc -l Pong.c 29 Pong.c 10