Pour ce TP, vous devrez rendre un petit rapport au format texte comportant vos remarques ainsi que les réponses aux questions posées.
Vous pouvez faire un minimum de mise en page, mais les document Word, OpenOffice ou pdf ne sont pas autorisés !
L'objectif de ce TP est de se familiariser avec le concept de fichier et la manière dont il sont gérés par le système d'exploitation.
Chaque fichiers ou répertoire est uniquement identifié par son chemin absolu :
/
" ("slash")
/
". Par exemple "/usr/local/bin
".
(On peut ajouter un caractère "/
" final sans modifier la signification : "/usr/local/bin/
")
/usr/local/bin/slock
".
Dans le shell, il est possible d'afficher le répertoire de travail avec la commande
$ pwd
(pwd
sont les initiales de "print working directory".)
Donnez, dans votre rapport, le chemin absolu correspondant :
Les motifs shell standards sont
bash | signification |
* |
joker (plusieurs caractères, éventuellement zéro) |
? |
joker (1 caractère) |
[...] |
caractère parmi ... |
[!...] |
caractère sauf ... |
\? \* |
caractères ? * |
Les jokers "?
" et "*
" ont une restriction : il ne peuvent pas correspondre au ".
" initial des fichiers cachés.
La commande find
s'utilise dans le shell :
$ find RÉPERTOIRE CONDITIONS
RÉPERTOIRE
est le répertoire à partir duquel on veut chercher (chemin relatif ou absolu)
CONDITIONS
donne les conditions recherchées :
-name "MOTIF"
qui permet de rechercher les fichiers dont le nom correspond à un motif,
-size +13k
permet de rechercher les fichiers dont la taille est supérieure à 13kio,
-mtime -3
permet de rechercher les fichiers qui ont été modifiés pendant les trois derniers jours,
find
pour pouvoir lister même les fichiers contenus dans des sous-répertoires...
Remarque : votre commande doit trouver tous vos fichiers Python des TP d'info201 et d'info202...
/usr/bin
dont l'extension est un unique chiffre impair. (Par exemple, sur ma machine, /usr/bin/python2.7
doit être listé, mais ni /usr/bin/python3.4
ni /usr/bin/pip3
ne doivent être listés.)
Chaque caractère ASCII est codé par un octet, ou plus précisément, par les 7 bits de poids faible d'un octet.
La commande
$ xxd -b FICHIER
permet d'afficher la représentation binaire d'un fichier.
Remarque : chaque ligne du résultat de xxd
commence par le numéro (en hexadécimal) du premier octet de la ligne :
0000000: ... # cette ligne commence à l'octet 0 0000010: ... # cette ligne commence à l'octet 16 (10 en hexadécimal) 0000020: ... # cette ligne commence à l'octet 32 (20 en hexadécimal)
Chaque octet du fichier est représenté dans la suite de la ligne par 8 bits (en mode binaire) ou 2 chiffres en hexadécimal (en mode hexadécimal).
Téléchargez les deux fichiers petit_fichier1.ascii et petit_fichier2.ascii.
wget
:
$ wget URL
xxd -b
) : à quoi correspond la différence constatée avec xxd
?
(table des caractères ASCII)
Les caractères accentués n'existent pas en ASCII. Ils sont codés :
Ouvrez, dans deux onglets différents de votre navigateur web, les fichiers petit_fichier.codage1 et petit_fichier.codage2.
Modifiez l'encodage des caractères (menu "affichage") des onglets correspondant. (Attention, dans certaines versions de Firefox / Iceweasel, la barre de menus est pas affichée. Il faut dans ce cas faire un clic droit en haut de la fenêtre du navigateur et cocher la case "barre de menus".)
Choisissez les codages
Quel est le fichier codé en UTF-8 ?
En utilisant la commande xxd
sur ces deux fichiers, donnez le codage en binaire de la lettre "É"
Les fichiers binaires sont constitués d'octets arbitraires. Le fichier lac.image contient une image binaire.
Téléchargez le fichier lac.image.
head -c100
et tail -c100
?
cat
?
xli
, display
, eog
ou gimp
? (Ces programmes sont des visualisateurs d'images, ou, pour le dernier, un logiciel d'édition d'images.)
Si l'affichage de votre terminal est corrompu par des octets non imprimables:
␉▒⎽: 2␌ : ␌⎺└└▒┼␍␊ ␋┼├⎼⎺┤┴▒␉┌␊ ⎻≤┴␊@└▒┤-59-14:·/Ti┌i␌▒⎼±␊└␊┼├⎽$ ⎻≤┴␊@└▒┤-59-14:·/Ti┌i␌▒⎼±␊└␊┼├⎽$ ⎼␊⎽␊├
il est possible de lancer la commande reset
pour réinitialiser l'affichage :
$ reset
Remarque : il est possible que les caractères que vous tapez au clavier (la commande "reset
") ne soient pas affichés correctement. Ce n'est pas gênant. Dans mon cas, "reset
" c'est affiché comme "⎼␊⎽␊├
"
$ xxd -g1 lac.image
lac.image
dans un fichier lac.hexa
. Vous devrez pour ceci rediriger l'affichage de la commande dans un fichier grâce à l'opérateur ">".
lac.hexa
dans un éditeur de texte (nano ou gedit). Les premières lignes ressemblent à
0000000: 50 36 0a 35 30 30 20 33 35 33 0a 32 35 35 0a 97 P6.500 353.255.. 0000010: c1 e6 80 b6 e2 7e b6 e4 78 b3 e1 79 b3 e1 7f b6 .....~..x..y.... 0000020: e2 86 b6 e2 8c b7 e1 8c b7 e1 8c ba e2 85 b8 e2 ................ 0000030: 7e b6 e1 7c b6 e4 7c b6 e4 79 b6 e4 77 b4 e2 77 ~..|..|..y..w..w 0000040: b3 e4 77 b4 e5 77 b4 e4 78 b5 e2 77 b5 e2 77 b5 ..w..w..x..w..w.
0000000: 50 36 0a 35 30 30 20 33 35 33 0a 32 35 35 0a 97 P6.500 353.255..
... 30 32 20 ...
lac.hexa
en binaire grâce à la commande xxd -r lac.hexa
. Sauvegardez le résultat dans un nouveau fichier lac2.image
grâce à une redirection ">" et visualisez le résultat avec xli
, display
, eog
ou gimp
.
Qu'en pensez-vous ?
Proposez une explication ?
lac.hexa
d'origine, modifiez maintenant l'octet 12 en remplaçant
0000000: 50 36 0a 35 30 30 20 33 35 33 0a 32 35 35 0a 97 P6.500 353.255..
... 0a 30 35 ...
lac.hexa
en binaire grâce à la commande xxd -r lac.hexa
. Sauvegardez le résultat dans un nouveau fichier lac3.image
grâce à une redirection ">" et visualisez le résultat avec xli
, display
, eog
ou gimp
.
Qu'en pensez-vous ?
lac.hexa
d'origine, modifiez maintenant l'octet 2 en remplaçant
0000000: 50 36 0a 35 30 30 20 33 35 33 0a 32 35 35 0a 97 P6.500 353.255..
... 50 35 0a ...
lac.hexa
en binaire dans un nouveau fichier lac4.image
et visualisez le résultat avec xli
, display
, eog
ou gimp
.
Qu'en pensez-vous ?
lac.hexa
d'origine, modifiez maintenant l'octet 2 en remplaçant
0000000: 50 36 0a 35 30 30 20 33 35 33 0a 32 35 35 0a 97 P6.500 353.255..
... 50 38 0a ...
lac.hexa
dans un nouveau fichier lac5.image
et visualisez le résultat avec xli
, display
, eog
ou gimp
.
Qu'en pensez-vous ?
lac.hexa
d'origine, modifiez maintenant la ligne 5 en remplaçant
0000040: b3 e4 77 b4 e5 77 b4 e4 78 b5 e2 77 b5 e2 77 b5
0000040: b3 e4 ff 00 00 ff 00 00 ff 00 00 ff 00 00 77 b5
lac.hexa
dans un nouveau fichier lac6.image
et visualisez le résultat avec xli
, display
, eog
ou gimp
.
Qu'en pensez-vous ?
À faire à la fin du TP, si vous avez le temps
Reportez vous à la description des formats PPM et expliquez les modifications qui ont été faites sur les images.
Comme le montrait le fichier lac.image, l'extension d'un fichier n'est pas forcément représentative du type réel du fichier.
La commande
$ file FICHIER1 ... FICHIERn
essaie de "deviner" le type des fichiers en regardant les premiers octets.
Utilisez la commande file
pour donner le type des fichiers
lac.hexa
Les méta-données d'un fichier sont obtenues en ajoutant l'option "-l
" à la commande ls
:
$ ls -l ... -rw-r--r-- 1 hyvernat hyvernat 10016 avril 3 07:42 enseignement.php ...
Chaque ligne du résultat se décompose comme suit :
-rw-r--r-- 1 hyvernat hyvernat 10016 avril 3 07:42 enseignement.php ---------- - -------- -------- ----- -------------- ---------------- | | | | | | | | | | | | | +-----> nom du fichier | | | | | | | | | | | +-----> date de modification | | | | | | | | | +-----> taille (en octets) | | | | | | | +-----> groupe propriétaire | | | | | +-----> utilisateur propriétaire | | | +-----> nombre de liens physiques (que vous pouvez ignorer) | +-----> droits d'accès
L'administrateur peut modifier le propriétaire d'un fichier avec la commande
$ chown PROPRIÉTAIRE FICHIER1 ... FICHIERn
Parmi les métadonnées importantes d'un fichier se trouvent les droits d'accès. Les droits d'accès Unix sont divisés en trois sous-parties :
Il y a 3 types de droits d'accès :
Nous allons ignorer le droit d'exécution pour ce TP...
La manière utilisée pour vous donner accès à vos fichiers (CIFS : "Common Internet File System") ne supporte pas le droit d'accès "exécution" sur les fichiers. Tous les fichiers et répertoires de votre répertoire personnels sont automatiquement exécutable pour tout le monde. Vous pouvez observer des fichiers sans droit "eXecute" dans le répertoire "/tmp/
".
Les droits d'accès des groupes sont également gérés de manière particulière. Nous n'allons pas nous en occuper...
Ces droits sont affichés dans les premières colonnes du résultat et sont donnés par des codes:
- rw- r-- r-- | ||| ||| ||| | ||| ||| ||+-----> 'x' lorsque le monde a le droit d'exécution | ||| ||| || '-' sinon | ||| ||| || | ||| ||| |+-----> 'w' lorsque le monde a le droit d'écriture | ||| ||| | '-' sinon | ||| ||| | | ||| ||| +-----> 'r' lorsque le monde a le droit de lecture | ||| ||| '-' sinon | ||| ||| | ||| ||| | ||| ||+-----> 'x' lorsque le groupe a le droit d'exécution | ||| || '-' sinon | ||| || | ||| |+-----> 'w' lorsque le groupe a le droit d'écriture | ||| | '-' sinon | ||| | | ||| +-----> 'r' lorsque le groupe a le droit de lecture | ||| '-' sinon | ||| | ||| | ||+-----> 'x' lorsque le propriétaire a le droit d'exécution | || '-' sinon | || | |+-----> 'w' lorsque le propriétaire a le droit d'écriture | | '-' sinon | | | +-----> 'r' lorsque le propriétaire a le droit de lecture | '-' sinon | +-----> '-' pour les fichiers 'd' pour les répertoires (autre symboles pour d'autres type de fichiers)
La commande pour modifier les droits d'accès d'un fichier / répertoire est la suivante :
$ chmod MODE FICHIER1 ... FICHIERn
Vous pouvez consulter la description complète du mode en faisant
$ man chmod
Voici quelques exemples :
$ chmod u-w FICHIER
$ chmod o+w,u-r FICHIER
$ chmod -r FICHIER
/tmp/
".
$ echo "coucou" > FICHIER
$ echo "ciao" >> FICHIER
$ cat FICHIER
cat
par head
ou tail
pour avoir le début ou la fin du fichier...)
test.txt
contenant la chaine "Bonjour".
test.txt
contenant la chaine "Bonjour", et enlevez son droit de lecture (pour le propriétaire)
Les répertoires ont également les droits d'accès "Read" et "Write".
D--
, Dr-
, D-w
et Drw
, contenant chacun un fichier test.txt
avec la ligne "coucou".
D--
: ni lecture ni écriture,
Dr-
: lecture, pas écriture,
D-w
: pas lecture, écriture,
Drw
: lecture et écriture.
La commande
$ ls -l
affiche les méta-données des fichiers, dont en particulier la taille (en octets) des données.
La commande
$ ls -s
affiche la taille occupée par les fichiers, en kibioctets.
Cette taille est différente de la précédente car chaque bloc occupé partiellement par le fichier est compté comme utilisé.
Dans les deux cas, il est conseillé d'ajouter l'option -h
pour que les tailles soient affichées en utilisant les unités standards (k, M, G etc.)
$ ls -lh ... $ ls -sh ...
Vous pouvez également avoir les deux tailles directement avec
$ ls -lsh
Créez un fichier vide avec la commande
$ touch FICHIER
(Attention, si le fichier existe, cette commande change simplement sa date de modification !)
Et un petit fichier contenant "Spock" avec la commande
$ echo "Spock" > FICHIER
/tmp/
" et répondez aux même questions. Qu'en pensez-vous ?
Le petit programme create_sparse_file.py s'utilise de la manière suivante :
$ python3 create_sparse_file.py TAILLE
permet de créer un fichier avec les propriété suivantes :
TAILLE
peut utiliser les unités habituelles : k
pour kibioctet, et M
pour mebioctet),
START
",
END
",
Créez un fichier de 100 octets avec le programme create_sparse_file.py et
xxd
).
Créez un fichier de 29kio octets avec le programme create_sparse_file.py.
ls -lh
?
ls -sh
?
Recopiez le fichier (avec la commande cp
) dans le même répertoire, avec un autre nom.
ls -lh
?
ls -sh
?
Refaites les même opérations avec une taille de 1Mio et 10Mio. Notez le résultat et proposez une explication...