Introduction
Dans cet atelier, nous allons explorer la commande head sous Linux, un utilitaire puissant pour prévisualiser le début des fichiers texte. Imaginez que vous êtes un détective numérique chargé de scanner rapidement de nombreux fichiers pour trouver des informations cruciales. La commande head sera votre loupe de confiance, vous permettant de jeter un coup d'œil au début des fichiers sans avoir à les ouvrir entièrement.
Nous allons simuler un scénario dans lequel vous enquêtez sur une collection de fichiers journaux (logs) provenant d'un serveur web très fréquenté. Votre objectif est d'examiner efficacement ces journaux pour identifier des problèmes potentiels et recueillir des informations. Grâce à cet exercice pratique, vous apprendrez à utiliser la commande head de manière efficace, rendant vos tâches d'exploration de fichiers plus rapides et plus productives.
Comprendre les bases de head
Commençons par examiner un simple fichier journal pour comprendre le fonctionnement de head.
Tout d'abord, naviguez vers le répertoire du projet :
cd /home/labex/project
Maintenant, utilisons la commande head sur un fichier nommé access.log :
head access.log
Vous devriez voir une sortie similaire à celle-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 représente une requête unique au serveur web, indiquant 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
Parfois, 10 lignes peuvent être trop nombreuses ou insuffisantes. Apprenons à personnaliser le nombre de lignes affichées par head.
Pour visualiser uniquement les 5 premières lignes du journal, utilisez l'option -n :
head -n 5 access.log
Cette commande devrait afficher :
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
Cela peut s'avérer particulièrement utile lorsque vous recherchez une information spécifique située au tout début d'un fichier sans avoir besoin de voir l'intégralité des 10 lignes par défaut.
Examiner plusieurs fichiers
En tant que détective de fichiers, vous devez souvent consulter plusieurs fichiers rapidement. La commande head vous permet de visualiser les débuts de plusieurs fichiers simultanément.
Examinons les premières lignes de access.log et error.log :
head access.log error.log
Vous devriez voir une sortie similaire à celle-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/
Remarquez comment head sépare clairement le contenu de chaque fichier par des en-têtes. C'est extrêmement pratique lorsque vous devez comparer rapidement les premières lignes de plusieurs fichiers.
Utiliser head avec des tubes (Pipes)
En tant qu'expert en manipulation de fichiers, vous aurez souvent besoin de combiner des commandes pour filtrer et analyser les données plus efficacement. La commande head s'intègre parfaitement avec les tubes (pipes), vous permettant de l'enchaîner avec d'autres outils.
Supposons que vous souhaitiez voir les 3 premières lignes de access.log, mais en ne conservant que les parties indiquant l'horodatage et la ressource demandée. Vous pouvez utiliser la commande cut conjointement avec head pour y parvenir :
cut -d '"' -f2 access.log | head -n 3
Cette commande devrait afficher :
POST /about HTTP/1.1
GET /dashboard HTTP/1.1
DELETE /comment HTTP/1.1
Voici le détail de cette opération :
cut -d '"' -f2 access.log: Cette commande découpe chaque ligne au niveau des guillemets et sélectionne le deuxième champ, qui contient la requête HTTP.|: Ce tube redirige la sortie de la commandecutvers la commandehead.head -n 3: Cette commande n'affiche que les 3 premières lignes de l'entrée reçue.
Cette combinaison vous permet de vous concentrer rapidement sur des parties spécifiques des entrées de journal, rendant votre investigation plus efficace.
Enquêter avec head et grep
Maintenant, combinons head avec une autre commande puissante, grep, pour rechercher des motifs spécifiques dans nos journaux.
Supposons que vous ayez reçu des rapports d'activité inhabituelle concernant la page /admin. Vous voulez vérifier les premières occurrences de /admin dans le journal d'accès :
grep "/admin" access.log | head -n 3
Cette commande devrait afficher quelque chose comme :
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
Voici ce que fait cette commande :
grep "/admin" access.log: Recherche les lignes contenant "/admin" dans le fichier access.log.|: Redirige la sortie de grep vers la commande head.head -n 3: Affiche uniquement les 3 premières lignes de la sortie filtrée.
Cette combinaison vous permet de cibler rapidement les entrées pertinentes dans votre fichier journal, rendant votre analyse plus précise et rapide.
Explorer des fichiers volumineux avec head
Dans votre travail quotidien, vous rencontrerez souvent des fichiers journaux très volumineux. La commande head est particulièrement utile pour examiner rapidement le début de ces fichiers sans charger l'intégralité de leur contenu en mémoire.
Simulons le travail sur un gros fichier en utilisant le fichier access.log. Nous allons faire comme s'il était beaucoup plus volumineux qu'il ne l'est en réalité.
Tout d'abord, vérifions la taille du fichier :
ls -lh access.log
Maintenant, utilisons head pour visualiser les 15 premières lignes :
head -n 15 access.log
Vous devriez voir une sortie similaire à ce que nous avons vu précédemment, mais avec 15 lignes au lieu de 10.
La commande head est précieuse pour traiter des fichiers massifs car :
- Elle est rapide :
headne lit que le début du fichier, elle s'exécute donc instantanément, même pour des fichiers de plusieurs gigaoctets. - Elle est économe en mémoire :
headn'a pas besoin de charger tout le fichier dans la RAM. - Elle offre un aperçu immédiat : Vous pouvez comprendre la structure et le contenu du fichier sans avoir à l'ouvrir complètement.
Résumé
Dans cet atelier, nous avons exploré la commande head, un outil indispensable 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. - Personnaliser le nombre de lignes affichées avec l'option
-n. - Examiner plusieurs fichiers simultanément.
- Combiner
headavec d'autres commandes commecutetgrepvia des tubes. - Utiliser
headpour manipuler efficacement des fichiers volumineux.
Autres paramètres de head non abordés dans cet atelier :
-c: Affiche les premiers octets d'un fichier au lieu des lignes.-q: Supprime les en-têtes lors de l'examen de plusieurs fichiers.-v: Affiche toujours les en-têtes lors de l'examen de plusieurs fichiers.



