Mágica e
Adivinhações
Como as aplicações
Linux reconhecem os inúmeros tipos de arquivos existentes
Nos últimos meses,
conhecemos diversos arquivos de configuração do Linux. Vimos como
configurar uma rede, mudar a aparência do console, criar usuários e grupos,
mudar configurações da inicialização do sistema, entre outras situações.
Este mês, vamos conhecer um pouco mais sobre o sistema Linux, compreendendo
como o sistema faz para reconhecer os tipos de arquivos. Como de costume,
todas as edições de arquivos terão de ser feitas pelo usuário root, de
forma que todo o cuidado é pouco.
Um dos primeiros
aspectos de um sistema Linux, que um novo usuário vindo de outros sistemas
operacionais percebem, é a falta de extensões nos arquivos. Acostumados a
aplicativos que reconhecem arquivos apenas pelos seus nomes, muitos se
perguntam como é possível saber qual o tipo de um arquivo, já que todos
parecem ser idênticos.
Bem, o sistema tem
de fazer uso de um pouco de mágica e um pouco de adivinhação. Como se fosse
aquele jogo onde um participante faz mímicas e o outro tem de adivinhar o
que é, o Linux tem um sistema que faz uso de pequenos sinais para
adivinhar o tipo de arquivo.
É virtualmente
impossível reconhecer o tipo de arquivo pelo seu nome (não se engane, um
arquivo .sh pode ser tanto um script shell quanto uma imagem jpeg) no
Linux. Por outro lado, o sistema, assim como as aplicações, deve reconhecer
o que é um arquivo. Como fazer isso? É neste ponto que o jogo de
adivinhações entra em cena. O sistema pega o arquivo e examina seu conteúdo
para ver se reconhece o arquivo, da mesma forma como qualquer um de nós
tenta reconhecer uma mímica. Enquanto nós seres humanos usamos nosso
reconhecimento de padrões e nossa memória, o sistema Linux usa um arquivo
texto para tentar reconhecer o arquivo. Este arquivo texto é chamado de
/etc/mime-magic.
O mime-magic
contém padrões conhecidos que podem ajudar a reconhecer um tipo de arquivo.
A "mágica" é feita por pequenos padrões únicos que cada tipo de
arquivo contém. Por exemplo, um arquivo Tar contém a string "ustar"
na posição 257. O sistema procura esta string e, se achar, considera o
arquivo como sendo um arquivo Tar. A linha equivalente aos arquivos Tar no
mime-magic é:
257 string
ustar\0 application/x-tar
O formato do
arquivo mime-magic consiste de quatro campos:
* Offset: é a posição no arquivo onde o padrão de
reconhecimento pode ser encontrado. Na grande maioria dos arquivos, este
offset é no byte zero, ou seja, no início do arquivo;
* Tipo: identifica que tipo de padrão estaremos
procurando. Pode ser:
# string: trata-se de uma seqüência de caracteres. Por
exemplo, temos o próprio Tar que contém a string "ustar"
# short: é um número do tipo "short". Por
exemplo, um arquivo CPIO é identificado pelo short 070707 na posição zero.
#long: um número do tipo "long". Por
exemplo, arquivos compilados LISP podem ser reconhecidos por um long
0x020c010c no início do arquivo.
# leshort: um número do tipo "short" em
notação little-endian. Por exemplo, o compactador ARJ cria arquivos que
contém o leshort 0xea60 na posição zero.
# beshort: um número do tipo "short" em
notação big-endian. Um exemplo são as bibliotecas compartilhadas que contém
o beshort 0x0104 no início do arquivo.
# lelong: um número do tipo "long" em
notação little-endian. Um exemplo são os arquivos core do Linux/i386.
# belong: um número do tipo "long" em
notação big-endian. Um exemplo são os arquivos de vídeo MPEG. Além destes,
existem mais alguns que são, na realidade, operações lógicas sobre um dos
tipos mencionados acima. Por exemplo, os arquivos MP3 são reconhecidos
fazendo-se a operação lógica AND entre um belong, encontrado na posição
zero, e o número 0xfff0.
* valor: é o próprio padrão a ser encontrado. Este
valor deve ser do tipo especificado.
* identificador: é uma string representando o tipo do
arquivos.
A string
identificadora de arquivo tem sempre a forma categoria/tipo. Por exemplo,
um arquivo de vídeo MPEG é identificado como video/mpeg. Algumas das
categorias são:
application: arquivos desta
categoria são geralmente documentos gerados por alguma aplicação bem
específica como um processador de textos ou planilha eletrônica.
video: arquivos de diversos tipos
de vídeo.
audio: arquivos de sons de
diversos formatos.
text: arquivos plain text
em geral como HTML, SGML, etc.
image: arquivos de imagens como
JPEG, PNG, etc.
Já o tipo do
arquivo identifica especificamente qual o tipo do arquivo. Por exemplo, um
arquivo HTML é identificado como text/html, ou seja, sua categoria é text e
seu tipo html. Simples e fácil. Nada que um pouco de mágica e adivinhação
não resolvam.
Como,
aparentemente, na vida nada é padrão, existem algumas aplicações que fogem
ao padrão descrito acima. Por exemplo, um arquivo C gerado pelo Lex será
identificado como "C program text (from lex)". Vá entender.
De toda a forma,
quando um aplicativo precisa saber o tipo de arquivo, ele faz uma chamada
de sistema que lhe retornará a string identificadora do tipo de arquivo.
Por isso, não só é possível, mas relativamente fácil saber o tipo de um
arquivo.
Como nós seres
humanos ainda não fomos geneticamente alterados para fazermos chamadas ao
sistema e eventualmente queremos saber o tipo de um arquivo, podemos apelar
para o comando file.
O comando file
é um programa bastante simples que apenas usa o mime-magic para reconhecer
um tipo de arquivo e imprimir esta informação na tela.
maragato@estacao.conectiva:~ >
file ssh.tar
ssh.tar: GNU tar archive
maragato@estacao.conectiva:~ >
file xpenguins-2.1-1.i386.rpm
xpenguins-2.1-1.i386.rpm: RPM v3
bin i386 xpenguins-2.1-1
Como se pode ver,
o comando file pode nos informar exatamente o tipo do arquivo
especificado como parâmetro. Às vezes, um tipo pode não ser tão fácil de
achar, mas o file descobre. Por exemplo, este artigo foi gerado com
o KWord. Para quem não conhece, o formato do KWord é comprimido com
gzip. Assim, num primeiro momento, se esperaria que o comando file
simplesmente reconhecesse este arquivo como um arquivo gzip, mas
este não é o caso:
maragato@estacao.conectiva:~/revista
> file sistema-agosto-2001.kwd
sistema-agosto-2001.kwd: gzip
compressed data, deflated, original filename, `KOffice
application/x-kword', last modified: Thu Aug 23 17:12:29 2001, os: Unix
Note que o comando
file detectou o arquivo como comprimido e ainda retornou o tipo do
arquivo original ("application/x-kword"). Isto torna o file
um comando útil em scripts shell.
Roberto Teixeira
maragato@conectiva.com.br
|