Comando head do Linux: exibição do início de arquivos

LinuxBeginner
Pratique Agora

Introdução

Neste laboratório, exploraremos o comando head no Linux, um recurso poderoso para visualizar rapidamente o início de arquivos de texto. Imagine que você é um detetive digital encarregado de examinar rapidamente vários arquivos em busca de informações importantes. O comando head será sua fiel lupa, permitindo espiar o começo dos arquivos sem precisar abri-los por completo.

Simularemos uma situação em que você investiga uma coleção de arquivos de registro de um servidor web movimentado. Seu objetivo será examinar esses registros com eficiência para identificar possíveis problemas e obter informações relevantes. Ao longo deste exercício prático, você aprenderá a usar o comando head de maneira eficaz, tornando a exploração de arquivos mais rápida e produtiva.

Entendendo os conceitos básicos do head

Nesta etapa, você examinará um arquivo de registro simples para entender como o head funciona.

Primeiro, acesse o diretório do projeto:

cd /home/labex/project

Agora, vamos usar o comando head em um arquivo chamado access.log:

head access.log

Você deverá ver uma saída semelhante a esta:

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

Por padrão, head exibe as 10 primeiras linhas do arquivo. Cada linha desse registro representa uma solicitação ao servidor web e informa o endereço IP, o horário, o método HTTP, o recurso solicitado, o código de status e o tamanho da resposta.

Personalizando a quantidade de linhas

Nesta etapa, você ajustará a quantidade de linhas exibidas pelo head.

Para visualizar somente as 5 primeiras linhas do registro, use a opção -n:

head -n 5 access.log

Este comando deverá produzir:

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

Isso é especialmente útil quando você procura uma informação específica próxima ao início do arquivo, mas não precisa visualizar todas as 10 linhas.

Examinando vários arquivos

Nesta etapa, você usará head para visualizar simultaneamente o início de vários arquivos.

Vamos examinar o começo de access.log e error.log:

head access.log error.log

Você deverá ver uma saída semelhante a esta:

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

Observe como o head separa claramente a saída de cada arquivo usando cabeçalhos. Isso é muito útil quando você precisa comparar rapidamente o início de vários arquivos.

Usando head com pipes

Nesta etapa, você combinará head com outro comando por meio de um pipe.

Suponha que você queira ver as 3 primeiras linhas de access.log, mas somente as partes que mostram o horário e o recurso solicitado. Para isso, use o comando cut junto com head:

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

Este comando deverá produzir:

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

A parte cut -d '"' -f2 access.log divide cada linha nas aspas e seleciona o segundo campo, que contém a solicitação HTTP. O caractere | envia essa saída para head -n 3, que exibe somente suas três primeiras linhas.

Essa combinação permite concentrar rapidamente a atenção em partes específicas das entradas de registro, tornando a investigação mais eficiente.

Investigando com head e grep

Nesta etapa, você combinará head com grep para procurar um padrão específico no registro.

Suponha que você tenha recebido relatos de atividades incomuns relacionadas à página /admin. Você quer verificar as primeiras ocorrências de /admin no registro de acesso:

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

Este comando deverá produzir algo parecido com:

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

A parte grep "/admin" access.log procura, em access.log, as linhas que contêm /admin. O caractere | envia essas linhas correspondentes para head -n 3, que exibe somente as três primeiras ocorrências.

Essa combinação permite concentrar rapidamente a atenção nas entradas relevantes do arquivo de registro, tornando a investigação mais objetiva e eficiente.

Explorando arquivos grandes com head

Nesta etapa, você usará head para examinar um arquivo de registro grande sem carregar todo o seu conteúdo na memória.

Vamos simular o trabalho com um arquivo grande usando access.log, com o qual já estamos trabalhando. Vamos supor que ele seja muito maior do que realmente é.

Primeiro, verifique o tamanho do arquivo:

ls -lh access.log

Agora, use head para visualizar as 15 primeiras linhas:

head -n 15 access.log

Você deverá ver uma saída semelhante à anterior, mas com 15 linhas em vez de 10.

O comando head é rápido porque lê apenas o início do arquivo e utiliza pouca memória, pois não carrega o conteúdo completo. Assim, você obtém uma visão rápida da estrutura e do conteúdo do arquivo.

Resumo

Neste laboratório, exploramos o comando head, uma ferramenta poderosa para examinar rapidamente o início dos arquivos. Aprendemos a:

  1. Usar head para visualizar, por padrão, as 10 primeiras linhas de um arquivo.
  2. Personalizar a quantidade de linhas exibidas usando a opção -n.
  3. Examinar vários arquivos simultaneamente com head.
  4. Combinar head com outros comandos, como cut e grep, usando pipes.
  5. Usar head para trabalhar com eficiência com arquivos grandes.

Parâmetros adicionais do head que não foram abordados neste laboratório:

  • -c: Exibe os primeiros bytes de um arquivo em vez das linhas.
  • -q: Suprime os cabeçalhos ao examinar vários arquivos.
  • -v: Sempre exibe os cabeçalhos ao examinar vários arquivos.