Professional Documents
Culture Documents
Page :
Page :
ls -r Afficher le contenu des fichiers Afficher bout bout le contenu de fichiers: cat fichier1 fichier2 (concatenate) Afficher le contenu de plusieurs fichiers (en faisant une pause chaque page): more fichier1 fichier2
Afficher toutes les lignes sauf celles qui contiennent une expression: grep -v expression fichier Recherche rcursive dans un rp.: grep -r expression rp Trier les lignes d'un fichier: sort fichier
less fichier1 fichier2 (plus de possibilits) Afficher les 10 premires lignes d'un fichier: head -10 fichier uniq -c (id. et compte chaque lment) Afficher les 10 dernires lignes d'un fichier: Trier, n'afficher qu'1 fois les lignes identiques: sort -u fichier (ou uniq)
*.log fichiers finissant par '.log' *bug* fichiers avec 'bug' dans leur nom *.? fichiers finissant par '.' et suivis d'un
rpertoire et tout ce qu'il contient: Rediriger la sortie d'une commande vers chown -R nouvproprio:nouvgroupe rp l'entre d'une autre:
9.Contrle de tches
diff fichier1 fichier2 Afficher tous les processus excuts: Comparer 2 rpertoires: ps -ef diff -r rp1 rp2 Classement en direct des processus (P, M, T: trie par utilisation Proc, Mm ou Temps CPU): top Afficher la mmoire libre: free Afficher la mmoire virtuelle toutes les n secs: vmstat n Recherche rapide dans tout systme: (utilise un index, les fichiers rcents peuvent manquer): locate "*bar*" kill -9 <pid> Envoyer un signal d'arrt un processus: kill <pid> (numro indiqu par ps) Faire tuer un processus par le systme:
Tuer tous processus que l'on a le droit de tuer: kill -9 -1 Tuer tous processus appels windows: killall windows
Page :
Tuer une application en mode graphique: xkill (cliquer sur la fentre du programme)
tar zcvf archive.tar.gz rp/ Tester (lister) une archive compresse: tar jtvf archive.tar.bz2 tar ztvf archive.tar.gz Extraire les fichiers d'une archive compresse: tar jxvf archive.tar.bz2
tar zxvf archive.tar.gz wc fichier (word count) Options de tar: Afficher la taille, le Type, l'espace total et c: crer l'espace libre dans la partition courante: t: tester / lister df -Th . x: extraire Afficher cette info pour toutes les partitions: df -Th j: (d)compression bzip2 la vole z: (d)compression gzip la vole Manipuler des archives zip: zip -r archive.zip <files> (crer) unzip -t archive.zip (tester / lister) unzip archive.zip (extraire)
11.Compresser
Compresser un fichier: bzip2 fichier (meilleur taux de compression) gzip fichier Dcompresser un fichier: bunzip2 fichier.bz2 gunzip fichier.gz
13.Imprimer
Envoyer fichiers PostScript ou texte sur queue: lpr -Pqueue f1.ps f2.txt (local printer) Lister les tches d'impression dans queue: lpq -Pqueue Annuler la tche n123 dans queue: cancel 123 queue Page : 5
Mesurer le temps pris par une commande: time trouve_prince_charmant -beau -ric he
17.Rseau
Passer l'utilisateur hulk: Vrifier l'tat d'un lien Ethernet: su - hulk ethtools <interface> Passer au super-utilisateur (root): su sudo -i su (sans changer de rp. ni d'environnement) Excuter une commande en tant que root: sudo commande Afficher toutes les interface rseau disponibles: ip link show Assigner une adresse IP une interface rseau: ip address add 207.46.130.108 dev eth0 Dsactiver une interface rseau: ip link set dev eth0 down Dfinir une passerelle par dfaut: ip route add default via 192.168.0.1 Supprimer la route par dfaut: ip route del default Tester la connexion rseau avec une machine: ping 207.46.130.108 FILALI MOULAY RACHID Page : 6
15.Grer le temps
Attendre 60 secondes: sleep 60 Afficher la date actuelle: date Mettre l'heure ntp : ntpdate time.nist.gov
umount /mnt/cleusb Crr un volume RAID: mdadm -C /dev/md0 -l1 -n2 /dev/hda /dev/hdb Visualiser l'tat d'un volume RAID: mdadm -D /dev/md0 Marquer un disque comme dfaillant: mdadm /dev/md0 -f /dev/hda Sortir un disque du volume RAID: mdadm /dev/md0 -r /dev/hda Ajouter un disque dans un volume: mdadm /dev/md0 -a /dev/hda Prparer un volume physique pour LVM: pvcreate blockdev1 ... blockdevN Crer un volume group LVM: vgcreate monvg blockdev1 ... blockdevN Crer un volume logique LVM de 30Mb: lvcreate -n vol1 -L30M monvg Etendre un volume logique de 5Mb: lvextend -L5M /dev/mapper/monvg/vol1 Rduire un volume logique de 15Mb: lvreduce -L15M /dev/mapper/monvg/vol 1 Crer un volume TrueCrypt (fichier ou device): truecrypt -c
Page :
(D)Monter un volume TrueCrypt: truecrypt volume /mnt/crypto (-d) Crer un volume luks: cryptsetup luksFormat /dev/ice Ouvrir un volume luks (monter ensuite crypdv): cryptsetup luksOpen /dev/ice cryptdv
[[:space:]] espace ou tabulation [[:lower:]] [a-z] ([[:upper:]] : [A-Z]) [[:print:]] caractre imprimable ou espace [[:xdigit:]] [A-Fa-f0-9]
20.Expressions rgulires
<ctrl-k> couper (kill) la fin de la ligne dans grep, vi, sed, ... les caractres ?, +, {, |, (, et ) doivent tre prcds d'un antislash (\) . n'importe quel caractre * caractre prcdent 0 fois ou + + caractre prcdent 1 fois au moins ? le caractre prcdent 0 ou 1 fois {n} le caractre prcdent n fois {m,n} le caractre prcdent de m n fois {n,} le caractre prcdent n fois ou plus [a-z] un caractre en minuscule [a-zA-Z] une lettre [0-9] un chiffre ^/$ le dbut/la fin de ligne | sparateur (ou logique) [[:alnum:]] [[:alpha:]] ou [[:digit:]] <ctrl-y> coller (yank) <ctrl-d> efface (delete) le caractre droit du curseur <esc>d efface le mot droite du curseur <ctrl-t> transposer deux caractres <esc>t transpose le mot prcdent et le suivant <ctrl-r> rechercher dans l'historique <ctrl-l> effacer l'cran (quivalent clear) <ctrl-d> envoie le caractre 'fin de fichier' <ctrl-c> arrter la commande en cours <ctrl-z> stopper la commande en cours <tab> complte l'lment <tab><tab>affiche les compltions possibles
commenant par texte !n excuter la commande numro n cmd & excuter la commande cmd en arrire plan fg %n mettre le travail n en avant plan (sans argument : le dernier travail) bg %n mettre le travail n en arrire plan (sans argument : le dernier travail) kill %n terminer le travail n jobs affiche la liste des travaux du shell history affiche l'historique des commandes
Modes i (<ins>) mode insertion <esc> mode commande o ajouter une ligne aprs la ligne courante et passer en insersion Sortir , sauver :w sauver le fichier :w nom sauver dans le fichier nom :w>>nom sauver la fin du fichier nom :q quitter sans sauver :q! quitter de force sans sauver :x (:wq) sauver et quitter :e nom ferme le fichier courant et dite le fichier nom :e! nom ferme le fichier courant de force et dite le fichier nom :e! annule tous les changements et revient au fichier original Dplacements h dplacement vers la droite j dplacement vers le bas k dplacement vers le haut l dplacement vers la gauche ^^ dbut de ligne $ fin de ligne
24. Editeur Vi
FILALI MOULAY RACHID
Page :
gg premire ligne (ou 1G) G dernire ligne nG ligne n (ou :n) w mot suivant b mot prcdent <ctrl-f> page suivante <ctrl-b> page prcdente fx aller aprs le prochain caractre x de la ligne tx aller avant le prochain caractre x de la ligne H aller en haut de l'cran M aller au milieu de l'cran
L aller en bas de l'cran Copier , couper , coller x coupe le caractre sous le curseur yy copie la ligne courante entire y^ copie la ligne du dbut au curseur y$ copie la ligne du curseur la fin yw copie le mot suivant dd coupe la ligne courante entire d^ coupe la ligne du dbut au curseur d$ coupe la ligne du curseur la fin dw coupe le mot suivant P colle avant la position courante p colle aprs la position courante
Page :
10
Que vous voulez copier le rpertoire Rapport et ses sous-rpertoires dans le rpertoire www. Il faut taper :
cp -r Rapport/ www/
ou
cp -R Rapport/ www/
Q2.Que se passe-t-il si l'on veut faire une copie appele tentative/ de son rpertoire essai/, et que le rpertoire tentative/ existe dj ? R2.Quand on indique le nom d'un rpertoire qui n'existe pas, cp considre qu'il s'agit du nom donner la copie du premier rpertoire (ou fichier). Quand le rpertoire existe dj, cp considre qu'il s'agit de l'endroit o il faut placer la copie du premier lment (la cible : target). Si donc on tape
cp -R essai/ tentative/
et que tentative/ existe dj, on obtient une copie de essai/, galement appele essai/, place dans le rpertoire tentative/. Q3.Que se passe-t-il si vous voulez faire une copie d'un fichier dans un rpertoire o il existe dj un fichier de ce nom ? R3.Le programme demande si vous voulez vraiment effacer le fichier dj existant pour le remplacer par celui dont vous faites la copie.
Page :
11
Attention ! Il en est ainsi parce que vous avez un alias de cp sur cp -i, qui demande confirmation. Ce n'est pas ncessairement le cas partout. Pour savoir quels sont vos alias, tapez alias ou allez voir dans votre fichier .alias. Avec la config conscrits, les alias sont dans le .zshrc (le fichier de configuration du shell zsh). Q4.Quel est l'effet d'une ligne comme :
cp fichier1 fichier2 fichier3 repertoire/
R4.Les fichiers fichier1, fichier2 et fichier3 sont copis sous leur nom dans le rpertoire rpertoire/, qui doit exister.
mv
Q5. Que se passe-t-il si le fichier cible existe dj ? R5. Si vous avez un alias de mv sur mv -i (cas de la config conscrits), le programme demande si vous voulez rcrire le fichier cible en remplaant son contenu par celui du fichier de dpart :
Rachid ~ $ ls rapport.tex notes complements Rachid ~ $mv notes complements mv: overwrite complements (yes/no)? y Rachid ~ $ls rapport.tex complements
Et que vous vous trouvez dans ~/Rapport/docs/. Q61. Comment faites-vous pour y amener Rapport.tex qui se trouve dans le rpertoire pre ?
R61. mv ../Rapport.tex .
Amener le fichier Rapport.tex situ dans rpertoire pre (../Rapport.tex) dans le rpertoire o on se trouve (. : ici). Q62. Comment faites-vous ensuite pour ramener ce fichier son emplacement d'origine ?
R62. mv Rapport.tex ..
Page :
12
Amener le fichier Rapport.tex situ dans le rpertoire courant, dans le rpertoire pre (..). Q7. Comment renommer un rpertoire bla/ en blo/ ? Que se passe-t-il si le rpertoire blo existe dj ? R7. Il suffit de taper
mv bla/ blo/
Si jamais blo/ existe dj, bla/ devient un sous-rpertoire de blo/. Q8. Comment faire pour la fois dplacer un fichier et changer son nom ? Que se passe-t-il si il existe dj un fichier de ce nom dans le rpertoire d'arrive ? R8. Supposons que l'on veut amener Rapport.tex dans le rpertoire courant, et l'appeler On tape :
mv ../Rapport.tex stage Rapport.tex est la fois dplac et renomm; vous pouvez vrifier qu'il n'est plus dans Rapport et qu'il y a dsormais un fichier stage dans docs/.
stage.
Si le fichier d'arrive existe dj, on se retrouve dans le cas vu tout au dbut de cet exercice (remplacement ou non). Q9. Mmes questions avec un rpertoire. R9. Pour dplacer et renommer, la syntaxe est la mme que pour un fichier :
mv ../bla ble/
dplace le rpertoire bla/ du rpertoire pre dans le rpertoire courant, et le renomme en ble/. Si jamais ble/ existe dj, bla/ y est dplac sous son nom, et devient un sous-rpertoire de ble/. Q10. Que se passe-t-il si on lance mv avec les options -i et -f ensemble ? . R10. L'option -f (force) sert renommer le fichier imprativement, mme si le fichier cible existe dj, sans demander confirmation. L'option -i (interactive) demande confirmation. Des deux options, c'est -f qui l'emporte :
Rachid ~ $ ls bla tutu Rapport/ Rachid ~ $ alias mv mv='mv -i' Rachid ~ $ mv bla tutu mv: overwrite tutu (yes/no)? n Rachid ~ $ mv -f bla tutu Rachid ~ $ ls tutu Rapport/
Page :
13
mkdir, rmdir
Q11. Crez trois rpertoires en une seule ligne de commande. R11. Si vous voulez crer trois rpertoires bla, ble et bli, tapez
mkdir bla ble bli
Q12. Effacez ces trois rpertoires en une seule ligne de commande. R12. Il faut taper
rmdir bla ble bli
Q13. Que se passe-t-il si vous tapez mkdir mkdir ? R13. Vous crez chez vous un rpertoire appel mkdir. Q14. Vous voulez dtruire un rpertoire bla/... mais a ne marche pas.
R14. ls vous dit qu'il est vide, et pourtant vous ne russissez pas l'effacer : c'est qu'il n'est pas vide. Il doit y avoir des fichiers cachs, commenant par un point, que vous ne voyez pas avec ls sans option. Il faut taper ls -a
et effacer les fichiers trouvs. Q15. Est-ce que mkdir peut prendre des options ? R15. Oui, une : l'option -p, dont on va parler tout de suite. Q16. quelle condition est-ce que la ligne de commande mkdir Rapport/annexes peut fonctionner et crer effectivement ce sous-rpertoire ? R16. Il faut que le rpertoire Rapport existe, pour que l'on puisse y crer un sous-rpertoire. Q17. Y a-t-il une option de mkdir qui permette de crer la fois un rpertoire et un sousrpertoire de ce rpertoire ? R17. Oui, c'est l'option -p. Quand vous tapez
mkdir -p Rapport/annexes
un rpertoire Rapport est cr, et dans ce rpertoire un sous-rpertoire annexes. Q18. Comment crer un rpertoire en spcifiant des droits ? R18. On utilise l'option -m (mode) de mkdir. Par exemple :
Page :
14
Rachid ~ $ mkdir -m 700 Mail Rachid ~ $ ls -ld Mail drwx-----2 robin litt95
2048 Jun
2 15:27 Mail/
R19. Cette commande efface toute la hirarchie des rpertoires, condition qu'ils soient vides; si par exemple tutu/ est vide mais toto/ ne l'est pas, tutu/ sera effac mais pas toto/, et le programme s'arrte. Q20. Cration rcursive sans message d'erreur R20. On achve avec ceci le tour de l'option -p... Si donc on tape
mkdir -p toto/tutu/
le sous-rpertoire tutu/ est cr si toto/ existe dj; et si toto/ n'existe pas, ce rpertoire et son sous-rpertoire sont crs. Il n'y a pas de message d'erreur.
cd
But de l'exercice : apprendre se servir de . et .. (point et point point). .. dsigne le rpertoire pre du rpertoire courant, et . dsigne le rpertoire courant. .. sert beaucoup avec cd, pour remonter d'un niveau dans une arborescence; . est trs utile avec des commandes comme mv ou cp, o il signifie en fait ici.
Q21. Dans quel rpertoire vous trouvez-vous quand vous vous loguez ? R21. Vous vous trouvez dans votre rpertoire personnel, dans ~ (tilde). Q22. Allez directement dans ~/Rapport/docs/afaire/ R22. Taper
cd Rapport/docs/afaire
R24. Taper
cd ../..
ou
cd ~/Rapport
Q25. Sans changer de rpertoire, regardez avec less le contenu de ~/www/index.html R25. Il faut taper
less ~/www/index.html
ou
less ../www/index.html
Q27. En restant l o vous tes, affichez les droits de ~/Mail/ R27. Il y a un petit pige dans cette question. En effet, si vous tapez
ls -l Mail/
vous allez obtenir le contenu du rpertoire Mail/, mais pas le statut du rpertoire luimme. Il faut donc utiliser l'option -d de ls :
Rachid ~ $ ls -ld Mail drwx------ 2 toto litt98 512 Apr 2 19:02 /users/98/litt/toto/Mail/
Q28. Revenez dans votre rpertoire principal R28. Taper cd, sans arguments. Q29. Que se passe-t-il si vous vous dloguez alors que vous n'tes pas dans votre rpertoire principal ? R29. Strictement rien ! a n'a aucune importance.
ls
Q30. Affichez le contenu de /usr/local/games/bin
R30. ls /usr/local/games/bin
Page :
16
L'option -a fait apparatre les fichiers de configuration, qui commencent par un point; l'option -l affiche plusieurs renseignements, en particulier la taille. En fait, si vous indiquez le nom complet du fichier cherch, avec le point, l'option -a est inutile; c'est le cas ici. Le .flnewsrc.forum contient la liste de continua de forum avec des indications sur les contis auxquels vous tes abonns et les messages que vous avez dj lus. Il est remis jour chaque fois que vous lisez forum : la date indique correspond donc la dernire fois que vous avec lanc (ou plus prcisment, quitt...) forum. Q32. quoi sert l'option -R de ls ? R32. Cette option permet d'afficher une liste rcursive, c'est--dire qui indique le contenu des rpertoires lists, ainsi que de leurs sous-rpertoires. Si vous tapez ls -R dans votre rpertoire personnel, vous aurez une liste de tout ce que vous avez chez vous. Q33. Dans quel ordre les fichiers et rpertoires sont-ils classs par dfaut? Quelles sont les options qui peuvent servir modifier ce critre de classement ? R33. Pour savoir cela, il faut chercher le mot sort dans le man de ls. La premire occurence vous dit que par dfaut le rsultat est tri par ordre alphabtique, selon la premire lettre des fichiers. De faon plus prcise, l'ordre est le suivant : ponctuations, chiffres, majuscules, minuscules, selon l'ordre dfini par la table des caractres ASCII. En continuant chercher, vous trouvez des options intressantes : -r (reverse), qui inverse l'ordre de classement, -t (time) qui trie en fonction de la date de dernire modification. Q34. Affichez le contenu de votre rpertoire courant de telle sorte que les fichiers modifis rcemment apparaissent en premier.
R34. ls -t
si vous voulez juste modifier le critre de tri, sans plus de renseignements; ou encore
ls -lt
si vous voulez une longue liste. Q35. Quels sont les droits de votre rpertoire Mail ? Qu'est-ce que cela signifie ? R35. La ligne ressemble ceci :
drwx------ 2 toto litt98 512 Apr 2 19:02 Mail
Le d indique qu'il s'agit d'un rpertoire (directory). Suivent ensuite neuf caractres, allant par trois; r, w, x correspondent aux droits que vous avez sur le rpertoire (ou le FILALI MOULAY RACHID Page : 17
fichier) : r (read) pour le droit de lecture, w (write) pour le droit d'criture, x (execute) pour le droit d'excution. Les six tirets qui suivent correspondent aux droits qu'ont le groupe (ici litt98) puis le reste des utilisateurs. Ici il y a des tirets, ce qui signifie qu'ils n'ont aucun droit sur ce rpertoire. Cela veut dire que seul le propritaire a le droit de lire et crire dans son rpertoire Mail/, ainsi que d'y accder. Les rpertoires et les fichiers de courrier sont protgs contre les indiscrtions. Un fichier de texte standard a les droits suivants :
-rw-r--r--
Il y a un tiret tout au dbut, ce qui signifie que c'est un fichier normal; vous avez le droit d'crire et de lire (rw-), votre groupe et les autres utilisateurs ont le droit de lire le fichier (r--). La commande chmod permet de changer ces droits, si l'on veut restreindre la lecture, ou rendre un fichier excutable. Remarque : ne cdez pas la paranoa... vos camarades ne passent pas leur temps farfouiller sur les comptes des voisins, donc vous n'avez pas besoin d'interdire la lecture tout ce que vous avez chez vous. Q36. Dcrivez le rsultat de la commande ls -l. R36.
o o -rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux
Les dix premiers caractres dtaillent les droits du fichier. Le premier caratre identifie le type du fichier : ici, rien n'est spcifi, c'est donc un fichier normal. L'exercice prcdent dtaille la signification des lettres suivantes. Ce sont les droits normaux d'un fichier standard : tout le monde (propritaire, groupe et autres utilisateurs) peut lire le fichier, seul le propritaire peut crire dedans.
-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux
o o o o o o o o o
Le chiffre indique le nombre de liens. Nous vous renvoyons aux exercices sur les liens pour plus d'explications (qui peuvent attendre un niveau dbutant...).
-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux
Le troisime champ donne le nom du propritaire du fichier. Ici, il s'agit de l'utilisateur robin.
-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux
Ce champ indique le groupe de l'utilisateur. Ici, nous apprenons qu'milia est une littraire de la promotion 1995.
-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux
Ce chiffre donne la taille en octets du fichier considr. Ici, le fichier fait 754 octets, soit moins d'un Ko (1000 octets). C'est un petit fichier.
-rw-r--r-- 1 robin litt95 754 Mar 22 11:59 projet.aux
Ce champ indique la date de dernire modification du fichier, ici le 22 mars de l'anne courante, 11h59. Quand le fichier date d'une anne antrieure, celle-ci est indique et l'heure ne figure plus. FILALI MOULAY RACHID Page : 18
-rw-r--r-- 1 robin
litt95
Vient enfin le nom du fichier. Le suffixe .aux montre qu'il s'agit d'un fichier produit par LaTeX lors de la compilation d'un fichier projet.tex. Q37. Comment afficher les droits d'un rpertoire donn ? R37. Si on tape
ls -l repertoire/
c'est le contenu du rpertoire qui s'affiche, et pas son statut lui. L'option -d (directory) permet de lister le rpertoire lui-mme. Q38. Caractres identifiant les fichiers ? R38. Ce sont les caractres suivants : slash (/) pour un rpertoire arobase (@) pour un lien symbolique toile (*) pour un excutable pipe (|) pour un pipe nomm gal (=) pour un socket C'est l'option -F qui permet de les afficher. Q39. Droits sur un rpertoire ? R39. Avoir le droit d'excuter un rpertoire, c'est avoir le droit d'y accder, de s'y dplacer; mais je n'ai pas le droit de lire son contenu. Donc, moins d'en tre propritaire, je ne peux pas afficher le contenu d'un rpertoire ayant comme droits :
drwx--x--x
Les droits
Q40. Changez les droits d'un fichier fic1 pour que tous ceux de votre groupe puissent crire dedans.
R40. chmod g+w fic1
Q41. Donnez en une seule ligne le droit d'excution tous les utilisateurs d'un fichier script qui n'a jusqu'alors que des droits standards (-rw-r--r--).
R41. chmod uog+x script
Q42. Le fichier toto a les droits suivants : -rwxr--r--. Modifiez-en les droits en une ligne de commande de sorte que le propritaire n'ait plus que le droit de lecture.
Page :
19
Q43. Modifier les droits du fichier toto (-rwxr--r--) de sorte que le groupe et les autres utilisateurs aient les mmes droits que le propritaire.
R43. chmod og+wx toto
Q44. Quelle option permet de modifier rcursivement les droits d'un rpertoire et des fichiers qu'il contient ? R44. C'est l'option -R. Par exemple, pour interdire tous les droits aux fichiers prsents dans une branche du rpertoire confidentiel, on peut faire :
chmod -R og-rwx confidentiel
Q45. Quelle option de mkdir permet de crer un rpertoire en spcifiant les droits sur ce rpertoire ? R45. C'est l'option -m qui permet de le faire. Par exemple, pour crer un rpertoire en lecture interdite aux autres :
mkdir -m og-r repertoire
Les liens
Q47. Vous avez chez vous un rpertoire tmp/ qui contient un fichier bidon. Crez un lien physique sur tmp/bidon appel blo, dans votre rpertoire d'accueil (HOME). Comparez les contenus de tmp/bidon et de blo. Que contient blo ?
R47. ln tmp/bidon blo
Les contenus sont identiques. Les noms de fichiers tmp/bidon et blo renvoient au mme endroit sur le disque dur.
Le contenu semble tre identique, cependant, propos du blo, le disque dur ne contient comme information que le nom du fichier vers lequel le lien pointe (tmp/bidon).
Q49. Quelles sont les diffrences entre les liens durs et les liens symboliques ? FILALI MOULAY RACHID Page : 20
R49. On vient d'en voir une. On en dduit que le temps d'accs au contenu d'un lien dur est plus rapide que pour un lien symbolique. Une autre diffrence notable est que, contrairement aux liens symboliques, un lien dur ne peut pas pointer vers un rpertoire. Q49. Dans quel cas ne peut-on pas faire de lien physique ? Que faut-il faire ? R49. On ne peut pas faire de lien dur vers un rpertoire. Dans ce cas, il faut donc utiliser un lien symbolique. Q50. Quel est l'effet de chmod sur un lien ? R50. S'il s'agit d'un lien dur, les droits des deux fichiers lis sont modifis. En revanche, s'il s'agit d'un lien symbolique, les deux fichiers peuvent avoir des droits diffrents.
Les processus
Q51. Affichez la liste des processus associs votre terminal. Affichez la liste des processus dont vous tes propritaire. Recommencez en utilisant l'option -l. quoi correspondent les colonnes PID et PPID ? R51.
1. Rachid ~ $ ps 2. 3. 4. 5. PID 16970 16992 17382 TT pts/2 pts/2 pts/3 S S S R TIME 0:00 0:07 0:00 COMMAND /usr/local/util/bin/zsh4 vim systeme-sol.tml /usr/local/util/bin/zsh4
6. Rachid ~ $ ps -l
7. 8. 9. 10.
F 8 8 8
UID PID PPID %C PRI NI SZ RSS WCHAN S TT 9625 16970 16967 0 48 20 4032 3152 mutex_ex S pts/2 9625 16992 16970 1 58 20 4312 3760 mutex_ex S pts/2 9625 17382 17379 0 48 20 3912 2840 mutex_ex S pts/3
Les numros apparaissant dans la colonne PID sont les numros des diffrents processus. Le PPID dsigne lui le numro du processus pre du processus en question. Par exemple, ici, le processus 16992 (vim) est un fils du processus 16970 (zsh). Q52. Lancez une commande longue en arrire plan. Quel est le comportement du processus associ lorsqu'il reoit les signaux suivants : R52. Pour envoyer un signal un processus, on peut faire :
Rachid ~ $ kill -23 17382
(9) Page : 21
(23)
Le processus s'interrompt.
o sigcont
(25)
Le processus interrompu redmarre. Q53. Utilisez la commande nice pour lancer des commandes ayant une faible priorit.
R53. Rachid ~ $ nice -19 ./calcul
Q54. Interprtez la hirarchie des processus qui vous appartiennent. R54. Pour vous aider comprendre, vous pouvez afficher un arbre en lanant la commande pstree (FreeBSD) ou ptree (Solaris). Q55. La commande ps | wc compte deux processus en plus de ceux qui existent rellement lorsqu'on lance la commande. Pourquoi ? R55. Ce sont les processus associs aux commandes ps et wc que vous venez de lancer ! Q56. Donner deux commandes pour reprendre l'excution d'une instruction interrompue par un ^Z. R56. Vous disposez des commandes fg et bg. fg permet de poursuivre le droulement du programme. bg le fait aussi mais il relance le programme en tche de fond.
blo,
Q58. Comment faire une copie d'un fichier sans utiliser cp ni ouvrir d'diteur de texte ? R58. On demande cat d'afficher le contenu d'un fichier, puis de placer le rsultat dans un fichier :
cat toto > copie
Q59. Utiliser cat pour crire un peu de texte et mettre le rsultat dans un fichier notes. FILALI MOULAY RACHID Page : 22
R59. On demande cat de rediriger sa sortie dans un fichier, puis on n'a plus qu' taper le texte et indiquer la fin du texte avec ^D :
Rachid ~ $ ls maitrise.tex Rachid ~ $ cat > notes Faire la bibliographie Revoir le chapitre 1. ^D Rachid ~ $ ls maitrise.tex notes Rachid ~ $ cat notes Faire la bibliographie Revoir le chapitre 1. Rachid ~ $
C'est bien sr un moyen un peu spartiate pour crire du texte, mais dans le cas de choses trs courtes dans ce style, ce peut tre plus rapide que de lancer un vritable diteur. Q60. Quelle diffrence y a-t-il entre
cat bla blo > blu
et
cat bla blo >> blu
Que se passe-t-il, pour chaque ligne, selon que le fichier blu existe ou n'existe pas ?
cat bla blo > blu
R60. Concatne les deux fichiers bla et blo, et place le rsultat dans un nouveau fichier appel blu. Si blu existe dj, le shell affiche un message d'erreur et ne fait rien.
cat bla blo >> blu
place la concatnation de bla et blo la fin d'un fichier blu dj existant. S'il n'existe pas, le shell affiche un message d'erreur et en reste l, sans crer de fichier blu.
Les deux redirections ne sont donc pas du tout quivalentes, mais leur action dpend du shell, qui a des options qui modifie leur comportement par dfaut. Q61. Comment obtenir un fichier blo qui corresponde un fichier bla dont les lignes seraient dsormais numrotes ? R61. Il faut utiliser l'option -n de cat. Par exemple :
Rachid ~ $ cat bla Pomme Poire Prune Rachid ~ $ cat -n bla > blo Rachid ~ $ cat blo 1 Pomme 2 Poire
Page :
23
3 Prune Rachid ~ $
entre crochets; : c'est le mme principe, sauf que l'on indique un intervalle au lieu d'crire explicitement les chiffres; rm essai? : le point d'interrogation dsigne n'importe quel caractre unique, le point y compris, sauf si le nom du fichier commence par un point (ls ?pine dans $HOME ne vous donnera pas, par exemple, la liste des fichiers de configuration de Pine : .pinerc, etc).
rm essai[1-4]
Ici, on trouvera tous les fichiers commenant par essai, suivi d'un unique caractre qui peut ne pas tre un chiffre.
o rm essai* : c'est la formulation la plus vague : effacer les fichiers dont le nom commence par essai suivi de quelque chose, c'est--dire d'un nombre indfini de caractres, ou aucun.
Q63. Dans mon rpertoire d'accueil, j'ai un certain nombre de fichiers avec un suffixe .c. Je dsire les regrouper dans un rpertoire que j'appelerai C/. Quelles sont les commandes que je dois taper ? R63. On commande par crer un rpertoire C avec mkdir, puis, avec mv, on dplace tous les fichiers ayant un suffixe . et dont le nom est fait d'une suite de caractres quelconques :
Rachid ~ hello* hello.c Rachid ~ Rachid ~ Rachid ~ C/ Rachid ~ hello.c $ ls zoinx* zoinx.c $ mkdir C $ mv *.c C/ $ ls hello* zoinx* $ ls C/ zoinx.c
Q64. Vous dsirez regrouper dans un rpertoire Rangement les fichiers dont le nom contient un caractre minuscule suivi d'un caractre majuscule. Quelle(s) est/sont la/les commande(s) donner ? R64. On commence par crer le rpertoire Rangement avec mkdir. Pour dsigner les noms des fichiers, il faut indiquer la notion de minuscule. On pourrait crire explicitement l'alphabet entre crochets, pour dire l'un de ces caractres, puis faire de mme avec les majuscules. Mais FILALI MOULAY RACHID Page : 24
on gagne du temps en utilisant des intervalles ([a-z] et [A-Z]). Le reste du nom du fichier, avant et aprs la minuscule puis la majuscule, est indfini. On crit donc :
Rachid ~ $ mkdir Rangement Rachid ~ $ mv *[a-z][A-Z]* Rangement/
Q65. Mme chose avec les fichiers dont le nom contient trois voyelles la suite. R65. Le principe est le mme, sauf que l'on indique explicitement les voyelles entre crochets :
Rachid ~ $ mkdir Rangement Rachid ~ $ mv *[aeiou][aeiou][aeiou]* Rangement/
Q66. En utilisant ls et grep, affichez la liste des fichiers dans /bin dont le nom correspond un motif donn. R66. On peut procder de deux faons : utiliser ls seul et des jokers, ou rediriger ls dans grep et utiliser les expressions rgulires de grep. !Attention ! Dans la suite, on suppose que l'on se trouve dj dans /bin/. On met des apostrophes autour des expressions de grep pour les protger contre le shell. Enfin, on ne dtaille pas les expressions rgulires; noter ces points importants propos de grep :
o o o o o
Le chapeau (^) en dbut d'expression dsigne le dbut de la ligne; Le dollar en fin d'expression dsigne la fin de la ligne; Le point dsigne n'importe quel caractre; L'toile signifie zro ou plus de fois le caractre qui prcde; c'est un multiplicateur; Comme avec les jokers du shell, [^m] veut dire sauf le caractre m.
On constate que grep est plus complexe mais bien plus puissant que les jokers du shell. Avec ls seul Commence par a et dont la deuxime lettre est s ou t Contient un et se termine par t Contient gre ou st Contient exactement deux lettres m Contient au moins deux lettres m Contient au moins quatre caractres et aucun chiffre Est constitu de deux lettres exactement Commence et finit par un chiffre
ls a[st]* ls *un*t ls *(gre|st)*
Avec ls et grep
ls | grep '^a[st].*' ls | grep '.*un.*t$' ls | grep '\(gre\|st\)' ls | grep '[^m]*m[^m]*m[^m]*' ls | grep '.*m.*m.*' ls | grep '^[^0-9]\{4,\}$'
ls ??
ls | grep '^..$'
Page :
25
Q67. Comment liminer les lignes vides dans un fichier ? Comment liminer les lignes ne contenant que des blancs ? Comment liminer toutes les lignes blanches ? R67. Une ligne vide est diffrente d'une ligne ne contenant que des blancs, c'est--dire des espaces ou des tabulations, mme si pour un oeil humain cela revient au mme. La commande de recherche sera diffrente selon le cas :
o
Lignes vides : c'est rien entre le dbut et la fin de la ligne; on crit donc :
grep '^$' fichier
Lignes ne contenant que des blancs : on utilise une classe de caractre prexistante : [:space:]. On crit donc :
grep '^[[:space:]]$' fichier
Pour liminer toutes les lignes blanches pour un oeil humain, on combine les deux expressions et on utilise l'option -v qui inverse le sens de la recherche. On n'a plus qu' rediriger la sortie dans un fichier. On crit donc :
grep -v '\(^[[:space:]]$\|^$\)' fichier1 > fichier2
en remplaant ventuellement le motif par '^$' ou ^[[:space:]]$' selon que l'on veut ter les lignes vides ou les lignes contenant des blancs.
head et tail
Q70. Affichez les 15 premires lignes du fichier /etc/hosts, les 15 dernires lignes, toutes les lignes partir de la quinzime, les lignes 15 20. R70. propos du fichier /etc/hosts : les ordinateurs sur l'Internet sont dsigns par une adresse IP, constitue de 4 nombres entre 0 et 255 spars par des points. C'est cette adresse IP qui permet un ordinateur d'envoyer un message (datagramme IP) un autre. Cependant, mmoriser les adresses IP n'est pas commode pour un humain. Pour cette raison, les ordinateurs ont aussi un nom, constitu d'un nombre variable de composantes spares par des points (par exemple, S9.ISTAG.AC.MA). Le mcanisme de conversion d'un nom en adresse IP (ou le mcanisme inverse) s'appelle la rsolution de noms. Elle se fait normalement par l'intermdiaire de nameservers, ordinateurs sur lequel tourne le programme BIND, qui se chargent de rpondre aux questions de rsolution de noms. Cependant, pour certaines machines trs communment accdes depuis un ordinateur donn (par exemple, les machines de la mme salle) ou bien pour viter d'avoir configurer un nameserver, on prfre parfois utiliser le fichier /etc/hosts : celui-ci dfinit un certain nombre de conversions nom -> adresse IP qui seront consultes avant les nameservers. La bibliothque qui se charge de faire la traduction, et qui consulte d'abord le /etc/hosts puis les nameservers, s'appelle la libresolv. FILALI MOULAY RACHID Page : 26
Q71. Rcuprer les lignes 5 9 d'un fichier de 12 lignes R71. Il y a deux solutions : Prendre les neuf premires lignes, et n'en garder que les cinq dernires (de 5 9 inclus) :
head -9 fichier | tail -5
Prendre les 8 dernires lignes (de 5 12 inclus) et n'en garder que les 5 premires :
tail -8 fichier | head -5
Q72. Comment afficher la cinquime ligne d'un fichier ? R72. On utilise la commande head pour extraire les cinq premires lignes du fichier, puis la commande tail pour ne conserver que la dernire des cinq :
head -5 fichier | tail -1
Filtres et redirections
Q73. Crez un fichier dont chaque ligne commence par un chiffre, suivi d'un slash (/), puis d'un ou plusieurs mots. R73. C'est la commande sort qui permet de trier des fichiers selon un ordre donn. ./TRI1A ./TRI1B ./TRI1C ./TRI1D ./TRI1E FILALI MOULAY RACHID Page : 27
Q74. Affichez les lignes de ce fichier tries en ordre croissant, suivant le nombre plac en dbut de ligne sans option trie automatiquement en fonction du premier caractre, par ordre alphabtique si c'est une lettre, par ordre croissant si ce sont des chiffres. Il suffit donc de taper :
R74. sort sort fichier
Q75. liminez de chaque ligne le chiffre et le caractre / . R75. Pour cela, sans utiliser d'diteur, on peut utiliser la commande cut, qui limine des champs dans une ligne. Par dfaut, le sparateur de champs est une tabulation. Ici, on peut demander cut de considrer le slash comme un sparateur de champs (option -d, dlimiteur), et de ne conserver que le deuxime champ du fichier (option -f, field). On redirige ensuite la sortie dans un autre fichier :
cut -d/ -f2 fichier > fichier2
Q76. Triez ces lignes par ordre alphabtique inverse. R76. C'est l'option -r (reverse) de sort qui inverse le rsultat de la comparaison. Par dfaut, sort trie par ordre alphabtique, il suffit donc de taper :
sort -r fichier2
Q77. Combien de fichiers de configuration avez-vous ? R77. La rponse n'est pas simple, car vous avez galement des rpertoires de configuration, comme .netscape/ qui contient entre autres vos marque-pages (bookmarks.html), vos prfrences (preferences), etc. On va compter le nombre de fichiers commenant par un point situs dans votre rpertoire principal, en liminant les copies de sauvegarde (qui finissent par un tilde). Il y a plusieurs manires de procder. A/ ls, grep, tr, cut On peut penser une solution complexe et bien lourde utilisant toutes ces commandes, ce qui permet de les apprendre plus qu'autre chose... On affiche une liste longue avec l'ensemble des fichiers (ls -la) puis qui limine tous les rpertoires et les liens avec grep en ne gardant que les lignes qui commencent par un tiret :
ls -al | grep '^-'
Ensuite, on utilise tr pour ne conserver qu'un seul espace entre chaque champ de la liste, en utilisant l'option -s (squeeze) qui remplace par une seule occurence la rptition d'un caractre spcifi; on met des apostrophes autour de l'espace pour qu'il soit compris comme tel et non comme un simple espace :
tr -s ' '
Page :
28
On utilise cut pour conserver le dernier champ avec les noms de fichiers (en l'occurence le neuvime champ), en indiquant que l'espace sert de dlimiteur de champ :
cut -d' ' -f9
Enfin, on demande grep de ne retenir que les fichiers commenant par un point, et ne finissant pas par un tilde, et on les comptel'option -c de grep. Cela donne pour finir :
ls -al | grep '^-' | tr -s ' ' | cut -d' ' -f 9 | grep -c '^\..*[^~]$'
Mais que de tourments pour si peu... :-) B/ ls et grep Il y a plus simple... On demande ls une liste des fichiers commenant par un point (avec l'option -d pour ne pas descendre dans les rpertoires de configuration), on ne garde que les lignes ne finissant pas par un / ou un tilde, et on compte :
ls -ad .* | grep -vc '\(~\|/\)$'
C/
find On demande find de chercher dans le rpertoire courant (.), sans descendre dans l'arborescence (-maxdepth 1), tous les fichiers normaux (-type f : file), dont le nom commence par un point (-name '.*'). On les compte ensuite avec wc :
find . -maxdepth 1 -name '.*' -type f | wc -l
Cette solution est prfrable car elle ne lance que deux processus et non pas au moins cinq comme la prcdente. Q78. Combien de rpertoires de configuration avez-vous ? R78. Il y a deux solutions, l'une faisant appel ls et grep, l'autre faisant appel find. 1. ls et grep Le principe est le mme que dans l'exercice prcdent. La diffrence est que grep va chercher les lignes qui commencent par un point et finissent par un slash. Cela se fait de la manire suivante :
grep '^\..*/$' .*
signifie n'importe quel caractre (point) rpt zro ou plusieurs fois (toile). On tape donc :
Page :
29
On part ici du principe que vous avez un alias de ls sur ls -F (qui met un slash aprs les noms de rpertoires, une toile aprs les noms d'excutables et une arobase aprs les noms de liens). Si ce n'est pas le cas, ajoutez-le dans un fichier .alias ou tapez ls -lF. 2. find On demande find de chercher tous les fichiers de type rpertoire (-type : directory), et dont le nom commence par un point (-name '.*', les quotes servant protger du shell le contenu de l'expression), dans descendre dans l'arborescence.
d
On tape donc :
find . -maxdepth 1 type d -name '.*' | wc -l
Il y a une inexactitude dans le rsultat : find compte aussi ./ dans le rsultat. Q79. Comment mettre dans un fichier la liste de tous les fichiers de l'arborescence partir du rpertoire courant ? R79. C'est l'option -R de ls qui permet d'afficher rcursivement le contenu d'un rpertoire et de ses sous-rpertoires ( ne pas confondre avec -r qui inverse le tri). Pour rediriger la sortie d'une commande dans un fichier, on utilise le caractre >. Pour mettre la liste de tous les fichiers de l'arborescence dans un fichier toto, il faut donc taper :
ls -R > toto
Q80. Crez un fichier liste contenant la liste de tous vos fichiers, avec leur taille, leurs droits, etc R80. Il va s'agir de faire une liste rcursive de l'ensemble de votre compte (option -R de ls), incluant les fichiers de configuration (option -a) et les renseignements donns par l'option -l. De la longue liste obtenue, on ne veut retenir que les fichiers, dont les droits commencent par un tiret (un d identifie les rpertoires). On va donc demander grep de chercher toutes les lignes commenant par un tiret. Enfin, on va placer le rsultat dans un fichier appel liste. On tape donc :
ls -alR | grep '^-' > liste
Q81. Comment afficher uniquement les fichiers du rpertoire courant qui sont des liens symboliques ? R81. L'option -l de ls donne une liste longue des fichiers, incluant les droits et le type des fichiers, identifis par une lettre : rien pour un fichier, d pour un rpertoire (directory), l pour un lien (link); par exemple :
drwxr-xr-x 2 emilia users 1024 mai 10 02:27 www/
Page :
30
Pour obtenir la liste des fichiers du rpertoire courant qui sont des liens symboliques, il suffit donc d'afficher cette liste longue et de ne retenir que les lignes qui commencent par un l, grce la commande grep. On utilise une expression rgulire pour cela : le chapeau (^) dsigne le dbut de la ligne, et l'ensemble de l'expression est place entre apostrophes pour qu'elle ne soit pas interprte par le shell. On tape donc :
ls -l | grep '^l'
Q82. Combien de lignes contiennent le mot file dans la page de man de less ? R82. Il faut lancer le man de less, et ensuite chercher dedans le nombre de lignes contenant le mot file (fichier en anglais), avec grep. C'est l'option -c (count) de grep qui va servir. Finalement, on crit :
man less | grep -c file
Et on obtient 205. C'est le nombre de lignes contenant au moins une fois la chane de caractres file, mais pas le nombre d'occurences du mot dans le fichier : il pourrait y avoir plusieurs fois file sur la mme ligne. On atteint l encore la limite de ce que sait faire grep. Q83. Quels sont les dix plus gros fichiers de /usr/bin/ ? R83. Il faut d'abord faire une liste des fichiers avec leurs tailles (option -l de ls. Ensuite, il faut trier ces lignes en fonction de la taille, avec la commande sort. Une ligne est de la forme suivante :
-rwxr-xr-x 1 root staff 5872 Jan 21 1994 /usr/bin/rm*
C'est le cinquime champ, celui de la taille, qui nous intresse. La numrotation commenant 0 (comme les tages), pour indiquer le cinquime champ on crit +4. Ensuite, on veut que le tri se fasse selon un critre numrique (option -n) et l'envers, en commenant par les plus grandes valeurs (option -r, reverse). Pour finir, on veut les dix premires lignes du rsultat. On les slectionne avec la commande head; par dfaut, elle prend les dix premires lignes d'un fichier, il n'est donc pas ncessaire de prciser le nombre de lignes voulues. Finalement, on crit :
ls -l /usr/bin | sort -nr +4 | head
Le cinquime caractre; Les caractres 5 10, et le treizime; Tous les caractres partir du quinzime.
R84. Une manire de rsoudre cet exercice consiste utiliser le programme sed qui sert manipuler du texte.
Page :
31
o regexp est une expression rgulire et remplacement une chane devant la remplacer.
o o
Le "^.\{4\}" du dbut sert filtrer les 4 premiers caractres de chaque ligne. Ensuite, \(.\) filtre n'importe quel caractre, le fait de mettre des parenthses enregistre le caractre en question dans une variable que l'on peut utiliser dans la chane de remplacement avec "\1". Ensuite, .* filtre le reste de la ligne.
o o o o
less
On aborde ici less, qui est une version plus labore de more; ce dernier est toujours dtaill dans dans les ouvrages sur Unix, et de fait il est toujours prsent sur ces systmes, ce qui n'est pas forcment vrai pour less (qui est quand mme trs courant). more est beaucoup plus rudimentaire, alors que less a beaucoup de fonctionnalits apprciables : vido inverse pour les motifs recherchs, dplacements en avant et en arrire pour la recherche, etc. Q85. Comment fait-on pour obtenir une page d'aide avec less ? R85. On tape h ou H pour afficher une page d'aide. On s'y dplace comme dans less (flches, ^D, ^F, ^B, ^P, SPC, j, k...). Pour quitter l'aide, ce sont les mmes commandes que pour quitter less : q, Q, :q, :Q, ZZ. Q86. Comment examiner plusieurs fichiers la suite ? Comment passe-t-on au suivant ? Comment revient-on au prcdent ? R86. Il suffit de donner plusieurs fichiers en argument la commande less; par exemple, pour examiner sucessivement les fichiers toto, bla et blu, on tape :
less toto bla blu
Pour passer au fichier suivant, on tape :n (next); pour revenir au fichier prcdent, on tape :p (previous). :x permet de revenir au premier fichier spcifi. Q87. Quelles sont les commandes diffrentes qui permettent de quitter less ? R87. Ce sont : q, Q, :q, :Q, ZZ. Q88. Comment dire less d'ouvrir le fichier en plaant en haut de l'cran la ligne n ? FILALI MOULAY RACHID Page : 32
R88. On spcifie le numro de la ligne aprs le signe +; par exemple, pour ouvrir le fichier rapport sur la ligne 57, on tape :
less +57 rapport
Q89. Comment dire less d'ouvrir le fichier en plaant en haut de l'cran la premire ligne o apparat un motif donn ? R89. On utilise l'option -p de la commande less; par exemple, pour chercher le mot toto dans le fichier rapport, on tape :
less -p toto rapport
Q90. Quelles sont les deux commandes de less qui permettent de chercher un motif dans un fichier, respectivement aprs et avant la position courante ? R90. Pour chercher un motif plus en avant dans le texte, on utilise le slash (barre oblique vers la droite : /). Par exemple :
/mot
Pour chercher en arrire de la position courante, on utilise le point d'interrogation. Pour aller la prochaine occurence du mot, il suffit de taper n (next). Pour aller la prcdente occurence du mot, il faut taper N. videmment, quand on cherche un motif avec ?, n remonte dans le texte et N descend dans le texte. Une fois le dbut ou la fin du fichier atteint, la recherche s'arrte. On peut utiliser les expressions rgulires. Q91. Comment dire less de chercher le mot partir de la premire ligne du fichier, et ce o que l'on soit dans le fichier ? R91. Il faut taper ^F aprs avoir tap /. En fait, ^F fait commencer la recherche au premier fichier dont on a donn le nom; quand il n'y en a qu'un seul, cela place de fait tout au dbut du fichier. Par exemple, pour chercher toto alors qu'on se trouve la fin du fichier, on tape :
/^F
et il n'y a plus qu' taper le motif recherch. Q92. Que se passe-t-il si l'on cherche le motif suivant : toTo en donnant l'option -i less ? Quelle option faut-il mettre la place de -i pour chercher toTo tout en ignorant la casse des caractres ? FILALI MOULAY RACHID Page : 33
R92. L'option -i signifie ignorecase, c'est--dire ignorer la casse des caractres (diffrence entre majuscules et minuscules). Si donc je tape (au choix) :
less less less less less -ip TOTO rapport -ip toto rapport -i +/toto rapport -i +/TOTO rapport
ne fera pas la diffrence entre les majuscules et les minuscules, et je trouverai toto comme TOTO. Bien sr, c'est la mme chose si je lance less avec l'option -i et que je cherche ensuite le mot l'intrieur du fichier avec / ou ?. Mais l'option -i est invalide si le motif recherch contient des majuscules et des minuscules : si, en lanant less comme ci-dessus, je cherche le motif Toto, je ne trouverai que Toto et pas TOTO par exemple. Pour contourner cette restriction, il faut lancer less avec l'option -I, qui est donc un ignorecase robuste. Q93. Quelles sont les commandes qui permettent d'aller la prochaine (resp. prcdente) occurence du motif recherch travers tous les fichiers dits ? R93. Pour aller l'occurence suivante (resp. prcdente) d'un motif dans un fichier, on utilise n (resp. N). Pour faire la mme opration mais sans passer manuellement de fichier en fichier, on tape ESC n pour chercher en avant, et ESC N pour chercher en arrire. ESC dsigne bien sr la touche d'chappement (Escape). Q94. Comment chercher dans un fichier le caractre / ? Le caractre / sert chercher un mot dans le fichier. Si on tape
//
rpond : Pattern not found. Il faut donc dire less de considrer le / comme un caractre ordinaire, et pas comme un caractre spcial. Comme avec toutes les expressions rgulires, c'est le backslash (barre oblique vers la gauche : \) qui sert cela. Pour chercher un /, on tape donc :
less /\/
La page de man donne une liste de caractres qui sont spciaux avec / et ?. Ces commandes de recherche utilisent les expressions rgulires de ed (et de vi par consquent).
find
Q95. Comment chercher tous les fichiers dont les noms commenent par un a majuscule ou une minuscule, suivi d'ventuellement quelques lettres ou chiffres, et se terminent par un chiffre entre 3 et 6 ? R95. C'est l'option -name qui permet de spcifier le nom du ou des fichiers recherchs. On peut indiquer le nom d'un fichier complet (bofichier.tex), ou utiliser des expressions rgulires (celles du shell, pas celles de grep...) : FILALI MOULAY RACHID Page : 34
o o o
L'toile (*) dsigne un ou plusieurs caractres; Le point d'interrogation remplace un (et un seul) caractre quelconque; Les crochets permettent de dsigner une srie de caractres au choix.
Dans notre cas, le premier caractre est un a ou un A ([aA]), suivi de quelque chose (*) et termin par un chiffre entre 3 et 6 ([3456] ou [3-6]). On crit donc :
find . -name '[aA]*[3-6]' -print
Q96. Comment fait-on pour indiquer que le fichier recherch a t modifi il y a plus de 30 jours ? Il y a 30 jours ? Il y a moins de 30 jours? R96. C'est l'option -mtime qui permet de donner une indication en jours. La syntaxe varie selon ce que l'on souhaite :
o o o -mtime 30 : le fichier a t modifi il y a 30 jours; -mtime +30 : le fichier a t modifi il y a 30 jours -mtime -30 : le fichier a t modifi il y a 30 jours
ou plus; ou moins.
Q97. Comment faire pour dire que le fichier a t modifi plus rcemment qu'un autre fichier donn ? R97. On utilise l'option -newer (plus rcent). Par exemple, on cherche un fichier .tex modifi plus rcemment que bofichier.tex :
find . -newer bofichier.tex -name '*.tex'
On peut raffiner la demande, en combinant cette option avec l'option -mtime : cherchons les fichiers modifis plus rcemment que bofichier.tex, mais il y a plus de 5 jours :
find . -newer bofichier.tex -mtime +5 -name '*.tex'
Q98. Comment fait-on pour spcifier que le fichier recherch est un rpertoire ? R98. On utilise l'option -type pour spcifier le genre de fichier recherch : les principaux sont f (file) pour un fichier normal, et d (directory) pour un rpertoire. On tape donc :
find . -type d
Q99. Comment indiquer que le fichier recherch une taille suprieure une taille donne ? R99. On utilise l'option -size, suivie d'un nombre et d'une lettre indiquant l'unit de mesure (c : octets, k : kilo-octets). Comme pour -mtime, on utilise +, - ou [rien] pour indiquer que la taille est, respectivement, suprieure, infrieure ou gale la valeur donne. Par exemple, on recherche un fichier modifi il y a moins de 12 jours et dont la taille soit suprieure 30 K :
find . -type f -size +30k -mtime -12 -print
Page :
35
Il y a deux faons de faire excuter des commandes sur les fichiers trouvs par find : utiliser l'option -exec commande, ou utiliser un pipe avec xargs. 1. -execcommande excute la commande sur le fichier courant. La commande est termine par le marqueur ;, qu'il faut protger du shell avec un backslash. Le fichier courant est dsign par la chane {}. Pour effacer tous les fichiers de sauvegarde vieux de plus d'un mois, on tape donc :
find . -mtime +30 -name '*~' -print -exec rm \;
On peut faire excuter la commande de faon interactive en remplaant -exec par -ok :
find . -mtime +30 -name '*~' -print -ok rm \;
Le programme demande, pour chaque fichier trouv, si on veut bien excuter la commande; la rponse doit tre y ou Y . 2. La solution avec -exec est en fait trs lourde, car elle cre un nouveau processus pour chaque fichier; il vaut mieux rediriger le rsultat de find avec un pipe et xargs. Dans notre cas, on tapera donc :
3. find . mtime +30 -name '*~' | xargs -p rm
L'option -p de xargs rend cette commande interactive. Il faut rpondre y ou Y pour confirmer. Q101. Quelle diffrence y a-t-il entre un simple pipe et | xargs ? Pour la comprendre, voici un exercice : cherchez tous les fichiers contenus dans /usr/local/lib/texmf/tex et cherchez dedans le mot supertab. R101. Il y a deux solutions : 1. Vous tapez
find /usr/local/lib/texmf/tex -type f | grep supertab
Vous obtenez une liste de fichiers contenant supertab dans leur nom. 2. Vous tapez FILALI MOULAY RACHID Page : 36
cherche dans chaque fichier pass en argument la chane de caractres supertab, ce qui est trs diffrent...
grep
grep
Q102. Quelles sont les options de grep qui permettent d'obtenir des lignes de contexte (qui prcdent et/ou suivent la ligne o figure le mot) ? R102. Il y en a plusieurs, qui se recoupent :
o -num
: le numro indique le nombre de lignes de contexte que l'on veut voir figurer avant et aprs la ligne o figure le mot recherch. Par exemple, si on veut trois lignes de contexte, avant et aprs la mot (soit sept lignes au total), on tape :
o o o o o o o o o
indique le nombre de lignes qui doivent suivre la ligne o figure le mot. Si on en veut quatre, on tapera :
indique le nombre de lignes qui doivent prcder la ligne o figure le mot. Si on en veut dix, on tape :
grep -B 10 ... -C (context), qui donne deux lignes de contexte avant et aprs. En fait, les trois lignes suivantes sont strictement quivalentes : grep -2 ... grep -C ... grep -A 2 -B 2 ...
Q103. Comment faire apparatre le numro de la ligne o figure le mot recherch ? R103. C'est l'option -n (number) qui sert cela; le numro figure tout au dbut de la ligne, suivi d'un deux-points (:) et du texte. Par exemple :
Rachid ~ $ grep -n violon verlaine.tex 12:des violons de l'automne
Q104. Quand on fait une recherche dans plusieurs fichiers, le nom du fichier figure d'abord, puis le numro de la ligne, et enfin le texte, le tout spar par des deux-points. Par exemple :
Rachid ~ $ grep -n violon * verlaine.tex:12:des violons de l'automne orchestre:45:Cordes : contrebasse, violoncelle, alto, violons.
Que se passe-t-il quand on demande galement des lignes de contexte ? R104. La disposition gnrale ne change pas, par contre, le signe utilis pour sparer la ligne de son numro est un tiret (-) quand il s'agit des lignes de contexte, et un deux-points quand il s'agit de la ligne voulue. Par exemple :
Rachid ~ $" grep -nC violon verlaine.tex 10-
Page :
37
11-Les sanglots longs 12:des violons de l'automne 13-bercent mon coeur 14-d'une langueur monotone
Q105. Comment faire pour afficher le nombre d'occurences du mot recherch ? R105. On utilise l'option -c (count) :
Rachid ~ $ grep -c violon * verlaine.tex:1 orchestre:1
Q106. Comment faire pour que grep ignore la casse des caractres (diffrence entre majuscules et minuscules) dans sa recherche ? R106. Par dfaut, grep fait la diffrence entre les majuscules et les minuscules; pour invalider ce comportement, on utilise l'option -i (ignorecase). Q107. Comment faire pour faire apparatre non pas les lignes o figurent le mot, mais les noms des fichiers ? R107. C'est l'option -l qui permet de faire cela : afficher les noms des fichiers o figure au moins une fois la chane de caractres recherche. Q108. Comment faire apparatre les lignes o ne figurent pas le mot recherch ? R108. On veut en fait inverser le sens de la recherche : c'est l'option -v qui fait cela. Q109. Comment faire apparatre les noms des fichiers ne contenant pas le mot recherch ? R109. On utilise l'option -L, qui affiche les noms de fichiers o ne figurent pas la chane de caractres recherche. Il ne faut bien sr pas confondre les options -l et -L... Q110. Comment faire pour que grep ne recherche que les lignes o figure le mot tel quel, et non pas ses variantes ? R110. C'est l'option -w (comme word) qui sert cela : un mot complet est dlimit comme suit :
o o
Dbut : la chane de caractres est place au dbut d'une ligne, ou prcde d'un blanc, d'une tabulation ou d'une ponctuation. Fin : la chane de caractre est place en fin de ligne, ou suivie d'un blanc, d'une tabulation ou d'une ponctuation.
Q111. Comment faire pour chercher plusieurs mots la fois en faisant apparatre les numros des lignes ? FILALI MOULAY RACHID Page : 38
R111. On veut chercher toutes les occurences des mots terre et ciel dans les deux premiers chapitres de la premire partie de Germinal, avec les numros des lignes. On propose deux solutions, la premire utilisant les ressources de la syntaxe de grep, la seconde utilisant l'option -f avec un fichier. Syntaxe de grep : La structure \(mot1\|mot2\) permet de chercher plusieurs mots. Ici, on tape la ligne suivante :
grep '\(ciel\|terre\)' fichier
On met des apostrophes de part et d'autre de l'expression pour la protger contre le shell, c'est-dire pour que le shell ne cherche pas interprter l'expression. Option -f fichier : dans un fichier quelconque, que nous appellerons liste, on indique les mots que l'on recherche : ciel et terre. Chaque ligne correspond un mot recherch. Il ne faut donc pas mettre de ligne comme
terre ciel
Car le programme chercherait la chane de caractres terre ciel, qui est assez improbable en franais. Il ne faut pas non plus laisser de ligne blanche : le programme afficherait l'ensemble du texte. Quelle que soit la solution retenue, on veut ensuite afficher le numro des lignes (option -n); d'autre part, pour que la recherche soit exhaustive, il vaut mieux que grep ne fasse pas de diffrence entre les majuscules et les minuscules, avec l'option -i (ignore case, ignorer la casse des caractres). Il faut aussi dcider si on cherche les mots tels quels, sans leurs variantes (comme terre au pluriel), ou si on accepte ces variantes. Si on ne veut que le mot sans ses drivs, on utilise l'option -w. Pour dsigner les deux fichiers o faire la recherche, on peut les crire littralement :
zola1.txt zola2.txt
Et on obtient :
zola1.txt:13:ciel, le pav se droulait avec la rectitude d'une jete, au milieu de
Page :
39
zola1.txt:36:brlaient si haut dans le ciel mort, pareils des lunes fumeuses. Mais, au zola1.txt:50:besogne. Les ouvriers de la coupe terre avaient d travailler tar d, on zola1.txt:124:terre, lorsqu'un accs de toux annona le retour du charretier. Le ntement, zola1.txt:191:bleues en plein ciel, comme des torches gantes. C'tait d'une tristesse zola1.txt:207: Le manoeuvre, aprs avoir vid les berlines, s'tait assis terre, zola1.txt:222:fois avec tout le poil roussi, une autre avec de la terre jusque dans le (...)
recherche des chanes de caractres, qui peuvent tre un mot complet (terre), une suite de lettres (tre), ou une expression rgulire. Les expressions rgulires sont des formules qui reprsentent des chanes de caractres. On cherche alors non pas un mot prcis, mais des suites de caractres correspondant aux critres demands. Elles sont d'un usage frquent avec grep bien sr, mais aussi avec des commandes comme less, ou encore au sein d'un diteur.
Q112. Chercher toutes les lignes commenant par a ou A. R112. Il faut indiquer que l'on veut le dbut de la ligne, avec le chapeau (caret en anglais). Ensuite, on veut prciser que la ligne commence par un a minuscule ou majuscule. Il y a deux faons de le faire :
o o
Utiliser l'option -i qui fait ignorer la diffrence entre les majuscules et le minuscules. Dire que l'on cherche un a ou un A. C'est cela que servent les crochets : [abc] signifie a ou b ou c. Ici, ce sera [aA].
Enfin, il faut protger les signes contre le shell, pour qu'il ne les interprte pas; on met donc l'expression entre apostrophes. Remarque : la protection des expressions rgulires contre le shell est une question complexe.... Il faut donc crire :
grep -i '^a' fichier
ou
grep '^[aA]' fichier
Page :
40
Q113. Chercher toutes les lignes finissant par rs R113. C'est le dollar ($) qui reprsente la fin de la ligne. Il faut donc crire :
grep 'rs$' fichier
Q114. Chercher toutes les lignes contenant au moins un chiffre R114. Pour dsigner un chiffre, on peut en indiquer une liste entre crochets : [0123456789]. Il est plus simple d'utiliser une classe de caractres : [0-9] qui dsigne, comme la solution prcdente, n'importe quel chiffre de zro neuf. Il faut donc taper :
grep '[0-9]' fichier
Q115. Chercher toutes les lignes commenant par une majuscule R115. Comme on l'a vu, c'est le chapeau qui indique le dbut de la ligne. Pour indiquer que l'on cherche une majuscule, on peut soit en donner une liste ([ABCDEFGHIJKLMNOPQRSTUVWXYZ]), soit utiliser une classe de caractres : [A-Z], la seconde solution tant, de loin, prfrable... Il faut donc taper :
grep '^[A-Z]' fichier
Q116. Chercher toutes les lignes commenant par B, E ou Q R116. Il faut indiquer entre crochets les trois lettres recherches :
grep '^[BEQ]' fichier
Q117. Chercher toutes les lignes finissant par un point d'exclamation R117. Le point d'exclamation n'a pas de signification particulire avec grep, on peut donc le mettre tel quel :
grep '!$' fichier
Q118. Chercher toutes les lignes ne finissant pas par un signe de ponctuation (point, virgule, point-virgule, deux-points, point d'interrogation, point d'exclamation) R118. Il faut donner une liste de caractres, que l'on ne veut pas voir figurer; la liste sera entre crochets, comme on l'a dj vu, et c'est le chapeau qui signifiera, dans ce contexte, sauf. Par exemple, si on cherche tous les a, sauf ceux suivi de b, c ou t, on crit :
grep 'a[^bct]'
Il y a une seconde difficult, qui vient de ce que certains caractres sont spciaux avec grep. Vous vous doutez que le chapeau est spcial quand il est plac au dbut de l'expression, et que le dollar l'est quand il est plac en fin d'expression. Dans notre cas : FILALI MOULAY RACHID Page : 41
o o
Le point dsigne n'importe quel caractre. Le point d'interrogation signifie le caractre qui prcde apparat 0 ou 1 fois. Avec egrep, il fonctionne tout seul, avec grep, il faut le faire prcder d'un backslash pour qu'il fonctionne; par exemple (avec grep), pour chercher charbon ou vagabond, on crit :
grep 'ar?bo' fichier
(chercher la suite de lettre abo avec un r facultatif entre le a et le b). Pour que grep interprte littralement ces caractres, et ne les considre plus comme spciaux, il faut les faire prcder d'un backslash (\). Si par exemple vous cherchez toutes les lignes qui se terminent par un point, il faut taper :
grep '\.$' fichier
Dans notre cas cependant, ces caractres sont protgs par les crochets. On peut donc crire :
grep '[^.,;:?!]$' fichier
On peut aussi utiliser l'option -v, qui prend toutes les lignes o ne figure pas une chane de caractres donne; dans ce cas, on tape :
grep -v '[.,;:?!]$' fichier
Q119. Comment chercher tous les mots contenant un r prcd de n'importe quelle lettre majuscule ou minuscule ? R119. On cherche une chane de caractres qui soit indiffremment au dbut ou au milieu d'un mot. N'importe quelle lettre, ce sont les classes de caractres [a-zA-Z] ou [:alpha:], qui sont quivalentes. Il y a une petite subtilit avec l'emploi de classes du second type; elles dsignent un groupe de caractres, et il faut mettre une seconde paire de crochets pour dire n'importe quel caractre de cette classe prdfinie. On tape donc au choix :
grep '[a-zA-Z]r' fichier'
ou
grep '[[:alpha:]]r' fichier'
Attention, dans ces listes ne sont pas compris les caractres accentus... Q120. Chercher tous les mots dont la seconde lettre est un r. R120. C'est le symbole \< qui dsigne un dbut de mot. La premire lettre du mot est indiffrente, la seconde est un r. On crit donc :
grep '\<.r' fichier
Page :
42
Il y a cependant un problme avec les caractres accentus, que grep considre comme des blancs. Dans ce cas, il vaut mieux procder autrement : un mot est prcd d'un dbut de ligne, ou d'un blanc ou d'une tabulation. Un dbut de ligne, c'est le chapeau, un blanc ou une tabulation, c'est la classe de caractres [:space:]. On va se servir du pipe (|) qui signifie ou. Avec grep, il faut backslasher le pipe, avec egrep ce n'est pas ncessaire. On crit donc (avec grep) :
grep '^.r|[[:space:]].r' fichier
Ce n'est quand mme pas si simple; les mots peuvent tre prcds d'un tiret (mots composs), d'une apostrophe, de guillemets divers (``, ", , <<), et, si l'auteur du texte n'est pas respectueux des rgles de typographie, d'une ponctuation. Il y a donc bien des cas envisager...
Divers
Q121. Comment conserver les informations concernant le disque dans un fichier ? R121. C'est la commande df qui donne des informations sur le disque et sur les partitions montes. Pour rediriger la sortie d'une commande dans un fichier, on utilise l'oprateur de redirection > suivi du nom du fichier. Dans notre cas, pour conserver les informations dans un fichier appel disque, on crira :
df > disque
Q122. Comment connatre la dernire date de connexion au systme d'un utilisateur de login Bob ? R122. C'est la commande finger qui donne des renseignements sur les utilisateurs. Si on tape
finger Bob
les renseignements concernant l'utilisateur s'affichent. On y trouve la date de son dernier login sur la machine o vous tes, ainsi que la date de la dernire fois o il a lu son courrier (mais ce condition qu'il ait reu du courrier depuis...). Q123. Affichez le type des fichiers /etc/passwd, /usr/include/stdio.h, /bin/ls et de votre rpertoire de travail. R123. C'est la commande file qui permet d'afficher le type des fichiers. Dans notre cas, il suffit d'crire:
Rachid ~ $ file /etc/passwd /usr/include/stdio.h /bin/ls . /etc/passwd: ASCII text /usr/include/stdio.h: C program text /bin/ls: ELF 32-bit MSB executable, SPARC, version 1, stripped .: directory Rachid ~ $
Page :
43
Un script est un fichier de type texte regroupant des commandes shell et excutable par l'interprteur bash, cest--dire par le programme /bin/bash. Pour le spcifier, trs souvent la premire ligne de commentaire dun script est #!/bin/bash Nous allons commencer par crire un premier script bash tout simple. Il ne sera pas rvolutionnaire, mais il va nous permettre de voir les bases de la cration d'un script et comment celui-ci s'excute. Cela vous sera donc essentiel pour la suite.
1) Cration du fichier
Commenons par crer un nouveau fichier pour notre script. Le plus simple est d'ouvrir vi en lui donnant le nom du nouveau fichier crer :
$ vi essai.sh
Page :
44
Si essai.sh n'existe pas, il sera cr (ce qui sera le cas ici). J'ai donn ici l'extension ".sh" mon fichier. On le fait souvent par convention pour indiquer que c'est un script shell, mais ce n'est pas une obligation. Certains scripts shell n'ont d'ailleurs pas d'extension du tout (j'aurais pu appeler mon script "essai" tout court donc).
#!/bin/bash
Le #! est appel le sha-bang. /bin/bash peut tre remplac par /bin/sh si vous souhaitez coder pour sh, /bin/ksh pour ksh, etc. Bien que non indispensable, cette ligne permet de s'assurer que le script est bien excut avec le bon shell. En l'absence de cette ligne, c'est le shell de l'utilisateur qui sera charg. Cela pose un problme : si votre script est crit pour bash et que la personne qui l'excute utilise ksh, il y a de fortes chances que le script ne fonctionne pas correctement ! La ligne du sha-bang permet donc de "charger" le bon shell avant l'excution du script. Vous devrez la mettre au tout dbut de chacun de vos scripts partir de maintenant.
3) Excution de commandes
Aprs le sha-bang, nous pouvons commencer coder. Le principe est trs simple : il vous suffit d'crire les commandes que vous souhaitez excuter. Ce sont les mmes que celles que vous tapiez dans l'invite de commandes !
ls : pour lister les fichiers du rpertoire cd : pour changer de rpertoire mkdir : pour crer un rpertoire grep : pour rechercher un mot sort : pour trier des mots etc. Page : 45
Exemple : #!/bin/bash # script bonjour # il affiche un salut l'utilisateur qui a lanc ce script # la variable d'environnement $USER contient le nom de login echo ---- Bonjour $USER ----# l'option -n empeche le passage la ligne # le ; sert de sparateur entre deux commandes echo -n "Nous sommes le " ; date # recherche de $USER en dbut de ligne dans le fichier passwd # puis extraction de l'uid au 3me champ, et affichage echo "Ton numro d'utilisateur est" `grep $USER /etc/passwd | cut -f 3 -d:`
4) Les commentaires
Notez que vous pouvez aussi ajouter des commentaires dans votre script. Les commentaires sont des lignes qui ne seront pas excutes mais qui permettent d'expliquer ce que fait votre script. Tous les commentaires commencent par un #. Par exemple :
1 #!/bin/bash 2 3 # Affichage de la liste des fichiers 4 Ls
RQ !! : La ligne du sha-bang commence aussi par un #... C'est un commentaire ? Oui, c'est un commentaire aussi, mais considrez que c'est un commentaire "spcial" !! .
2) Excution du script
Le script s'excute maintenant comme n'importe quel programme, en tapant "./" devant le nom FILALI MOULAY RACHID Page : 46
du script :
$ ./essai.sh
Vous pouvez modifier votre script pour qu'il vous donne auparavant aussi le nom du rpertoire dans lequel vous vous trouvez :
1 #!/bin/bash 2 3 pwd 4 ls
3) Excution de dbuggage
Vous ferez probablement de gros scripts et vous risquez de rencontrer des bugs. Il faut donc ds prsent que vous sachiez comment dbugger un script. Il faut l'excuter comme ceci :
$ bash -x essai.sh
On appelle en fait directement le programme bash et on lui ajoute en paramtre un -x (pour lancer le mode dbuggage) et le nom de notre script dbugger. Le shell affiche alors le dtail de l'excution de votre script, ce qui peut vous aider retrouver la cause de vos erreurs :
Page :
47
$ essai.sh
III)
1) variables
Nous allons crer un nouveau script que nous appellerons variables.sh :
$ vim variables.sh
La premire ligne de tous nos scripts doit indiquer quel shell est utilis, comme nous l'avons appris tout l'heure. Commencez donc par crire :
1 #!/bin/bash
Cela indique que nous allons programmer en bash. Maintenant, dfinissons une variable. Toute variable a un nom et une valeur :
1 message='Bonjour tout le monde'
La variable a pour nom message ... et pour valeur 'Bonjour tout le monde'
RQ !!: Ne mettez pas d'espaces autour du symbole gal "=" ! Si vous voulez insrer une apostrophe dans la valeur de la variable, il faut la faire prcder d'un antislash \. En effet, comme les apostrophes servent dlimiter le contenu, on est oblig d'utiliser un caractre dchappement pour pouvoir vraiment insrer une apostrophe :
1 message='Bonjour c\'est moi'
Page :
48
En fait, la commande echo affiche dans la console tous les paramtres qu'elle reoit. Ici, on a envoy 4 paramtres :
Chacun des mots tait considr comme un paramtre que echo a affich. Si vous mettez des guillemets autour de votre message, celui-ci sera considr comme un seul paramtre (le rsultat sera visuellement le mme) :
$ echo "Salut tout le monde" Salut tout le monde
Si vous voulez insrer des retours la ligne, il faudra activer le paramtre -e et utiliser le symbole \n :
$ echo -e "Message\nAutre ligne" Message Autre ligne
Comparez les lignes 3 et 4 : lorsqu'on dclare la variable la ligne 3, on ne doit pas mettre de $ devant. En revanche, lorsqu'on l'affiche la ligne 4, on doit cette fois mettre un $ ! Rsultat :
Bonjour tout le monde
Maintenant, supposons que l'on veuille afficher du texte et la variable la fois. On serait tent d'crire :
1 #!/bin/bash 2 3 message='Bonjour tout le monde' 4 echo 'Le message est : $message'
Page :
49
Pour bien comprendre ce qui se passe, intressons-nous au fonctionnement de ce qu'on appelle les "quotes".
4) Les quotes
Il est possible d'utiliser des quotes pour dlimiter un paramtre qui contient des espaces. Il existe 3 types de quotes :
Les apostrophes ' ' (simples quotes) Les guillemets " " (doubles quotes) Les accents graves ` ` (back quotes), qui s'insrent avec Alt Gr + 7 sur un clavier AZERTY franais
Selon le type de quote que vous utilisez, la raction de Bash ne sera pas la mme.
Avec des simples quotes, la variable n'est pas analyse et le $ est affich tel quel.
la variable est analyse et son contenu est affich. En fait, les doubles quotes demandent bash d'analyser le contenu du message. S'il trouve des symboles spciaux (comme des variables), il les interprte. Avec des simples quotes, le contenu tait affich tel quel. FILALI MOULAY RACHID Page : 50
La commande pwd a t excute, et son contenu a t insr dans la variable message ! On a ensuite affich le contenu de la variable.
Adaptons notre script pour qu'il nous demande notre nom et nous l'affiche :
1 #!/bin/bash 2 3 read nom 4 echo "Bonjour $nom !"
Lorsque vous lancez ce script, rien ne s'affiche, mais vous pouvez taper du texte (votre nom par exemple.
Formateur Bonjour Formateur !
Page :
51
read lit ce que vous tapez mot par mot (en considrant que les mots sont spars par des espaces. Il assigne chaque mot une variable diffrente, d'o le fait que le nom et le prnom ont t correctement assigns $nom et $prenom respectivement. Si vous rentrez plus de mots au clavier que vous n'avez prvu de variables pour en stocker, la dernire variable de la liste rcuprera tous les mots restants. En clair, si j'avais tap pour le programme prcdent " TRI-1 TRI-2 TRI-3", la variable $prenom aurait eu pour valeur " TRI-2 TRI-3 ".
Notez que le message 'Entrez votre nom' a t entour de quotes. Si on ne l'avait pas fait, le bash aurait considr que chaque mot tait un paramtre diffrent ! Rsultat :
Entrez votre nom : Formateur Bonjour Formateur !
Notez que le bash coupe automatiquement au bout de 5 caractres, sans que vous ayez besoin d'appuyer sur la touche Entre. Ce n'est pas trs esthtique du coup, parce que le message FILALI MOULAY RACHID Page : 52
s'affiche sur la mme ligne. Pour viter cela, vous pouvez faire un echo avec des \n comme vous avez appris le faire plus tt :
1 #!/bin/bash 2 3 read -p 'Entrez votre login (5 caractres max) : ' -n 5 nom 4 echo -e "\nBonjour $nom !"
Page :
53
Quelques exemples :
1 2 3 4 5 let let let let let "a "a "a "a "a = = = = = 5 * 3" # $a = 15 4 ** 2" # $a = 16 (4 au carr) 8 / 2" # $a = 4 10 / 3" # $a = 3 10 % 3" # $a = 1
10 / 3 = 3 car la division est entire (la commande ne renvoie pas de nombres dcimaux) 10 % 3 renvoie 1 car le reste de la division de 10 par 3 est 1. En effet, 3 "rentre" 3 fois dans 10 (a fait 9), et il reste 1 pour aller 10.
Notez qu'il est possible aussi de contracter les commandes, comme cela se fait en langage C. Ainsi :
1 let "a = a * 3"
Page :
54
SHELL : indique quel type de shell est en cours d'utilisation (sh, bash, ksh...) PATH : une liste des rpertoires qui contiennent des excutables que vous souhaitez pouvoir lancer sans indiquer leur rpertoire. On en a parl un peu plus tt. Si un programme se trouve dans un de ces dossiers, vous pourrez l'invoquer quel que soit le dossier o vous vous trouvez. EDITOR : l'diteur de texte par dfaut qui s'ouvre lorsque cela est ncessaire. HOME : la position de votre dossier home. PWD : le dossier dans lequel vous vous trouvez. OLDPWD : le dossier dans lequel vous vous trouviez auparavant.
Notez que les noms de ces variables sont, par convention, crits en majuscules. Comment utiliser ces variables dans vos scripts ? C'est trs simple, il suffit de les appeler par leur nom ! Exemple :
1 #!/bin/bash 2 3 echo "Votre diteur par dfaut est $EDITOR"
Plus rarement, vous pourriez avoir besoin de dfinir votre propre variable d'environnement. Pour cela, on utilise la commande export
Le problme, c'est que nous n'avons toujours pas vu comment rcuprer ces paramtres dans notre script. Pourtant, c'est trs simple faire ! En effet, des variables sont automatiquement cres :
$# : contient le nombre de paramtres $0 : contient le nom du script excut (ici "./variables.sh") Page : 55
$1 : contient le premier paramtre $2 : contient le second paramtre ... $9 : contient le 9me paramtre
Essayons :
1 #!/bin/bash 2 3 echo "Vous avez lanc $0, il y a $# paramtres" 4 echo "Le paramtre 1 est $1" $ ./variables.sh param1 param2 param3 Vous avez lanc ./variables.sh, il y a 3 paramtres Le paramtre 1 est param1
On peut imaginer un script qui accepte une liste de fichiers en paramtres. Rien ne nous empcherait de lui envoyer 15 paramtres dans ce cas :
./script.sh fichier1 fichier2 fichier3 fichier4 ... fichier14 fichier15
Pour traiter autant de paramtres plus que 9, on les fera en gnral un par un.. On peut "dcaler" les paramtres dans les variables $1 $2 etc. avec la commande shift.
1 2 3 4 5 #!/bin/bash echo "Le paramtre 1 est $1" shift echo "Le paramtre 1 est maintenant $1"
$ ./variables.sh param1 param2 param3 Le paramtre 1 est param1 Le paramtre 1 est maintenant param2
Comme vous le voyez, les paramtres ont t dcals : $1 correspond aprs le shift au second paramtre, $2 au troisime paramtre, etc. Bien sr, shift est gnralement utilis dans une boucle qui permet de traiter les paramtres un par un.
Page :
56
Cela cre une variable tableau qui contient 3 valeurs (valeur0, valeur1, valeur2). Pour accder une case du tableau, on doit utiliser la syntaxe suivante :
1 ${tableau[2]}
... ceci affichera le contenu de la case n2 (donc "valeur2"). Les cases sont numrotes partir de 0 ! La premire case a donc le numro 0. Notez par ailleurs que pour afficher le contenu d'une case du tableau, vous devez entourer votre variable daccolades ${tableau[2]}. Vous pouvez aussi manuellement dfinir le contenu d'une case :
1 tableau[2]='valeur2'
Rponse :
valeur1
Comme vous pouvez le constater, le tableau peut avoir autant de cases que vous le dsirez. La numrotation n'a pas besoin d'tre continue, vous pouvez sauter des cases sans problme (la preuve, il n'y a pas de case n3 ni de case n4 dans le script prcdent). Vous pouvez afficher l'ensemble du contenu du tableau d'un seul coup en utilisant ${tableau[*]} :
1 2 3 4 5 #!/bin/bash tableau=('valeur0' 'valeur1' 'valeur2') tableau[5]='valeur5' echo ${tableau[*]}
Le mot "fi" (if l'envers !) la fin indique que le if s'arrte l. Tout ce qui est entre le then et le fi sera excut uniquement si le test est vrifi. RQ !!: Vous noterez, c'est trs important, qu'il y a des espaces l'intrieur des crochets. On ne doit pas crire [test] mais [ test ] ! Il y a une autre faon d'crire le if : en plaant le then sur la mme ligne. Dans ce cas, il ne faut pas oublier de rajouter un point-virgule aprs les crochets :
1 if [ test ]; then echo "C'est vrai" 2 3 fi
A la place du mot "test", il faut indiquer votre test. C'est cet endroit que vous testerez la valeur d'une variable par exemple. Nous allons voir ici un cas simple o nous testons la valeur d'une chane de caractres, puis nous apprendrons faire des tests plus compliqus un peu plus loin. Faisons quelques tests sur un script que nous appellerons "conditions.sh" :
1 2 3 4 5 6 7 8 #!/bin/bash nom="Formateur" if [ $nom = "Formateur" ] then echo "Salut Formateur !" fi
Essayez de changer le test, si vous n'crivez pas prcisment "Formateur", le if ne sera pas excut, et donc votre script n'affichera rien. Notez aussi que vous pouvez tester 2 variables la fois dans le if :
1 #!/bin/bash
Page :
58
2 3 4 5 6 7 8 9
nom1="TRI" nom2="TRI" if [ $nom1 = $nom2 ] then echo "Salut les jumeaux !" fi
2) Sinon
Si vous souhaitez faire quelque chose de particulier quand la condition n'est pas remplie, vous pouvez rajouter un "else" qui signifie "sinon". Algo: SI test_de_variable ALORS ------> effectuer_une_action SINON ------> effectuer_une_autre_action FIN SI La syntaxe en bash est la suivante :
1 2 3 4 5 6 if [ test ] then echo "C'est vrai" else echo "C'est faux" fi
Bon, comme la variable vaut toujours la mme chose, le else ne sera jamais excut, je vous propose plutt de vous baser sur le premier paramtre ($1) envoy au script :
1 #!/bin/bash 2 3 if [ $1 = "Formateur" ] 4 then 5 echo "Salut Formateur !"
Page :
59
6 else 7 8 fi
Notez que le script plante si vous oubliez de l'appeler avec un paramtre. Pour bien faire, il faudrait d'abord vrifier dans un if s'il y a au moins un paramtre. Nous apprendrons faire cela plus loin.
3) Sinon si
Il existe aussi le mot-cl "elif", abrviation de "else if", qui signifie "sinon si". Sa forme ressemble cela : Algo : SI test_de_variable ALORS ------> effectuer_une_action SINON SI autre_test ALORS ------> effectuer_une_action SINON SI encore_un_autre_test ALORS ------> effectuer_une_action SINON ------> effectuer_une_action FIN SI On peut mettre autant de "sinon si" qu'on veut. L j'en ai mis deux. En revanche, on ne peut mettre qu'un seul "sinon", qui sera excut la fin si aucune des conditions prcdentes n'est vrifie. Bash va d'abord analyser le premier test. S'il est vrifi, il effectuera la premire action indique, sinon il ira au premier sinon si, au second, etc., jusqu' trouver une condition qui soit vrifie. Si aucune condition n'est vrifie, c'est le "sinon" qui sera lu. Bien, voyons comment cela s'crit en bash :
1 if [ test ] 2 then 3 echo "Le premier test a t vrifi"
Page :
60
4 5 6 7 8 9 10 11 12
elif [ autre_test ] then echo "Le second test a t vrifi" elif [ encore_autre_test ] then echo "Le troisime test a t vrifi" else echo "Aucun des tests prcdents n'a t vrifi" fi
On peut reprendre notre script prcdent et l'adapter pour utiliser des elif :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/bin/bash if [ $1 = "TRI1" ] then echo "Salut TRI1 !" elif [ $1 = "TRI2" ] then echo "Bien le bonjour TRI2" elif [ $1 = "TRI3" ] then echo "Salut TRI3, a va ?" else echo "Je te connais pas !" fi
Vous pouvez tester ce script, encore une fois n'oubliez pas d'envoyer un paramtre sinon il plantera, ce qui est normal.
X) Les tests
Voyons maintenant un peu quels tests on peut faire. Pour l'instant on a juste test si 2 chanes de caractres taient identiques, mais on peut faire beaucoup plus de choses que a !
Tests sur des chanes de caractres Tests sur des nombres Tests sur des fichiers
Signification Il est aussi possible d'crire 2 "==" pour les habitus du langage C. Teste si les 2 chanes sont diffrentes Teste si la chane est vide Teste si la chane est non vide
$ ./conditions.sh TRI1 TRI2 Les 2 paramtres sont diffrents ! $ ./conditions.sh TRI1 TRI1 Les 2 paramtres sont identiques !
On peut aussi tester si le paramtre existe avec -z (teste si la chane est vide). En effet, si une variable n'est pas dfinie, elle est considre comme vide par bash. On peut donc par exemple s'assurer que $1 existe comme ceci :
1 2 3 4 5 6 7 8 #!/bin/bash if [ -z $1 ] then echo "Pas de paramtre" else echo "Paramtre prsent" fi
Condition
$num1 -ne $num2 $num1 -lt $num2 $num1 -le $num2 $num1 -gt $num2 $num1 -ge $num2
Signification "=" qui, lui, compare 2 chanes de caractres. Test si les nombres sont diffrents (non equal). Encore une fois, ne confondez pas avec "!=" qui est cens tre utilis sur des chanes de caractres. Teste si num1 est infrieur ( < ) num2 (lower than) Teste si num1 est infrieur ou gal ( <= ) num2 (lower or equal) Teste si num1 est suprieur ( > ) num2 (greater than) Teste si num1 est suprieur ou gal ( >= ) num2 (greater or equal)
$ ./conditions.sh 23 Vous avez envoy 20 ou plus $ ./conditions.sh 11 Vous avez envoy moins de 20
Page :
63
Je vous propose de faire un script qui demande l'utilisateur de rentrer le nom d'un rpertoire, et qui vrifie si c'est bien un rpertoire :
1 2 3 4 5 6 7 8 9 10 #!/bin/bash read -p 'Entrez un rpertoire : ' repertoire if [ -d $repertoire ] then echo "Bien, vous avez compris ce que j'ai dit !" else echo "Vous n'avez rien compris..." fi
Entrez un rpertoire : /home Bien, vous avez compris ce que j'ai dit ! Entrez un rpertoire : rienavoir.txt Vous n'avez rien compris...
Notez que bash vrifie au pralable que le rpertoire existe bel et bien.
Si un test est vrai ET qu'un autre test est vrai Si un test est vrai OU qu'un autre test est vrai
Qu'il y a au moins un paramtre ("si $# est suprieur ou gal 1") Que le premier paramtre est bien password ("si $1 est gal password")
Si ces 2 conditions sont remplies, alors le message indiquant qu'on a trouv le bon mot de passe s'affichera.
$ ./conditions.sh password Bravo ! Vous connaissez le mot de passe
Notez que les tests sont effectus l'un aprs l'autre, et seulement s'ils sont ncessaires. Bash vrifie d'abord s'il y a au moins un paramtre. Si ce n'est pas le cas, il ne fera pas le second test puisque la condition sera de toute faon fausse.
3) Inverser un test
Il est possible d'inverser un test en utilisant la ngation. En bash, c'est le point d'exclamation "!" qui exprime la ngation.
1 if [ ! -e fichier ] 2 then echo "Le fichier n'existe pas" 3 4 fi
Ce genre de "gros if qui teste toujours la mme variable" ne pose pas de problme mais n'est pas forcment trs facile lire pour le programmeur. On peut utiliser si on veut la place l'instruction case. FILALI MOULAY RACHID Page : 65
Le rle de case est de tester la valeur d'une mme variable, mais de manire plus concise et lisible. Voyons comment on crirait la condition prcdente avec un case :
1 #!/bin/bash 2 3 case $1 in 4 "TRI1") 5 6 "TRI2") 7 8 9 10 "TRI3") 11 12 13 *) 14 15 16 Esac
echo "Salut TRI1 !" ;; echo "Bien le bonjour TRI2" ;; echo "Salut TRI3, a va ?" ;; echo "Je te connais pas,!" ;;
Tout d'abord, on indique que l'on veut tester la valeur de la variable $1. Bien entendu, vous pouvez remplacer $1 par n'importe quelle variable que vous voulez tester.
1 "TRI1")
L, on teste une valeur. Cela signifie "Si $1 est gal TRI1". Notez qu'on peut aussi utiliser une toile comme joker : "T*" acceptera tous les mots qui commencent par un T majuscule. Si la condition est vrifie, tout ce qui suit est excut jusqu'au prochain double point-virgule
1 ;;
Important, il ne faut pas l'oublier : le double point-virgule dit bash d'arrter la lecture du case l. Il saute donc la ligne qui suit le "esac" qui signale la fin du case.
1 *)
C'est en fait le "else" du case. Si aucun des tests prcdents n'a t vrifi, alors c'est cette section qui sera lue.
1 esac
Marque la fin du case (esac, c'est "case" l'envers !). On peut aussi faire des "ou" dans un case. Dans ce cas, petit pige, il ne faut pas mettre deux || FILALI MOULAY RACHID Page : 66
1 #!/bin/bash 2 3 case $1 in 4 "Chien" | "Chat" | "Souris") 5 echo "C'est un mammifre" ;; 6 "Moineau" | "Pigeon") 7 8 echo "C'est un oiseau" 9 ;; 10 *) 11 echo "Je ne sais pas ce que c'est" 12 ;; 13 esac
Il est aussi possible, comme pour le if, d'assembler les 2 premires lignes en 1, condition de mettre un point-virgule : while [ test ]; do echo 'Action en boucle' done On va demander l'utilisateur de dire "oui", et rpter cette action tant que l'utilisateur n'a pas fait ce qu'on voulait. On va crer un script boucles.sh pour l'occasion :
1 #!/bin/bash 2 3 while [ -z $reponse ] || [ $reponse != 'oui' ]
Page :
67
4 do 5 6 done
On fait 2 tests :
Est-ce que $reponse est vide ? Est-ce que $reponse est diffrent de "oui" ?
Comme il s'agit d'un OU (||), tant que l'un des 2 tests est vrai, on recommence la boucle. La boucle pourrait se traduire par : "Tant que la rponse est vide ou que la rponse est diffrente de oui". On est oblig de vrifier d'abord si la variable n'est pas vide, car sinon le second test plante. Comme vous pouvez le voir, il ne s'arrte que lorsqu'on a tap oui ! Il existe aussi le mot-cl until, qui est l'exact inverse de while. Il signifie "Jusqu' ce que". Remplacez juste "while" par "until" dans le code prcdent pour l'essayer.
La "variable" va prendre successivement les valeurs "valeur1", "valeur2", "valeur3". La boucle va donc tre excute 3 fois, et chaque fois la variable vaudra une nouvelle valeur de la liste. En bash, la boucle for s'crit comme ceci :
1 #!/bin/bash 2 3 for variable in 'valeur1' 'valeur2' 'valeur3'
Page :
68
4 do 5 6 done
Vous pouvez donc vous servir du for pour faire une boucle sur une liste de valeurs que vous dfinissez :
1 2 3 4 5 6 #!/bin/bash for animal in 'chien' 'souris' 'moineau' do echo "Animal en cours d'analyse : $animal" done
Animal en cours d'analyse : chien Animal en cours d'analyse : souris Animal en cours d'analyse : moineau
Toutefois, la liste de valeurs n'a pas besoin d'tre dfinie directement dans le code. On peut utiliser une variable :
1 2 3 4 5 6 7 8 #!/bin/bash liste_fichiers=`ls` for fichier in $liste_fichiers do echo "Fichier trouv : $fichier" done
On pourrait faire un code plus court, sans passer par une variable $liste_fichiers, en crivant :
1 2 3 4 5 6 #!/bin/bash for fichier in `ls` do echo "Fichier trouv : $fichier" done
Bien entendu, ici on ne fait qu'afficher le nom du fichier, ce qui n'est pas trs amusant ni trs utile. On pourrait se servir de notre script pour renommer chacun des fichiers du rpertoire FILALI MOULAY RACHID Page : 69
A vous de jouer ! Essayez de crer un script multirenommage.sh bas sur ce principe qui va rajouter le prfixe -old... uniquement aux fichiers qui correspondent au paramtre envoy par l'utilisateur !
./multirenommage.sh *.txt
Si aucun paramtre n'est envoy, vous demanderez l'utilisateur de saisir le nom des fichiers renommer avec read.
Explication : seq gnre tous les nombres allant du premier paramtre au dernier paramtre, donc 1 2 3 4 5 6 7 8 9 10 :
1 2 3 4 5 6 7 8
Page :
70
9 10
Si vous le voulez, vous pouvez changer le pas et avancer de 2 en 2 par exemple. Dans ce cas, il faut crire seq 1 2 10 pour aller de 1 10 en avanant de 2 en 2. Cela va donc gnrer les nombres 1 3 5 7 9.
Exercices
#exercice 1 #afficher le nombre de lignes correspondant #au contenu du repertoire passe en parametre b=`ls -l $1 | wc -l` b=$(expr $b - 1) echo $b #vous remarquerez qu'en fait les entres comptees #incluent la ligne 1 affichee par ls #c'est a dire : total ... #conclusion on soustrait 1 a la variable b #pour avoir le nombre reel d'entrees
#exercice 2 #afficher le contenu du fichier passe #en parametre #si le fichier existe test -f $1 if [ $? = 0 ] then cat $1 else echo "fichier inexistant" fi
exercice 3 # afficher la liste des users loggues # s'il y en a plus de 3 b=`who | wc -l` if [ $b -gt 3 ] then who fi #exercice 4 #passer en argument un nom #si c'est un fichier, attribuer le droit d'execution aux autres FILALI MOULAY RACHID Page : 71
#si c'est un repertoire, attribuer le droit de navigation aux autres # et retirer celui d'ecriture au groupe test -f $1 if [ $? = 0 ] # c'est un fichier then chmod o+x $1 test -d $1 fi # if [ $? = 0 ] #c'est un repertoire then chmod g-w $1 chmod o+x $1 fi
#exercice 5 #tester si la valeur passee en parametre #est paire ou impaire val=$(expr $1 % 2) if [ $val = 0 ] then #$1 a une valeur paire echo bravo else echo loupe fi
#exercice 6 #afficher le nombre d'arguments passes #s'il est superieur a 3 #afficher SUP 3 echo $# if [ $# -gt 3 ] then echo SUP 3 fi
Page :
72
Grub
Question0.1 Est-il possible d'installer un chargeur de dmarrage sur une disquette ? Question0.2 Quel est le fichier de configuration de LILO ? Question0.3 LILO peut-il accder au systme de fichiers pour lire son fichier de configuration ? Question0.4 Quel est le meilleur emplacement pour GRUB et LILO sur un disque dur IDE ? Question0.5 Quel est le nom et l'emplacement du fichier de configuration de GRUB? Question0.6 Quelle est la commande pour installer un nouveau LILO dans le MBR ? Question0.7 Quelle est la commande pour installer un nouveau GRUB dans le MBR ? Question0.8 Qu'est-ce que le initrd ? Rponse0.1 oui. Rponse0.2 /etc/lilo.conf Rponse0.3 non. Rponse0.4 Dans le MBR. FILALI MOULAY RACHID Page : 73
Rponse0.5 /boot/grub/menu.lst Rponse0.6 [root@test ] /# lilo Rponse0.7 [root@test ] /# grub > root (hd0,1) > initrd /boot/initrd >boot Rponse0.8 initrd est la mmoire disque minimale pour le noyau pour dmarrer et monter les systmes de fichiers. Exercice0.1 Installez Grub sur une disquette et essayez de dmarrer manuellement sur votre image: [root@test ] /# mkfs -t ext2 /dev/fd0 [root@test ] /# mount /dev/fd0 /mnt [root@test ] /# mkdir -p /mnt/boot/grub [root@test ] /# cp /boot/grub/stage* /mnt/boot/grub/ [root@test ] /# cp /boot/grub/e2fs_stage1_5 /mnt/boot/grub/ [root@test ] /# touch /mnt/boot/grub [root@test ] /# umount /mnt [root@test ] /# grub > root (fd0) > setup (fd0) > quit Redmarrez ensuite sur la disquette et, au prompte, slectionnez le noyau sur le disque dur. > est le prompte propos par GRUB, et les lecteurs hd0,1 et /dev/hda2 doivent tre remplacs par l'un de ceux utiliss dans votre systme. Les lignes suivantes mritent toute votre attention avant d'tre tapes. > root (hd0,1) > kernel /boot/vmlinuz root=/dev/hda2 read-only > initrd /boot/initrd > boot Exercice0.2 Crez le fichier /boot/grub/menu.lst et installez Grub sur votre disque dur en utilisant les utilitaires proposs par Grub. Exercice0.3 Rinstallez Lilo. Dans le fichier /etc/lilo.conf, changez le label Linux de l'image par dfaut du noyau par "kangaroo" et rinstallez le programme Lilo dans le MBR. Exercice0.4 Quelle commande permet de supprimer Lilo ? Rponse0.1 Suivre la procdure. Rponse0.2 FILALI MOULAY RACHID Page : 74
Tapez la commande: [root@test ] /# grub root (hd0,0) # partition boot puis: setup (hd0) # Where to install the boot record MBR quit Editez le fichier /boot/grub/menu.lst et inscrire les lignes suivantes: default 0 timeout 30 title=Mon exemple de Gentoo Linux root (hd0,0) kernel (hd0,0)/boot/bzImage root=/dev/hda3 Rponse0.3 Pour rinstaller lilo, dans un premier temps, il faut garder la disquette de grub et voir la question 0.1. Dsinstallez grub et installez le programme lilo. Modifiez le fichier /etc/lilo.conf et tapez au prompte la commande lilo afin que celui-ci soit install dans le MBR. Vous pouvez redmarrer votre machine et utilisez lilo comme chargeur de dmarrage. Rponse 13.4 La commande utiliser pour enlever lilo du MBR est lilo -U .
Question 1.11 Quelle est l'option utiliser avec la commande useradd pour crer automatiquement l'accs au shell et le rpertoire personnel ? Rponse 1.1 Un login et un mot de passe. Rponse 1.2 Excut pour chaque par bash pour chaque nouveau shell interactif. Rponse 1.3 Une commande intgre (built-in) est une commande excute dans un shell. Rponse 1.4 [root@test ] /# whereis ls Rponse 1.5 [root@test ] /# xeyes & Rponse 1.6 [root@test ] /# passwd -l [username] Rponse 1.7 Le ! devant le mot de passe encrypt signifie que le compte est bloqu. Rponse 1.8 [root@test ] /# Le # signifie que vous tes connect en root. Rponse 1.9 Le fichier est /etc/login.defs. Rponse 1.10 Il signifie l'identit du groupe primaire (GID) pour un utilisateur. Rponse 1.11 L'option est -m. Exercice 1.1 Trouvez les informations sur les commandes useradd et userdel. Exercice 1.2 Crez deux nouveaux comptes user1 et user2 et attribuez leur des mots de passe avec la comma nde passwd. Exercice 1.3 En tant que root, bloquez les comptes et vrifiez ensuite en essayant de vous connecter. Exercice 1.4 Quelle commande sert concatner des fichiers ? Exercice 1.5 Dclarez et initialisez les variables d'environnement suivantes : NAME et LASTNAME. Utilisez echo pour les afficher. Exercice 1.6 Lancez un bash et vrifiez que ces variables ont bien t dclares. Exercice 1.7 Utilisez exec pour ouvrir une nouvelle session bash: Peut-on encore voir ces variables ? Exercice 1.8 Utilisez la commande date pour afficher le mois courant. Exercice 1.9 Editez le fichier .bashrc dans le rpertoire home et ajoutez ces lignes : FILALI MOULAY RACHID Page : 76
alias ls='ls --color' alias ll='ls --color -l' Expliquez leur action ? Rponse 1.1 Pour avoir des information sur les commandes, utiliser l'aide systme: [root@test ] /# man useradd [root@test ] /# man userdel Rponse 1.2 cration des utilisateurs: [root@test ] /# useradd -m user1 [root@test ] /# useradd -m user2 Cration des mots de passe des utilisateurs: [root@test ] /# passwd user1 (entrer le mot de passe et le confirmer) [root@test ] /# passwd user2 (entrer le mot de passe et le confirmer) Se dconnecter de la session root et se connecter avec les deux comptes crs (user1 user2). Rponse 1.3 [root@test ] /# passwd -l user1 [root@test ] /# passwd -l user2 Rponse 1.4 La commande utilise pour concatner les fichiers est cat. Rponse 1.5 Cration d'une variable: [root@test ] /# name=jance [root@test ] /# LASTNAME=roberto Pour afficher le contenu des variables, procder comme suit: [root@test ] /# echo $name; echo $LASTNAME Rponse 1.6 Si on dmarre un nouveau bash, les variables cres ne sont pas effectives. Pour cela il faut faire un export des variables. Rponse 1.7 Non car nous avons chang d'environnement. Rponse 1.8 [root@test ] /# Date +"%m" Rponse 1.9 Les lignes ajoutes dans le fichier .bashrc permettent de crer des alias la commande ls. Le pr emier alias permet d'afficher en couleur le rsultat de ls. Le deuxime alias permet d'afficher en couleur et d'utiliser l'option -l de la commande ls -l en utilisant la commande ll.
Quelle commande est approprie pour lire un fichier de log? Question 2.4 Comment ajouter un numro aux lignes d'un fichier? Question 2.5 Comment faites vous pour compter le nombre de mots dans un fichier? Question 2.6 Quelle commande vous permet de transformer des minuscules en majuscules? Question 2.7 Quelle commande faut-il utiliser pour classer alphabtiquement le contenu d'un fichier ? Question 2.8 Est-ce que le format ELF vous permet d'excuter le mme programme binaire sur des architectures x86 et PPC? Rponse2.1 cat crit sur stdout (la sortie standard), le plus souvent un terminal. Rponse2.2 Avec les utilitaires de pipe (|) ou de redirection (<, >, >>). Rponse2.3 Il faut utiliser tail de la manire suivante: [root@test ] /# tail -f -s 1 /var/log/messages Rponse2.4 Avec l'utilitaire nl de la manire suivante: [root@test ] /# nl file Rponse2.5 Avec l'utilitaire wc de la manire suivante: [root@test ] /# wc -w file Rponse2.6 Avec l'utilitaire tr de cette manire: [root@test ] /# cat /etc/passwd | tr [a..z] [A..Z] Rponse2.7 Avec l'utilitaire sort de cette manire: [root@test ] /# sort file Rponse2.8 Non, ELF spcifie le format des fichiers binaires. La dfinition des instructions binaires est diffrente entre les architecture x86 et PPC. Exercice 2.1 Affichez le nombre de mots qui commencent par h dans tous les fichiers du rpertoire /etc. Exercice 2.2 Comment enregistrer un fichier de 2Mo sur deux disquettes de 1.44Mo ? Comment feriez-vous pour assembler ensuite les deux parties du fichier ? Exercice 2.3 Quelle commande utiliseriez-vous pour remplacer le dlimiteur : dans le fichier /etc/passwd par # ? Exercice 2.4 Combien de lignes pouvez-vous comptabiliser dans le fichier /etc/passwd ? Exercice 2.5 FILALI MOULAY RACHID Page : 78
Quelle commande permet d'afficher les 5 dernires lignes du fichier /etc/group ? Exercice 2.6 Combien de mots et de caractres le fichier /etc/passwd contient-il ? Exercice 2.7 Crez un fichier utilisateur dans votre rpertoire home qui contient tous les uid et le gid des comptes. Remplacez tous les : par un ESPACE. Exercice 2.8 Triez le fichier /etc/passwd avec le nom de l'utilisateur ? Rponse 2.1 La commande est: [root@test ] /# wc -w /etc/h* Rponse 2.2 La commande est: [root@test ] /# split -b 1m filename [root@test ] /# cat x* > filename ( pour reconstituer le fichier) Rponse 2.3 [root@test ] /# cat /etc/passwd | tr ":" "#" Rponse 2.4 La commande est: [root@test ] /# nl /etc/passwd ou [root@test ] /# cat -n /etc/passwd ou [root@test ] /# wc -l /etc/passwd Rponse 2.5 La commande est: [root@test ] /# tail -n 5 /etc/group Rponse 2.6 La commande est: [root@test ] /# wc -w -m /etc/passwd Rponse 2.7 La commande est: [root@test ] /# cut -d : -f 1,3,4 /etc/passwd > /home/toto/user && cat /home/ toto/user | tr ":" " " > /home/toto/user Rponse 2.8 La commande est [root@test ] /# sort -t : +0,-1 /etc/passwd
Question 3.4 A quoi correspond l'option -p de la commande mkdir ? Question 3.5 Quelles commandes et options doit-on utiliser pour copier un rpertoire, avec tous ses sous-rpertoires et leur contenu, d'un emplacement un autre ? Question 3.6 Quelle commande permet de dplacer des fichiers ou des rpertoires ? Question 3.7 Quelle commande faut-il utiliser pour rechercher tous les fichiers du rpertoire /tmp qui ont une extension .pdf ? Question 3.8 Quels sont les trois mcanismes de citation ? Question 3.9 Quelle est l'action de la commande suivante ? [root@test ] /# cp foo/bar bar/foo bar/foobar Rponse 3.1 [root@test ] /# ls -a Rponse 3.2 [root@test ] /# ls -l Rponse 3.3 NON. Il fait la distinction entre les types de fichiers grce un numro magique plac dans l'index du fichier. Rponse 3.4 Vous permet de crer plusieurs rpertoires dans une seule commande. Rponse 3.5 [root@test ] /# cp -r /home/me/* /backup/me Rponse 3.6 La commande est mv. Rponse 3.7 [root@test ] /# find /tmp -name *.pdf -print Rponse 3.8 Les 3 manires de commenter sont: '..', .., et \.. Rponse 3.9 Cette commande copie les fichiers bar et foo l'intrieur du rpertoire bar/foobar. Exercice 3.1 Trouver tous les fichiers dont les noms contiennent x suivi de in dans le rpertoire /etc en utilisant les jokers. Exercice 3.2 Trouver les fichiers dont les noms commencent par une lettre comprise entre a et e, contiennent au moins deux autres caractres et ne se terminent pas par un nombre. Exercice 3.3 Trouver les fichiers dont les noms se composent de quatre caractres et commencent par le caractre 'uppercase' en utilisant les jokers. Ne descendre dans aucun des rpertoires trouvs. Exercice 3.4 FILALI MOULAY RACHID Page : 80
Trouver les fichiers qui contiennent sh dans le rpertoire /bin en utilisant les jokers. Exercice 3.5 Affichez votre variable d'environnement HOME prcde par la phrase $HOME value is: Exercice 3.6 Affichez le contenu de $SHELL Exercice 3.7 Comment afficheriez-vous la chane de caractres suivante, avec echo en utilisant les doubles guillemets et \ ? *@#$%^&*()'"\ Exercice 3.8 Composez une commande avec echo pour afficher les trois chanes de caractres suivantes: * * That's it he said! 'Never Again! ' he replied.** Exercice 3.9 Composez une commande interactive qui permet d'effacer tous les fichiers .tmp dans le rpertoire home. Rpondre y chaque prompte. Exercice 3.10 Trouvez tous les fichiers dans le rpertoire home de l'utilisateur dont le nom se termine par .pdf, dont la taille est suprieure 50 blocks et qui n'ont pas t ouverts depuis 1 mois. Exercice 3.11 Crez un fichier file.h qui contiendra tous les noms de fichiers se terminant par .h et qui se trouvent dans le rpertoire /usr. Exercice 3.12 Faire un touch sur tous les fichiers c du rpertoire /usr/src/packages. Exercice 3.13 Quelles sont les permissions par dfaut accordes aux nouveaux fichiers et aux nouveaux rpertoires ? Exercice 3.14 Comment crer un nouveau fichier ou un nouveau rpertoire dont le nom contient un espace ? (Par exemple: 'new dir') Exercice 3.15 Quelle commande permet de supprimer tous les fichiers du type char et block dans votre rpertoire home ? Exercice 3.16 Comment trouver l'emplacement du programme find ? Exercice 3.17 Supprimer tous les fichiers dans le rpertoire /tmp qui n'appartiennent pas root et qui n'ont pas t ouverts depuis une semaine. Exercice 3.18 crivez la commande qui permet de changer le mot lynux par linux dans tous les fichiers avec l'extension html situs dans un rpertoire et tous ses sous-rpertoires. Exercice 3.19 Trouvez dans le rpertoire /usr les fichiers dont la taille dpasse 1Mo et dont les droits sont fixs 755 ? Exercice 3.20 FILALI MOULAY RACHID Page : 81
Combien de fichiers avez vous dans toute l'arborescence qui vous appartient et dont les droits sont fixs 644 ? Rponse 3.1 [root@test ] /# ls -d /etc/*x*in* Rponse 3.2 [root@test ] /# ls -d / [a-e]??*[!0-9] Rponse 3.3 [root@test ] /# s -d /etc/[A-Z]??? Rponse 3.4 [root@test ] /# s -d /bin/*sh* Rponse 3.5 [root@test ] /# echo "\$HOME value is:"$HOME Rponse 3.6 [root@test ] /# echo "$SHELL" Rponse 3.7 [root@test ] /# echo \@ \# \$ \% \^ \& \* \( \) \' \" \\ ou [root@test ] /# echo "@ # $ % ^ & * ( ) ' \" \\" Rponse 3.8 [root@test ] /# echo "**that's it he said! 'Nerver again!'he replied**" Rponse 3.9 La commande est: [root@test ] /# find /home -name "*.tmp" -ok rm {} \; ou [root@test ] /# find ~ -name "*.tmp" -exec rm -i {} \; Rponse 3.10 [root@test ] /# find /home -name "*.pdf" -size +50 -atime +30 -print Rponse 3.11 [root@test ] /# find /usr -name "*.h" -print > file.h Rponse 3.12 [root@test ] /# find /usr/src -type c -exec touch {} \; Le rpertoire /usr/src/packages n'existe pas sur Mandriva. Rponse 3.13 pour un nouveau dossier: 755 rwxr-xr-x pour un nouveau fichier: 644 rw-r-r-Rponse 3.14 La commande est: [root@test ] /# touch a\ b Le caractre "\" permet d'interprter le caractre espace comme un caractre. Rponse 3.15 La commande est: [root@test ] /# find ~ \( -type c -o -type b \) -exec rm -i {} \; ou [root@test ] /# find ~ -type c -type b -exec rm {} \; Rponse 3.16 La commande est: [root@test ] /# which find [root@test ] /# type find FILALI MOULAY RACHID Page : 82
[root@test ] /# whereis find Rponse 3.17 La commande est: [root@test ] /# find /tmp -not -user root -atime +7 -ok rm {}\; ou [root@test ] /# find /tmp \! -user root -atime +7 -exec rm {}\; Rponse 3.18 La commande est: [root@test ] /# find . -type f -name "*.html" -exec sed -i "s/lynux/linux/g" {} \; Regarder les pages man pour l'option -i de sed. Rponse 3.19 La commande est: [root@test ] /# find /usr (-size +2000 -a -perm 755) -print 2>/dev/null Rponse 3.20 [root@test ] /# find / (-user votrenomutilisateur -a -perm 644) | wc l
un fichier. Rponse4.7 L'utilitaire xargs cr une ligne d'arguments depuis stdin. Rponse4.8 Un pipe est un mcanisme de communication inter-processus. Utilis dans une commande, il permet de connecter la sortie d'une commande l'entre d'une autre commande. Chaque commande s'excutant dans un contexte diffrent. Exercice 4.1 Crer un fichier list.bin qui contiendra tous les noms de fichier du rpertoire /bin. Exercice 4.2 Ecrire une commande qui exporte la liste des fichiers de /usr/local/bin dans le fichier appel list.bin puis affichez toutes les erreurs en sortie. Exercice 4.3 Divisez le fichier list.bin en des fichiers ne contenant que 50 lignes et supprimez list.bin. Exercice 4.4 Depuis les fichiers diviss, rcrez le fichier list.bin. Exercice 4.5 Simplifiez les commandes suivantes: [root@test ] /# ls *.c | xargs rm [root@test ] /# ls [aA]* | xargs cat [root@test ] /# cat `ls *.v` 2>/dev/null Exercice 4.6 Utilisez find pour trouver un quivalent la commande suivante: [root@test ] /# more `ls *.c` Exercice 4.7 crivez une commande qui permette de crer un fichier list.sbin dans le contenu de /sbin et en mme temps, affichez les sorties standards. Exercice 4.8 Crez un fichier dont le nom contient l'heure de sa cration. Exercice 4.9 Crez un fichier qui contient en ordre invers tous les noms de fichiers dont les extensions sont .conf et qui appartiennent au rpertoire /etc. Solution 4.1 La commande est: [root@test ] /# ls /bin > list.bin Solution 4.2 La commande est: [root@test ] /# ls /usr/local/bin >> ~/list.bin 2> /dev/null Solution 4.3 La commande est: [root@test ] /# split -l 50 list.bin [root@test ] /# rm list.bin Solution 4.4 La commande est: FILALI MOULAY RACHID Page : 84
[root@test ] /# cat x* > list.bin Solution 4.5 [root@test ] /# ls *.c | xargs rm [root@test ] /# rm *.c [root@test ] /# ls [aA]* | xargs cat [root@test ] /# cat [aA]* [root@test ] /# cat `ls *.v` 2>/dev/null [root@test ] /# cat *.v 2>/dev/null Attention, l'alias ls='ls --color' ou ls='ls --color=always' peut causer des problmes pour utiliser xargs. Solution 4.6 La commande est: [root@test ] /# find . -name "*.c" -maxdepth 1 | xargs more {} \; ou [root@test ] /# find . -name "*.c" -maxdepth 1 -exec more {} \; Si vous ne mettez pas -maxdepth, vous aurez tous les fichiers, pas seulement ceux du rpertoire courant. Solution 4.7 La commande est: [root@test ] /# ls /sbin | tee list.sbin Solution 4.8 La commande est: [root@test ] /# touch "il est `date +"%T"`" Solution 4.9 La commande est: [root@test ] /# ls /etc/*.conf | tac >invert_file.etc.conf ou [root@test ] /# ls -r /etc/*.conf > invert_file.etc.conf
Rponse5.1 top. Rponse5.2 Oui, except le premier processus init. Rponse5.3 Le processus init deviendra son parent. Rponse5.4 Un processus Rponse5.5 kill Rponse5.6 La commande kill, le process ID et le numro de signal ou le nom envoyer. Rponse5.7 Non, cela va seulement augmenter la base sur laquelle l'ordonnanceur calcul le temps attribuer chaque processus. Tous les autres processus seront toujours en mesure de fonctionner. Rponse5.8 SIGSTOP Exercice 5.1 Quel est le processus de user et de root qui utilise le plus de mmoire ? Exercice 5.2 Ouvrez deux terminaux. Dans l'un deux, tapez la commande: [root@test ] /# while [ 1 ]; do echo -n The date is:; date; done Dans l'autre, vrifiez que vous avez la possibilit de stopper et de redmarrer les travaux. Exercice 5.3 Mme exercice que le 5.2, mais, faites en sorte que l'affichage de sortie s'arrte pendant 3 seconde et redmarre pendant 1 seconde de manire rptitive. Exercice 5.4 Faites que l'affichage de sortie de la commande ps soit formate de la manire suivante: username, commande et nice value. Exercice 5.5 Arrtez tous les processus nomms bash qui appartiennent votre propre utilisateur. Exercice 5.6 Avec la commande top, affichez les processus de root. Avec cette mme commande top, que devez-vous taper pour arrter un processus ? Exercice 5.7 Ouvrez deux terminaux: dans le premier, affichez priodiquement le niveau d'utilisation de la mmoire virtuelle. Dans le second, dsactivez la mmoire virtuelle et activez l de nouveau. Quels changements notez-vous dans le premier terminal. Exercice 5.8 Quelle est l'organisation des disques de votre systme ? Combien de disques avez-vous ?
Page :
86
Rponse 5.1 Faites un top puis tapez M et constatez quel utilisateur consomme le plus de mmoire. Rponse 5.2 kill -sigstop (ppid) (stop) kill -sigcont (ppid) (restart) Rponse 5.3 [root@test ] /# while [ 1 ]; do echo Stop the process; kill -sigstop pid; sleep 3; echo continuation; kill -sigcont pid; sleep 1; done Attention, la chane [ 1 ] s'crit avec des espaces autour des crochets. Rponse 5.4 La commande est: [root@test ] /# ps -eo "%U %c %n" Rponse 5.5 Utilisez ps et ajoutez les options pour afficher les noms d'utilisateurs. Localisez les bash qui appartiennent l'utilisateur root et utilisez la commande kill avec l'option dsire suivie du pid. Rponse 5.6 Tapez la commande top et appuyez sur la touche h pour afficher l'aide. Utilisez la touche u pour lister uniquement l'utilisateur choisi. Pour tuer un processus, utilisez la touche k pour kill et indiquer le pid du processus. Rponse 5.7 Dans le premier terminal, excutez la commande vmstat -n 1: les statistiques de la mmoire virtuelle sont en temps rel. Dans la deuxime console, excutez swapoff /dev/hdax Constatez ce qui ce passe dans le premier terminal. Une variation doit tre constate si la mmoire vive est utilise 100%. Rponse 5.8 Pour visualiser les disques et partitions du systme, utilisez la commande cfdisk ou df.
Est-ce que le sticky bit doit tre configur pour qu'un utilisateur puisse excuter un programme ? Question 7.7 Est-ce que chown change les permissions w,r,x de l'utilisateur ? Question 6.8 Que signifie la permission d'excution pour un fichier ? Rponse6.1 [root@test ] /# ls -l Rponse6.2 [root@test ] /# chmod +x file Rponse6.3 chgrp vous permet de changer le groupe pour un nom de fichier. Rponse6.4 la commande est ln sans option. Rponse6.5 Non. Rponse6.6 Non. Rponse7.7 Non, il change l'uid d'un nom de fichier. Rponse6.8 Cela signifie que vous pouvez chercher travers les rpertoires. Exercice 6.1 Effectuer ces oprations: Crez deux nouveaux rpertoires etc et bin dans votre rpertoire home. Copiez tous les fichiers de faon rcursive de /etc etc et de /bin bin. Dans votre rpertoire local etc, renommez tous les fichiers *.conf par *.conf.bak. Crez, dans votre rpertoire home, un lien symbolique appel mydir, qui pointe vers bin/ls. Vrifiez si mydir excute ls. Effacez le lien mydir. Est-ce que bin/ls est toujours prsent ? Mme question que prcdemment mais avec un lien physique. Effacez le lien mydir. Est-ce que bin/ls est toujours prsent ? Rponse 6.1 La commande est: [root@test ] /# cd /home/user/ [root@test ] /# mkdir etc bin La commande est: [root@test ] /# cp -r /etc/* /home/user/etc/ [root@test ] /# cp -r /bin/* /home/user/bin La commande est: [root@test ] /# rename .conf .conf.back *.conf ou [root@test ] /# for i in *.conf; do mv $i $i.back; done FILALI MOULAY RACHID Page : 88
La commande est: [root@test ] /# cd /home/user/ [root@test ] /# ln -s /bin/ls mydir La commande est: [root@test ] /# rm mydir La commande est: [root@test ] /# cd /home/user/ [root@test ] /# ln /bin/ls mydir Testez et donnez votre conclusion.
vi lit le stdin, sed utilise les arguments pour grer les flots de donnes. Rponse7.8 grep Exercice 7.1 Copiez tous les fichiers de /etc dans votre rpertoire home/etc/. Affichez ensuite le contenu de tous les fichiers *.conf en remplaant le mot host par machine. Exercice 7.2 Avec grep, affichez le contenu de tous les fichiers ~/etc/*.conf qui ne contiennent pas le mot root. Faites ensuite la mme opration avec sed. Exercice 7.3 Avec grep, imprimez tous les noms des groupes auxquels root appartient. Faites la mme opration avec la commande sed. Exercice 7.4 Listez tous les noms de groupe composs de 4 ou 5 caractres. Exercice 7.5 Listez tous les fichiers dans ~/etc/ qui ne contiennent pas de lignes vides. Exercice 7.6 Listez dans le rpertoire ~/etc/ tous les fichiers qui contiennent des caractres numriques. Exercice 7.7 Affichez avec ls uniquement les noms de rpertoires dans ~/etc. Exercice 7.8 Faites un ps aux, remplacez l'utilisateur root par toto et imprimez le dans un fichier appel new_process.txt. Exercice 7.9 Listez tous les processus appels apache appartenant un utilisateur dont le nom commence par p ou P. Exercice 7.10 Que fait la commande suivante ? [root@test ] /# sed 's/^\(.86\)/80\1/g' fichier Exercice 7.11 Avec grep et sed, dterminez l'adresse IP de votre machine en utilisant la commande ifconfig. Rponse 7.1 [root@test ] /# cp -r /etc [root@test ] /# cd /etc [root@test ] /# cat *.conf | sed 's/host/machines/g' ou [root@test ] /# find ~/etc -name *.conf -exec sed 's/host/machines/g' {} \; Rponse 7.2 Avec la commande grep: [root@test ] /# grep -L root *.conf | xargs cat Avec la commande sed: [root@test ] /# sed '/root/d' ~/etc/*.conf Rponse 7.3 La commande est: [root@test ] /# cut -f 1,4 -d : /etc/group | grep root FILALI MOULAY RACHID Page : 90
ou [root@test ] /# sed '/[:,]root/!d;s/\(^[^:]*\).*\([^:]*\)$/\1 : \2/g' /etc/group Rponse 7.4 La commande est: [root@test ] /# grep -o '^[^:]\{4,5\}\>' /etc/group Rponse 7.5 La commande est: [root@test ] /# grep -L '^ *$' /etc/* | xargs cat 2>/dev/null Rponse 7.6 La commande est: [root@test ] /# grep -l '[0-9]' ~/etc/* si on cherche les fichiers qui contiennent des chiffres. Rponse 7.7 La commande est: [root@test ] /# ls -l ~/etc/ | grep ^d ou [root@test ] /# ls -dF ~/etc/* | grep '.*\/$' ou [root@test ] /# ls -ld ~/etc/* | sed -n '/^d/s/.* \(.*\)$/\1/gp' ou alors... [root@test ] /# ls -d */ Attention aux aliases (ls='ls -F') Rponse 7.8 La commande est: [root@test ] /# ps aux | sed 's/root/toto/g' > new_process.txt Rponse 7.9 La commande est: [root@test ] /# ps aux | grep apache | grep '^[pP]' ou [root@test ] /# ps aux | sed -n '/^[pP].*apache/p Rponse 7.10 Elle remplace ce qui se trouve en dbut de ligne suivit d'un caractre quelconque suivit de la chane 86 par 80 et ce que l'on a remplac. Exemple : 586 devient 80586 Rponse 7.11 Avec la commande grep: [root@test ] /# ifconfig eth0 | grep '^[[:space:]]*inet addr:\([0-9]\ {1,3\}\.\)\{3\}[0-9]\{1,3\}' Avec la commande sed: [root@test ] /# ifconfig eth0 | sed -n -e 's/^[[:space:]]*inet addr:\(\ ([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*$/\1/p'
O .exrc doit-il se trouver ? Question 8.3 Que fait dans vi la squence wq ? Question 8.4 Est-il possible d'utiliser une expression rgulire dans vi ? Question 8.5 Est-il possible d'utiliser la syntaxe de sed dans vi ? Question 8.6 Comment rechercher un mot dans vi ? Question 8.7 Comment annuler la dernire manipulation dans vi ? Question 8.8 Comment faites-vous pour rpter la dernire commande dans vi ? Rponse8.1 .exrc est le fichier de configuration de vi. Rponse8.2 Il doit tre localis dans le rpertoire home de l'utilisateur. Rponse8.3 Sauvegarder et quitter (Save and quit) Rponse8.4 oui Rponse8.5 oui Rponse8.6 :/word/ Rponse8.7 Avec le caractre u. Rponse8.8 Avec le caractre ".". Exercice 8.1 ditez un fichier que vous appellerez vitest avec vi. Quittez ensuite vi sans sauvegarder le fichier. Exercice 8.2 Editez le fichier vitest et crivez quelques lignes. Sauvegardez ensuite le fichier. Sauvegardez et quittez en une commande. Exercice 8.3 Comment utiliser l'aide de vi ? Exercice 8.4 Faites une copie de /etc/passwd dans votre rpertoire home. Editez ensuite cette copie avec vi. Changez chaque occurrence du mot root avec votre propre nom d'utilisateur. Exercice 8.5 Toujours dans la copie de /etc/passwd, faites une copie et collez quelques lignes. Effacez-les ensuite. Rponse 8.1 La commande est: FILALI MOULAY RACHID Page : 92
[root@test ] /# vi vitest Pour sortir de l'utilitaire vi sans sauvegarder le fichier : utiliser :q!. Rponse 8.2 La commande est: Pour diter, faire vi vitest Pour crire quelque ligne dans le fichier, passez en mode "insertion" en utilisant la touche i. Pour sauvegarder le fichier faire :w Pour sauvegarder et quitter le fichier, faire :wq. Rponse 8.3 Pour obtenir de l'aide sur l'utilitaire vi, lorsque vi est ouvert, il faut taper :h. Rponse 8.4 Copie de passwd dans /home/myhome: [root@test ] /# cp /etc/passwd /home/myhome/ Pour remplacer le mot root par mon nom, utiliser vi et faire : Se placer sur le mot remplacer et utiliser la commande cw Rponse 8.5 Pour copier une ligne avec l'utilitaire vi faire: yy Pour coller la ligne copier, faire: p Pour supprimer une ligne, faire: dd
Rponse9.4 Oui, c'est le projet FHS. Rponse9.5 mkfs Rponse9.6 Non, la partition sera compltement crase. Rponse9.7 du Rponse9.8 Fsck
Rponse 10.7 Il vrifie que le systme de fichiers n'est pas corrompu. Rponse 10.8 Oui Exercice 10.1 Crez une ligne dans /etc/fstab qui autorise l'accs du lecteur de disquettes tous les utilisateurs. Vrifiez que vous pouvez utiliser ce lecteur et que vous pouvez crer un fichier avec touch. Exercice 10.2 Faites la manipulation suivante: Crez un systme de fichiers ext2 sur le lecteur de disquettes. Montez le lecteur. Copiez tous les fichiers /etc/*.conf sur une disquette. Dmontez le lecteur. Que se passe-t-il ? Montez-le de nouveau et vrifiez que tous les fichiers sont bien prsents. Tapez la commande suivante: [root@test ] /# tar cvf /dev/fd0 /etc/*.conf Essayez de le monter de nouveau. Que se passe-t-il alors ? Utilisez tar pour visualiser le contenu de la disquette. Exercice 10.3 Le fichier /etc/fstab possde toutes les informations dont vous avez besoin pour monter un lecteur de disquettes. Quelle est la manire la plus simple de monter un lecteur de disquette ? Rponse 10.1 La nouvelle ligne ajouter dans le fichier fstab est: /dev/fd0 /mnt/floppy auto noauto, Rponse 10.2 [root@test ] /# mke2fs /dev/fd0 [root@test ] /# mount /dev/fd0 /mnt/floppy [root@test ] /# cp /etc/*.conf /mnt/floppy Quand on dmonte le lecteur de disquettes, les donnes sont synchronises (synchronisation des manipulations). La commande tar cvf /dev/fd0 /etc/*.conf permet de stocker une archive sur la disquette sans crer de systme de fichiers. La disquette ne peut tre monte, mais il est possible de rcuprer les informations qui se trouvent sur la disquette en dsarchivant le contenu de celle-ci. Pour visualiser le contenu de la disquette, il faut utiliser la commande: [root@test ] /# tar tvf /dev/fd0 Rponse 10.3 Pour monter un lecteur sans avoir besoin de tout spcifier, faire: [root@test ] /# mount /dev/fd0 /mnt/floppy La commande mount lit le fichier fstab et fait le lien avec le point de montage.
Question 11.1 Dans quelle configuration de fichiers le mcanisme de quota doit-il tre spcifi ? Question 11.2 Quelle commande et quelle option permettent d'initialiser la base de donnes de quotas ? Question 11.3 Quelle commande devez-vous utiliser pour mettre en place les quotas dans le systme ? Question 11.4 Quelle commande, excute dans un cron permet de contrler priodiquement les quotas des utilisateurs ? Question 11.5 Quelle commande vous permet d'diter la priode de grce ? Rponse 11.1 /etc/fstab Rponse 11.2 [root@test ] /# quotacheck -acmugv Rponse 11.3 [root@test ] /# quotaon -av Rponse 11.4 [root@test ] /# /sbin/quotacheck -acmugv Rponse 11.5 [root@test ] /# edquota t Exercice 11.1 Mettez en place une limitation logicielle 500M pour tous les utilisateurs qui ont leur rpertoire home dans /home. Exercice 11.2 Mettez la priode de grce 0. Exercice 11.3 Connectez-vous comme utilisateur et vrifiez que la limitation est en place. Rponse 11.1 Dans un premier temps, mettre tous les utilisateurs concerns dans un mme groupe. Puis tapez la commande: [root@test ] /# edquota -g groupname (donne la limitation logicielle pour le quota) Rponse 11.2 Utilisez la commande edquota -t pour dfinir la priode de grce. Rponse 11.3 Utilisez la commande quota -v pour visualiser les limitations de travail.
Page :
96
12 Scripts Shell
Question 12.1 Faites deux scripts qui vous disent bonjour en affichant votre login (Bonjour, toto) : Quand vous tapez saluer [votre-login] Quand vous tapez juste saluer
Question 12.2 Faire un script qui affiche la phrase : Le script [params] a [n] paramtre(s), que voici : [paramtres], en remplaant les mots entre crochets par leur valeur; par exemple :
chaland ~ $ params bla ble bli blo blu La commande params a 5 paramtre(s), que voici : bla ble bli blo blu
Rponse 12.2
#!/bin/sh echo "La commande $0 a $# paramtre(s), que voici| : $@"
Page :
97
Qestion 12.3 Crez une commande qui, lorsqu'elle est appele, renvoie le nombre d'arguments qui lui ont t fournis, ainsi que le premier de ces arguments.
Rponse 12.3
#!/bin/sh echo "J'ai reu $# arguments" echo "Le premier d'iceux est $1"
Qestion 12.4 Vous voulez crire un script qui vous dit combien de personnes sont logues sur une machine donne; par exemple :
drakkar ~ $ combien Rachid Il y a 5 personne(s) logues sur Rachid en ce moment. drakkar ~ $
Rponse 12.4 #!/bin/sh N=`who | wc -l | sed -e "s/ *//"` MACHINE=`whoami` echo "Il y a $N personne(s) logus sur $MACHINE en ce moment"
Rponse 12.5 Le script suivant lanc avec "**/*.htm" comme paramtre devrait fonctionner :
#!/bin/sh for i in $@; do mv $i `echo $i | sed -e "s/htm$/html/"` done;
Page :
98
Question 12.6 Un ensemble de noms de fichiers sont en majuscules. On veut tout basculer en minuscules.
Rponse 12.6
#!/bin/sh for i in $@; do mv $i `echo $i | tr '[:upper:]' '[:lower:]'` done;
Question 12.7 Crez un script indice qui affiche l'indice de son premier argument dans la liste des arguments suivants. Par exemple,
indice toto tata titi toto tutu
renvoie l'indice de toto dans la liste tata titi toto tutu, c'est--dire 3.
Reponse 12.7
#!/bin/sh ARG=$1 shift N=0 for i in $@; do N=`expr $N + 1` [ x$ARG = x$i ] && echo $N done;
Question 12.8 On ne s'intresse ici qu' des fichiers contenant un mot par ligne. crire un script qui compte le nombre de mots contenant une des lettres r, s ou t, et parmi eux, ceux qui ont au moins deux telles lettres. On donnera aussi le nombre de mots ne contenant aucune voyelle. Cela donnera par exemple :
Dans ce fichier, vous avez : 45 mots contenant r, s ou t, et parmi eux, 12 contiennent deux de ces lettres au moins. Il y a aussi 10 mots ne contenant aucune voyelle.
Page :
99
Rponse 12.8
#!/bin/sh RST=`grep "[rst]" $1 | wc -l` DEUX=`grep "[rst].*[rst]" $1 | wc -l` CONS=`grep -v "[aeiou]" $1 | wc -l` (echo "Dans ce fichier, vous avez| :"; echo "$RST mots contenant r, s ou t et parmi eux,"; echo "$DEUX contiennent deux de ces lettres au moins."; echo "Il y a aussi $CONS mots ne contenant aucune voyelle.") | sed -e "2,3s/^ *// \$s/i */i /"
Exercice 12.1 Crer un script shell nomm "change" qui affichera la date de dernire modification d'un fichier puis la modifiera avec l'heure actuelle et enfin raffichera la date de dernire modification du fichier. Cette procdure acceptera 1 paramtre qui sera le nom du fichier. Lorsque vous excuterez "change mon_fic", le 8 octobre 15 heures 12 vous obtiendrez le rsultat: avant : -r--r--r-- 1 user group 40 Fev 3 2011 mon_fic aprs : -r--r--r-- 1 user group 40 Oct 8 15:12 mon_fic Exercice 12.2 Crer un script shell nomm "nombreJours" qui affichera le nombre de jours du mois courant. "nombreJours" affichera pour fvrier 2007 le message "28 jours en fvrier 2007". Exercice 12.3 Crer un script shell ralisant la cration d'un rpertoire "Exo3" contenant 10 fichiers nomms "Un" "Dix". Chaque fichier contient une seule ligne: * "Un" contient "Premire ligne" * "Deux" contient "Deuxime ligne" * ... * "Dix" contient "Dixime ligne" i. Vrifier que le rpertoire crer n'existe pas dj auquel cas il ne sera pas recr mais les fichiers si. Exercice 12.4 Crer un script shell qui ralise les oprations suivantes: * Cration sous votre rpertoire "TP2" d'un sous rpertoire nomm "annemoisjour" (20070202 pour le 2 fvrier 2007). * Copie des fichiers de "Exo3" sous ce rpertoire puis effacement de ces mmes fichiers de "Exo3". * Cration de deux fichiers sous le rpertoire d'accueil (HOME) de la personne qui a lanc le shell:
Page :
100
o un fichier nomm "Gros_fichier.numero_du_shell" dans lequel se trouvera le contenu concatn des fichiers traits o un fichier nomm "Nom_du_script.numero_du_shell" dans lequel se trouvera le nom des fichiers traits. i. Vrifier que le rpertoire crer n'existe pas dj. Exercice 12.5 * Crer un script permettant d'afficher la liste des fichiers du rpertoire /etc accessibles en lecture. * Crer un script permettant d'afficher la liste des fichiers du rpertoire /etc accessibles en criture. Exercice 12.6 Crer un script nomm "table" permettant d'afficher des tables de multiplication. "table 5 10" aura pour rsultat l'affichage: 0x5=0 1x5=5 2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25 6 x 5 = 30 7 x 5 = 35 8 x 5 = 40 9 x 5 = 45 10 x 5 = 50
Rponse 12.1 AVANT=$(ls -l $1) touch $1 APRES=$(ls -l $1) echo "Avant : "$AVANT echo "Apres : "$APRES Rponse 12.2 MOIS=$(date +"%m") case $MOIS in 01) NOM="janvier";; 02) NOM="fevrier";; 03) NOM="mars";; 04) NOM="avril";; 05) NOM="mai";; 06) NOM="juin";; 07) NOM="juillet";; 08) NOM="aout";; 09) NOM="septembre";; 10) NOM="octobre";; 11) NOM="novembre";; FILALI MOULAY RACHID Page : 101
12) NOM="decembre";; esac ANNEE=$(date +"%Y") case $MOIS in 01|03|05|07|08|10|12) echo "31 jours en "$NOM" "$ANNEE;; 04|06|09|11) echo "30 jours en "$NOM" "$ANNEE;; 02) BISSEXTILITE=$(expr $ANNEE % 4) if [ $BISSEXTILITE != 0 ] then echo "28 jours en "$NOM" "$ANNEE else BISSEXTILITE=$(expr $ANNEE % 100) if [ $BISSEXTILITE != 0 ] then echo "29 jours en "$NOM" "*ANNEE else BISSEXTILITE=$(expr $ANNEE % 400) if [ $BISSEXTILITE != 0 ] then echo "28 jours en "$NOM" "$ANNEE else echo "29 jours en "$NOM" "$ANNEE fi fi fi;; esac Rponse 12.3 test -e Exo3 if [ $? != 0 ] then mkdir Exo3 fi echo "Premiere ligne" >Exo3/Un echo "Deuxieme ligne" >Exo3/Deux echo "Troisieme ligne" >Exo3/Trois echo "Quatrieme ligne" >Exo3/Quatre echo "Cinquieme ligne" >Exo3/Cinq echo "Sixieme ligne" >Exo3/Six echo "Septieme ligne" >Exo3/Sept echo "Huitieme ligne" >Exo3/Huit echo "Neuvieme ligne" >Exo3/Neuf echo "Dixieme ligne" >Exo3/Dix Rponse 12.4 FILALI MOULAY RACHID Page : 102
REP=$(date +"%Y%m%d") test -e $REP if [ $? != 0 ] then mkdir $REP fi cp Exo3/* $REP rm Exo3/* for file in $REP/* do cat $file >> ~/Gros_fichier.$$ echo $file >> ~/$0.$$ done Rponse 12.5 # script5a.bash for FILE in /etc/* do if test -r $FILE then echo $FILE fi done # script5b.bash############################################################## for FILE in /etc/* do if test -w $FILE then echo $FILE fi done Rponse 12.6 for V in $(seq 0 $2) do echo $V" x "$1" = "$(expr $V "*" $1 ) done
Bonne chance
Page :
103