Introduction
Dans ce laboratoire, nous allons découvrir la commande head sous Linux, un outil particulièrement pratique pour prévisualiser le début des fichiers texte. Imaginez que vous êtes un enquêteur numérique chargé d’examiner rapidement une multitude de fichiers afin d’y repérer des informations importantes. La commande head sera votre loupe : elle vous permettra de consulter les premières lignes d’un fichier sans avoir à l’ouvrir entièrement.
Nous allons simuler une situation dans laquelle vous analysez un ensemble de fichiers journaux provenant d’un serveur web très sollicité. Votre objectif sera d’examiner efficacement ces journaux afin d’identifier d’éventuels problèmes et d’en tirer des informations utiles. À travers cet exercice pratique, vous apprendrez à exploiter la commande head avec efficacité pour accélérer et simplifier vos tâches d’exploration de fichiers.
Comprendre les bases de head
Dans cette étape, vous allez examiner un fichier journal simple afin de comprendre le fonctionnement de head.
Commencez par accéder au répertoire du projet :
cd /home/labex/project
Utilisons maintenant la commande head sur un fichier nommé access.log :
head access.log
Vous devriez obtenir un résultat similaire à celui-ci :
192.168.1.100 - - [01/Jan/2024:00:00:01 +0000] "GET /index.html HTTP/1.1" 200 1234
192.168.1.101 - - [01/Jan/2024:00:00:02 +0000] "GET /style.css HTTP/1.1" 200 567
192.168.1.102 - - [01/Jan/2024:00:00:03 +0000] "GET /logo.png HTTP/1.1" 200 2345
192.168.1.103 - - [01/Jan/2024:00:00:04 +0000] "POST /login HTTP/1.1" 302 -
192.168.1.104 - - [01/Jan/2024:00:00:05 +0000] "GET /dashboard HTTP/1.1" 200 3456
192.168.1.105 - - [01/Jan/2024:00:00:06 +0000] "GET /api/user HTTP/1.1" 200 789
192.168.1.106 - - [01/Jan/2024:00:00:07 +0000] "GET /images/banner.jpg HTTP/1.1" 200 4567
192.168.1.107 - - [01/Jan/2024:00:00:08 +0000] "POST /comment HTTP/1.1" 201 -
192.168.1.108 - - [01/Jan/2024:00:00:09 +0000] "GET /search?q=linux HTTP/1.1" 200 2345
192.168.1.109 - - [01/Jan/2024:00:00:10 +0000] "GET /about HTTP/1.1" 200 1234
Par défaut, head affiche les 10 premières lignes du fichier. Chaque ligne de ce journal correspond à une requête adressée au serveur web et indique l’adresse IP, l’horodatage, la méthode HTTP, la ressource demandée, le code d’état et la taille de la réponse.
Personnaliser le nombre de lignes
Dans cette étape, vous allez définir le nombre de lignes affichées par head.
Pour n’afficher que les 5 premières lignes du journal, utilisez l’option -n :
head -n 5 access.log
Cette commande devrait produire le résultat suivant :
192.168.1.100 - - [01/Jan/2024:00:00:01 +0000] "GET /index.html HTTP/1.1" 200 1234
192.168.1.101 - - [01/Jan/2024:00:00:02 +0000] "GET /style.css HTTP/1.1" 200 567
192.168.1.102 - - [01/Jan/2024:00:00:03 +0000] "GET /logo.png HTTP/1.1" 200 2345
192.168.1.103 - - [01/Jan/2024:00:00:04 +0000] "POST /login HTTP/1.1" 302 -
192.168.1.104 - - [01/Jan/2024:00:00:05 +0000] "GET /dashboard HTTP/1.1" 200 3456
Cette possibilité est particulièrement utile lorsque vous recherchez une information située au début d’un fichier, sans avoir besoin d’afficher les 10 lignes habituelles.
Examiner plusieurs fichiers
Dans cette étape, vous allez utiliser head pour afficher simultanément le début de plusieurs fichiers.
Examinons les premières lignes de access.log et error.log :
head access.log error.log
Vous devriez obtenir un résultat similaire à celui-ci :
==> access.log <==
192.168.1.120 - - [01/Jan/2024:00:00:53 +0000] "POST /about HTTP/1.1" 200 7616
192.168.1.147 - - [01/Jan/2024:00:00:45 +0000] "GET /dashboard HTTP/1.1" 200 7348
192.168.1.138 - - [01/Jan/2024:00:00:03 +0000] "DELETE /comment HTTP/1.1" 400 8341
192.168.1.138 - - [01/Jan/2024:00:00:31 +0000] "DELETE /about HTTP/1.1" 200 3254
192.168.1.122 - - [01/Jan/2024:00:00:15 +0000] "PUT /index.html HTTP/1.1" 500 6061
192.168.1.125 - - [01/Jan/2024:00:00:09 +0000] "DELETE /logo.png HTTP/1.1" 301 4916
192.168.1.148 - - [01/Jan/2024:00:00:33 +0000] "POST /admin/dashboard HTTP/1.1" 201 5546
192.168.1.146 - - [01/Jan/2024:00:00:56 +0000] "GET /images/banner.jpg HTTP/1.1" 301 2332
192.168.1.195 - - [01/Jan/2024:00:00:12 +0000] "DELETE /dashboard HTTP/1.1" 404 6740
192.168.1.136 - - [01/Jan/2024:00:00:18 +0000] "GET /login HTTP/1.1" 200 2374
==> error.log <==
[01/Jan/2024:00:01:23 +0000] [error] [client 192.168.1.150] File does not exist: /var/www/html/missing.html
[01/Jan/2024:00:02:34 +0000] [error] [client 192.168.1.151] PHP Parse error: syntax error, unexpected ';' in /var/www/html/index.php on line 30
[01/Jan/2024:00:03:45 +0000] [warn] [client 192.168.1.152] ModSecurity: Access denied with code 403 (phase 2). Matched phrase "sql injection attempt" at REQUEST_URI. [file "/etc/modsecurity/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [line "50"] [id "942100"] [rev ""] [msg "SQL Injection Attack Detected via libinjection"] [data "Matched Data: SQL injection found within REQUEST_URI: /vulnerable.php?id=1'"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.0"] [maturity "0"] [accuracy "0"] [hostname "example.com"] [uri "/vulnerable.php"] [unique_id "YvKp2H8AAQEAAAxxBGIAAAAC"]
[01/Jan/2024:00:04:56 +0000] [error] [client 192.168.1.153] AH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /var/www/html/db.php:15...'
[01/Jan/2024:00:05:67 +0000] [warn] [client 192.168.1.154] ModSecurity: Warning. Matched "Operator \`Ge' with parameter \`5' against variable \`TX:ANOMALY_SCORE' (Value: \`5' ) [file "/etc/modsecurity/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "57"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [data ""] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.0"] [maturity "0"] [accuracy "0"] [hostname "example.com"] [uri "/admin"] [unique_id "YvKp2H8AAQEAAAxxBGIAAAAD"]
[01/Jan/2024:00:06:78 +0000] [error] [client 192.168.1.155] PCE: Can't open perl script "/var/www/html/cgi-bin/printenv": No such file or directory
[01/Jan/2024:00:07:89 +0000] [warn] [client 192.168.1.156] ModSecurity: Access denied with code 403 (phase 2). Matched phrase "directory traversal attempt" at ARGS:file. [file "/etc/modsecurity/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "75"] [id "930110"] [rev ""] [msg "Path Traversal Attack (/../)"] [data "Matched Data: ../ found within ARGS:file: ../../../etc/passwd"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.0"] [maturity "0"] [accuracy "0"] [hostname "example.com"] [uri "/download.php"] [unique_id "YvKp2H8AAQEAAAxxBGIAAAAE"]
[01/Jan/2024:00:08:90 +0000] [error] [client 192.168.1.157] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in /var/www/html/memory_hog.php on line 10
[01/Jan/2024:00:09:01 +0000] [warn] [client 192.168.1.158] ModSecurity: Warning. Pattern match "(?i:(?:[\s'\"`_''\(\)]*?(?:[\d\w]+[\s'\"`_''\(\)]*?){2,}[\s'\"`_''\(\)]*?(?:having|rongjitest|select|union|where|get_lst))" at ARGS:username. [file "/etc/modsecurity/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [line "1126"] [id "942480"] [rev ""] [msg "SQL Injection Attack"] [data "Matched Data: union select found within ARGS:username: admin' UNION SELECT password FROM users--"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.0"] [maturity "0"] [accuracy "0"] [hostname "example.com"] [uri "/login.php"] [unique_id "YvKp2H8AAQEAAAxxBGIAAAAF"]
[01/Jan/2024:00:10:12 +0000] [error] [client 192.168.1.159] AH01797: client denied by server configuration: /var/www/html/restricted/
Vous remarquerez que head sépare clairement le contenu de chaque fichier à l’aide d’en-têtes. C’est très pratique pour comparer rapidement le début de plusieurs fichiers.
Utiliser head avec des tubes
Dans cette étape, vous allez associer head à une autre commande à l’aide d’un tube.
Supposons que vous souhaitiez afficher les 3 premières lignes de access.log, mais uniquement les éléments contenant l’horodatage et la ressource demandée. Pour cela, vous pouvez utiliser la commande cut avec head :
cut -d '"' -f2 access.log | head -n 3
Cette commande devrait produire le résultat suivant :
POST /about HTTP/1.1
GET /dashboard HTTP/1.1
DELETE /comment HTTP/1.1
La partie cut -d '"' -f2 access.log découpe chaque ligne au niveau des guillemets et sélectionne le deuxième champ, qui contient la requête HTTP. Le symbole | transmet ensuite cette sortie à head -n 3, qui n’en affiche que les trois premières lignes.
Cette combinaison permet de se concentrer rapidement sur certaines parties des entrées du journal et rend l’analyse plus efficace.
Analyser les journaux avec head et grep
Dans cette étape, vous allez associer head à grep pour rechercher un motif précis dans le journal.
Supposons que plusieurs signalements fassent état d’une activité inhabituelle liée à la page /admin. Vous souhaitez vérifier les premières occurrences de /admin dans le journal d’accès :
grep "/admin" access.log | head -n 3
Cette commande devrait produire un résultat similaire à celui-ci :
192.168.1.148 - - [01/Jan/2024:00:00:33 +0000] "POST /admin/dashboard HTTP/1.1" 201 5546
192.168.1.115 - - [01/Jan/2024:00:00:22 +0000] "PUT /admin HTTP/1.1" 302 1113
192.168.1.163 - - [01/Jan/2024:00:00:56 +0000] "POST /admin/dashboard HTTP/1.1" 301 815
La partie grep "/admin" access.log recherche dans access.log les lignes contenant /admin. Le symbole | transmet les lignes correspondantes à head -n 3, qui n’affiche que les trois premières occurrences.
Cette association permet de cibler rapidement les entrées pertinentes du journal et de rendre votre analyse plus précise et plus efficace.
Explorer des fichiers volumineux avec head
Dans cette étape, vous allez utiliser head pour examiner un fichier journal volumineux sans charger tout son contenu en mémoire.
Pour simuler le travail sur un fichier de grande taille, nous allons utiliser le fichier access.log étudié jusqu’à présent. Nous ferons comme s’il était bien plus volumineux qu’il ne l’est réellement.
Commencez par vérifier la taille du fichier :
ls -lh access.log
Utilisons maintenant head pour afficher les 15 premières lignes :
head -n 15 access.log
Vous devriez obtenir un résultat similaire à celui observé précédemment, mais avec 15 lignes au lieu de 10.
La commande head est rapide, car elle ne lit que le début du fichier. Elle consomme également peu de mémoire puisqu’elle ne charge pas l’intégralité de son contenu. Vous obtenez ainsi un aperçu immédiat de la structure et du contenu du fichier.
Résumé
Dans ce laboratoire, nous avons découvert la commande head, un outil puissant pour examiner rapidement le début des fichiers. Nous avons appris à :
- Utiliser
headpour afficher par défaut les 10 premières lignes d’un fichier. - Modifier le nombre de lignes affichées à l’aide de l’option
-n. - Examiner plusieurs fichiers simultanément avec
head. - Combiner
headavec d’autres commandes telles quecutetgrepà l’aide de tubes. - Utiliser
headpour travailler efficacement avec des fichiers volumineux.
Autres options de head non abordées dans ce laboratoire :
-c: afficher les premiers octets d’un fichier au lieu de ses premières lignes.-q: masquer les en-têtes lors de l’examen de plusieurs fichiers.-v: toujours afficher les en-têtes lors de l’examen de plusieurs fichiers.



