Linux head-Befehl: Anzeige des Dateianfangs

LinuxLinuxBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir den head-Befehl in Linux erkunden, ein leistungsstarkes Werkzeug zum Vorschauen des Anfangs von Textdateien. Stellen Sie sich vor, Sie sind ein digitaler Detektiv, der mit der Aufgabe betraut ist, schnell durch zahlreiche Dateien zu blättern, um wichtige Informationen zu finden. Der head-Befehl wird Ihre zuverlässige Lupe sein und Ihnen ermöglichen, den Anfang von Dateien zu betrachten, ohne sie vollständig zu öffnen.

Wir werden ein Szenario simulieren, in dem Sie eine Sammlung von Protokolldateien (Logfiles) eines stark frequentierten Webservers untersuchen. Ihr Ziel ist es, diese Protokolle effizient zu prüfen, um potenzielle Probleme zu identifizieren und Erkenntnisse zu gewinnen. Durch diese praktische Übung werden Sie lernen, wie Sie den head-Befehl effektiv nutzen können, wodurch Ihre Dateisuche schneller und effizienter wird.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/head("File Beginning Display") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") subgraph Lab Skills linux/ls -.-> lab-214302{{"Linux head-Befehl: Anzeige des Dateianfangs"}} linux/head -.-> lab-214302{{"Linux head-Befehl: Anzeige des Dateianfangs"}} linux/grep -.-> lab-214302{{"Linux head-Befehl: Anzeige des Dateianfangs"}} end

Grundlagen des head-Befehls verstehen

Beginnen wir damit, eine einfache Protokolldatei (Logfile) zu untersuchen, um zu verstehen, wie der head-Befehl funktioniert.

Zunächst navigieren Sie in das Projektverzeichnis:

cd /home/labex/project

Nun verwenden wir den head-Befehl auf einer Datei namens access.log:

head access.log

Sie sollten eine Ausgabe ähnlich dieser sehen:

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

Standardmäßig zeigt head die ersten 10 Zeilen der Datei an. Jede Zeile in diesem Protokoll repräsentiert eine einzelne Anfrage an den Webserver und zeigt die IP-Adresse, den Zeitstempel, die HTTP-Methode, die angeforderte Ressource, den Statuscode und die Antwortgröße an.

Anpassen der Anzahl der Zeilen

Manchmal können 10 Zeilen zu viele oder zu wenige sein. Lassen Sie uns lernen, wie Sie die Anzahl der Zeilen anpassen können, die head anzeigt.

Um nur die ersten 5 Zeilen des Protokolls (Log) anzuzeigen, verwenden Sie die Option -n:

head -n 5 access.log

Dieser Befehl sollte folgende Ausgabe liefern:

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

Dies kann besonders nützlich sein, wenn Sie nach bestimmten Informationen am Anfang einer Datei suchen, aber nicht alle 10 Zeilen sehen müssen.

Untersuchung mehrerer Dateien

Als Datei-Detektiv müssen Sie oft schnell mehrere Dateien betrachten. Der head-Befehl ermöglicht es Ihnen, den Anfang mehrerer Dateien gleichzeitig anzuzeigen.

Lassen Sie uns den Anfang von sowohl access.log als auch error.log untersuchen:

head access.log error.log

Sie sollten eine Ausgabe ähnlich dieser sehen:

==> 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/

Beachten Sie, wie head die Ausgabe jeder Datei mit Überschriften klar trennt. Dies ist unglaublich nützlich, wenn Sie schnell den Anfang mehrerer Dateien vergleichen müssen.

Verwenden von head mit Pipes

Als erfahrener Datei-Detektiv müssen Sie oft Befehle kombinieren, um Daten effektiver zu filtern und zu analysieren. Der head-Befehl funktioniert gut mit Pipes (Rohrleitungen), wodurch Sie ihn mit anderen Befehlen verketten können.

Nehmen wir an, Sie möchten die ersten 3 Zeilen von access.log sehen, aber nur die Teile, die den Zeitstempel und die angeforderte Ressource anzeigen. Sie können den cut-Befehl zusammen mit head verwenden, um dies zu erreichen:

cut -d '"' -f2 access.log | head -n 3

Dieser Befehl sollte folgende Ausgabe liefern:

POST /about HTTP/1.1
GET /dashboard HTTP/1.1
DELETE /comment HTTP/1.1

