Введение
В этой лабораторной работе мы изучим команду head в Linux — мощный инструмент для предварительного просмотра начала текстовых файлов. Представьте, что вы — цифровой детектив, которому поручено быстро просканировать множество файлов в поисках важной информации. Команда head станет вашим верным увеличительным стеклом, позволяющим заглянуть в начало файлов, не открывая их целиком.
Мы смоделируем ситуацию, в которой вы расследуете коллекцию лог-файлов (журналов) загруженного веб-сервера. Ваша цель — эффективно изучить эти логи, чтобы выявить потенциальные проблемы и собрать аналитические данные. Благодаря этому практическому упражнению вы научитесь эффективно использовать команду head, что сделает ваши задачи по исследованию файлов быстрее и продуктивнее.
Основы работы с head
Давайте начнем с изучения простого лог-файла, чтобы понять, как работает head.
Сначала перейдите в каталог проекта:
cd /home/labex/project
Теперь применим команду head к файлу с именем access.log:
head access.log
Вы должны увидеть вывод, похожий на этот:
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
По умолчанию head отображает первые 10 строк файла. Каждая строка в этом логе представляет собой отдельный запрос к веб-серверу, показывая IP-адрес, временную метку, метод HTTP, запрашиваемый ресурс, код состояния и размер ответа.
Настройка количества строк
Иногда 10 строк может быть слишком много или слишком мало. Давайте научимся изменять количество строк, которые выводит head.
Чтобы просмотреть только первые 5 строк лога, используйте опцию -n:
head -n 5 access.log
Эта команда выведет:
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
Это особенно полезно, когда вы ищете конкретную информацию в самом начале файла и вам не нужно видеть все 10 строк.
Просмотр нескольких файлов
Как детективу данных, вам часто приходится быстро просматривать несколько файлов. Команда head позволяет видеть начало сразу нескольких файлов.
Давайте изучим начало файлов access.log и error.log:
head access.log error.log
Вы увидите вывод, подобный этому:
==> 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/
Обратите внимание, как head четко разделяет вывод каждого файла с помощью заголовков. Это невероятно удобно, когда нужно быстро сравнить содержимое нескольких файлов.
Использование head с конвейерами (Pipes)
Как опытный исследователь, вы часто будете комбинировать команды для более эффективной фильтрации и анализа данных. Команда head отлично работает с конвейерами, позволяя связывать её с другими утилитами.
Допустим, вы хотите увидеть первые 3 строки access.log, но только те части, которые содержат временную метку и запрашиваемый ресурс. Для этого можно использовать команду cut вместе с head:
cut -d '"' -f2 access.log | head -n 3
Эта команда выведет:
POST /about HTTP/1.1
GET /dashboard HTTP/1.1
DELETE /comment HTTP/1.1
Разберем, что делает эта команда:
cut -d '"' -f2 access.log: Разделяет каждую строку по символу кавычки и выбирает второе поле, которое содержит HTTP-запрос.|: Передает (направляет) вывод командыcutна вход командеhead.head -n 3: Отображает только первые 3 строки из полученных данных.
Такая комбинация позволяет быстро сфокусироваться на конкретных частях записей лога, делая ваше расследование более эффективным.
Расследование с помощью head и grep
Теперь давайте объединим head с другой мощной командой — grep, чтобы искать определенные шаблоны в наших логах.
Предположим, вы получили сообщения о подозрительной активности, связанной со страницей /admin. Вы хотите проверить первые несколько упоминаний /admin в логе доступа:
grep "/admin" access.log | head -n 3
Эта команда должна вывести что-то вроде:
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
Логика работы команды:
grep "/admin" access.log: Ищет строки, содержащие "/admin", в файле access.log.|: Передает результаты поиска команде head.head -n 3: Показывает только первые 3 найденные строки.
Это сочетание позволяет мгновенно находить нужные записи в огромных файлах, делая ваш поиск целенаправленным.
Изучение больших файлов с помощью head
В работе системного администратора или аналитика часто встречаются очень большие лог-файлы. Команда head незаменима для быстрого ознакомления с началом таких файлов без загрузки всего их содержимого в оперативную память.
Давайте сымитируем работу с большим файлом, используя наш access.log. Представим, что он гораздо больше, чем на самом деле.
Сначала проверим размер файла:
ls -lh access.log
Теперь используем head, чтобы просмотреть первые 15 строк:
head -n 15 access.log
Вы увидите вывод, аналогичный предыдущим шагам, но теперь в нем будет 15 строк.
Команда head особенно ценна при работе с гигантскими файлами, потому что:
- Она быстрая:
headчитает только начало файла, поэтому выполняется мгновенно даже для файлов размером в несколько гигабайт. - Она экономит память:
headне нужно загружать весь файл целиком. - Она дает быстрый обзор: Вы можете понять структуру и формат данных, не открывая весь файл.
Резюме
В этой лабораторной работе мы изучили команду head — мощный инструмент для быстрого просмотра начала файлов. Мы научились:
- Использовать
headдля просмотра первых 10 строк файла по умолчанию. - Настраивать количество отображаемых строк с помощью опции
-n. - Просматривать несколько файлов одновременно.
- Комбинировать
headс другими командами, такими какcutиgrep, используя конвейеры. - Эффективно работать с большими файлами с помощью
head.
Дополнительные параметры head, не затронутые в этой работе:
-c: Отобразить первые несколько байт файла вместо строк.-q: Не выводить заголовки при просмотре нескольких файлов.-v: Всегда выводить заголовки с именами файлов.



