Comando head do Linux: Exibição do Início de Arquivos

LinuxBeginner
Pratique Agora

Introdução

Neste laboratório, vamos explorar o comando head no Linux, um utilitário poderoso para visualizar o início de arquivos de texto. Imagine que você é um detetive digital encarregado de escanear rapidamente inúmeros arquivos para encontrar informações cruciais. O comando head será sua fiel lupa, permitindo que você dê uma espiada no começo dos arquivos sem precisar abri-los inteiramente.

Simularemos um cenário onde você está investigando uma coleção de arquivos de log de um servidor web movimentado. Seu objetivo é examinar esses logs de forma eficiente para identificar possíveis problemas e obter insights. Através deste exercício prático, você aprenderá a usar o comando head de maneira eficaz, tornando suas tarefas de exploração de arquivos mais rápidas e produtivas.

Compreendendo o Básico do head

Vamos começar examinando um arquivo de log simples para entender como o head funciona.

Primeiro, navegue até 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, o head exibe as primeiras 10 linhas do arquivo. Cada linha neste log representa uma única requisição ao servidor web, mostrando o endereço IP, o carimbo de data/hora, o método HTTP, o recurso solicitado, o código de status e o tamanho da resposta.

Personalizando o Número de Linhas

Às vezes, 10 linhas podem ser demais ou insuficientes. Vamos aprender como personalizar a quantidade de linhas que o head exibe.

Para visualizar apenas as primeiras 5 linhas do log, utilize a opção -n:

head -n 5 access.log

Este comando deve retornar:

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 pode ser particularmente útil quando você está procurando uma informação específica logo no início de um arquivo, mas não precisa ver todas as 10 linhas padrão.

Examinando Múltiplos Arquivos

Como um detetive de arquivos, muitas vezes você precisará analisar vários arquivos rapidamente. O comando head permite visualizar o início de múltiplos arquivos de uma só vez.

Vamos examinar o começo tanto do access.log quanto do error.log:

head access.log error.log

Você verá uma saída parecida com 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 com cabeçalhos. Isso é incrivelmente útil quando você precisa comparar rapidamente o início de vários arquivos.

Usando o head com Pipes

Como um detetive de arquivos experiente, você frequentemente precisará combinar comandos para filtrar e analisar dados de forma mais eficaz. O comando head funciona muito bem com pipes (tubulações), permitindo que você o encadeie com outros comandos.

Digamos que você queira ver as primeiras 3 linhas do access.log, mas apenas as partes que mostram o carimbo de data/hora e o recurso solicitado. Você pode usar o comando cut junto com o head para conseguir isso:

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

Este comando deve retornar:

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

Aqui está o que este comando faz:

  1. cut -d '"' -f2 access.log: Divide cada linha nas aspas e seleciona o segundo campo, que contém a requisição HTTP.
  2. |: Direciona (pipe) a saída do comando cut para o comando head.
  3. head -n 3: Exibe apenas as primeiras 3 linhas da entrada recebida.

Essa combinação permite que você foque rapidamente em partes específicas das entradas de log, tornando sua investigação mais eficiente.

Investigando com head e grep

Agora, vamos combinar o head com outro comando poderoso, o grep, para buscar padrões específicos em nossos logs.

Suponha que você recebeu relatos de atividades incomuns relacionadas à página /admin. Você deseja verificar as primeiras ocorrências de /admin no log de acesso:

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

Este comando deve retornar algo como:

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

Este comando realiza o seguinte:

  1. grep "/admin" access.log: Busca por linhas que contenham "/admin" no arquivo access.log.
  2. |: Envia a saída do grep para o comando head.
  3. head -n 3: Exibe apenas as primeiras 3 linhas do resultado filtrado.

Essa combinação permite que você foque rapidamente nas entradas relevantes do seu arquivo de log, tornando sua investigação mais direcionada e ágil.

Explorando Arquivos Grandes com head

Como detetive de arquivos, você frequentemente encontrará arquivos de log muito grandes. O comando head é particularmente útil para examinar rapidamente o início desses arquivos sem carregar todo o conteúdo na memória.

Vamos simular o trabalho com um arquivo grande usando o access.log com o qual temos trabalhado. Vamos fingir que ele é muito maior do que realmente é.

Primeiro, vamos verificar o tamanho do arquivo:

ls -lh access.log

Agora, vamos usar o head para visualizar as primeiras 15 linhas:

head -n 15 access.log

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

O comando head é especialmente valioso ao lidar com arquivos gigantescos porque:

  1. É rápido: O head lê apenas o início do arquivo, portanto, ele termina rapidamente mesmo em arquivos enormes.
  2. É eficiente em termos de memória: O head não precisa carregar o arquivo inteiro na memória RAM.
  3. Oferece uma prévia rápida: Você pode ter uma ideia da estrutura e do conteúdo do arquivo sem precisar abri-lo por completo.

Resumo

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

  1. Usar o head para visualizar as primeiras 10 linhas de um arquivo por padrão.
  2. Personalizar o número de linhas exibidas usando a opção -n.
  3. Examinar múltiplos arquivos simultaneamente.
  4. Combinar o head com outros comandos como cut e grep usando pipes.
  5. Utilizar o head para trabalhar de forma eficiente com arquivos grandes.

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

  • -c: Exibe os primeiros bytes de um arquivo em vez de linhas.
  • -q: Oprime os cabeçalhos ao examinar múltiplos arquivos.
  • -v: Sempre exibe os cabeçalhos ao examinar múltiplos arquivos.

Recursos