So funktioniert dieser Befehl:

  1. cut -d '"' -f2 access.log: Dieser Befehl teilt jede Zeile an den Anführungszeichen auf und wählt das zweite Feld aus, das die HTTP-Anfrage enthält.
  2. |: Dieser Operator leitet die Ausgabe des cut-Befehls an den head-Befehl weiter.
  3. head -n 3: Dieser Befehl zeigt nur die ersten 3 Zeilen der weitergeleiteten Eingabe an.

Diese Kombination ermöglicht es Ihnen, sich schnell auf bestimmte Teile der Protokolleinträge zu konzentrieren und Ihre Untersuchung effizienter zu gestalten.

Untersuchung mit head und grep

Nun kombinieren wir head mit einem anderen leistungsstarken Befehl, grep, um in unseren Protokollen (Logs) nach bestimmten Mustern zu suchen.

Angenommen, Sie haben Berichte über ungewöhnliche Aktivitäten im Zusammenhang mit der /admin-Seite erhalten. Sie möchten die ersten wenigen Vorkommen von /admin im Zugriffsprotokoll (Access-Log) überprüfen:

grep "/admin" access.log | head -n 3

Dieser Befehl sollte eine Ausgabe ähnlich der folgenden liefern:

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

Dieser Befehl führt folgende Schritte aus:

  1. grep "/admin" access.log: Sucht in der Datei access.log nach Zeilen, die "/admin" enthalten.
  2. |: Leitet die Ausgabe von grep an den head-Befehl weiter.
  3. head -n 3: Zeigt nur die ersten 3 Zeilen der weitergeleiteten Eingabe an.

Diese Kombination ermöglicht es Ihnen, sich schnell auf relevante Einträge in Ihrer Protokolldatei zu konzentrieren und Ihre Untersuchung gezielter und effizienter zu gestalten.

Erkundung großer Dateien mit head

Als Datei-Detektiv stoßen Sie oft auf sehr große Protokolldateien (Log-Dateien). Der head-Befehl ist besonders nützlich, um schnell den Anfang dieser Dateien zu untersuchen, ohne den gesamten Inhalt in den Speicher zu laden.

Lassen Sie uns die Arbeit mit einer großen Datei simulieren, indem wir die access.log-Datei verwenden, mit der wir bereits gearbeitet haben. Wir stellen uns vor, dass sie viel größer ist als sie tatsächlich ist.

Zunächst überprüfen wir die Dateigröße:

ls -lh access.log

Nun verwenden wir head, um die ersten 15 Zeilen anzuzeigen:

head -n 15 access.log

Sie sollten eine Ausgabe ähnlich derjenigen sehen, die wir bereits gesehen haben, aber mit 15 Zeilen anstelle von 10.

Der head-Befehl ist besonders wertvoll, wenn es um sehr große Dateien geht, weil:

  1. Er schnell ist: head liest nur den Anfang der Datei, daher wird er auch für riesige Dateien schnell abgeschlossen.
  2. Er speichereffizient ist: head muss die gesamte Datei nicht in den Speicher laden.
  3. Er Ihnen eine schnelle Vorschau gibt: Sie können sich eine Vorstellung von der Struktur und dem Inhalt der Datei machen, ohne die gesamte Datei zu öffnen.

Zusammenfassung

In diesem Lab haben wir den head-Befehl erkundet, ein leistungsstarkes Werkzeug zum schnellen Untersuchen des Anfangs von Dateien. Wir haben gelernt, wie man:

  1. Standardmäßig die ersten 10 Zeilen einer Datei mit head anzeigt.
  2. Die Anzahl der angezeigten Zeilen mit der Option -n anpasst.
  3. Mit head mehrere Dateien gleichzeitig untersucht.
  4. head mit anderen Befehlen wie cut und grep mithilfe von Pipes kombiniert.
  5. head effizient für die Arbeit mit großen Dateien einsetzt.

Zusätzliche head-Parameter, die in diesem Lab nicht behandelt wurden:

  • -c: Zeigt die ersten Bytes einer Datei anstelle von Zeilen an.
  • -q: Unterdrückt Überschriften beim Untersuchen mehrerer Dateien.
  • -v: Zeigt immer Überschriften beim Untersuchen mehrerer Dateien an.

Ressourcen