Exercices Fichiers + programmation shell et awk 1 Les droits
Transcription
Exercices Fichiers + programmation shell et awk 1 Les droits
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 2Soit 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 5. chmod 1777 /home/enseignant/otogni 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). 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 ainsi que sur le fichier source pour que: 1 1. tutu puisse recopier dans son répertoire le fichier source 2. 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 master. 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- Quotation: expliquer le comportement de chacune des lignes de commandes suivantes: A=’echo *’ echo ’$A’ echo "$A" echo $A $A 3 Le shell Exercice 8- 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 9- Répertoire courant Écrire, 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; 3 iii) prc : affiche la profondeur du répertoire courant; 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- En-tête programmes C i) 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. ii) 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 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- 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 13- 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 14- 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 15- 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 16- 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 17- 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. 4 Le langage AWK Exercice 18- Que produisent les scripts awk suivants? i) {print $2 , $1} ii) $1 != p {print ; p = $1 } Exercice 19- 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” 5 Exercice 20- 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 21- 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. 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 6 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. 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). Résultats d’exécutions de quelques commandes usuelles togni@ufrsciencestech:~$ ls -il total 7092 17170526 drwxr-xr-x 2 togni etudiant 18169933 drwxr-xr-x 2 togni etudiant 16547920 drwxr-xr-x 2 togni etudiant 5750911 -rwxrwxrwx 1 togni etudiant 5750909 -rw-rw-rw1 togni etudiant 5750910 -rw-rw-rw1 togni etudiant 5750894 -rw-r--r-1 togni etudiant 5750945 -rwxr-xr-x 1 togni etudiant 5750942 -rwxr-xr-x 1 togni etudiant 4096 4096 4096 13282 12575 12600 1441 152 6768 7 Feb 20 Oct 18 Nov 28 May 6 May 6 May 6 May 7 Jan 3 Jan 3 2004 2004 2005 2004 2004 2004 2004 2005 2005 C Desktop Documents IPScan IPScan.c IPScan.o Paquet Ping Pong 5750944 ... 5750914 5750938 5750961 5750925 -rw-r--r-- 1 togni etudiant -rw-r--r--rw-r--r--rw-r--r--rw-r--r-- 1 1 1 1 togni togni togni togni 470 Jan 10 etudiant 1144422 Oct 25 etudiant 3999 Oct 10 etudiant 33 Oct 24 etudiant 1924 Nov 4 2005 Pong.c 2004 2006 2006 2004 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 ... 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: ... 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 8