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