4.6.4 I formati dei file
Un file contiene una sequenza di byte che assumono significati diversi dipendentemente dal
modo in cui questi vengono interpretati: ciò determina il formato del file. Se l’interpretazione
dei byte contenuti in un file deve essere fatta mediante la tabella ASCII, allora si ha a che fare
con un file in formato testo, altrimenti si parla genericamente di file in formato
binario.
Di seguito è riportata la visualizzazione rispettivamente di un file in formato binario
(per la precisione si tratta di un file che contiene un immagine secondo il formato
PNG - Portable Network Graphic) e di uno in formato testo. Il file binario è il
seguente
?PNG
IHDR0 W ?? bKGD??????? pHYs ??~?tIME? 7/-0??IDATx???A
?U? ? y ?X8?hS??? AE??0?F` ? ??u>i?# #? 0??="""""r ?}?? C??EgV??P??i?$????ciV
L?mY?????OiV8C (?5? ?m?Z) ? ???+ ? HS?@, ??? Z???Xo'?? ò?&8?e-ç??S?c "RD??U?^
??P??1? ^ ?cIEND?B`?xtermxtermxtermxterm
mentre il file di testo è visualizzato in maniera comprensibile
Ciao,
Questo è un esempio di file di testo.
Come verrà fuori?
Ciao a tutti,
Daniele.
Questo deriva dal fatto che il comando utilizzato per la visualizzazione del file è cat, che
invia i byte contenuti nel file, uno dopo l’altro, sullo standard output che li visualizza
interpretandoli secondo l’ASCII.
In particolare, si parla di formato testo puro quando un file non contiene nessun carattere
di controllo speciale, ovvero è composto soltanto da caratteri alfanumerici, segni di
punteggiatura e poco altro. Nessuna sequenza di caratteri assume un significato particolare,
ogni carattere rappresenta letteralmente quello che è: si dice in tal caso che il file non ha
nessun tipo di formattazione. A tale tipo appartengono la totalità degli script e la quasi
totalità dei file di configurazione di un sistema Unix-like.
L’unica formattazione di un file in formato testo puro è relativa alla
rappresentazione del carattere di fine riga: i sistemi Unix-like utilizzano il carattere
ASCII LF, mentre i sistemi che derivano dal DOS usano la sequenza di caratteri
CR e LF, ed i sistemi Apple utilizzano soltanto il carattere CR.
|
Il comando file (man page file(1)) fornisce indicazioni sul formato di un file
effettuando tre tipi di test, nel seguente ordine
- filesystem - controlla il valore di ritorno della system call stat: viene controllato
se il file in questione è vuoto o è di tipo particolare (socket, symbolic link, fifo).
- magic number - controlla il valore di particolari byte del file, detti appunto magic
number. L’elenco dei magic number e la loro posizione relativa all’inizio del file
sono contenuti nel file /usr/share/magic.
- language - tenta di ricavare il tipo di lingua utilizzato nel file, se questo è in formato
testo.
Il tipo di file visualizzato da file è quello relativo al primo test che va a buon fine. I file che
non sono riconosciuti da file, vengono segnalati come data file (file contenenti dei dati non
meglio specificati).
____________________________________________________________________
Comando: file
Path: /usr/bin/file
SINTASSI
$ file [option] file ...
DESCRIZIONE
-
option è l’insieme delle opzioni che modificano il comportamento di file. Può
assumere i seguenti valori:
-
-b (brief mode) non visualizza i nomi dei file in output;
-
-c visualizza il magic (usato per il debug);
-
-C crea un file magic.mgc contenente una prima elaborazione del file da
considerare;
-
-f filename
legge i nomi dei file da esaminare dal file filename (uno per riga);
-
-i visualizza le stringe tipo MIME anziché in formato tradizionale (es.
text/plain; charset=us-ascii al posto di ASCII text);
-
-m list specifica l’elenco di file (list) contenenti i magic number secondo la
sintassi filename1[:filename2]...(per default è /usr/share/magic);
-
-n forza la scrittura dell’output dopo il controllo di ogni file;
-
-v visualizza la versione di file;
-
-z tenta di analizzare nei file compressi;
-
-L indica di seguire i symbolic link;
-
-s indica di considerare anche i file di dispositivo (che per default non
vengono considerati);
-
fileè l’elenco dei nomi dei file da esaminare, separati tra loro da uno spazio;
_____________
Ad esempio, il seguente comando controlla il tipo dei file file.c, /usr/bin/file (il file
eseguibile del comando file stesso) e /dev/hda (file di dispositivo).
$ file file.c /usr/bin/file /dev/hda
file.c: C program text
/usr/bin/file: ELF 32-bit LSB executable, Intel 80386, version 1,
dynamically linked, not stripped
/dev/hda: block special
Il seguente comando mostra invece informazioni più dettagliate sui file di dispositivo
/dev/hda, /dev/hda1, ..., /dev/hda10.
$ file -s /dev/hda{,1,2,3,4,5,6,7,8,9,10}
/dev/hda: x86 boot sector
/dev/hda1: Linux/i386 ext2 filesystem
/dev/hda2: x86 boot sector
/dev/hda3: x86 boot sector, extended partition table
/dev/hda4: Linux/i386 ext2 filesystem
/dev/hda5: Linux/i386 swap file
/dev/hda6: Linux/i386 swap file
/dev/hda7: Linux/i386 swap file
/dev/hda8: Linux/i386 swap file
/dev/hda9: empty
/dev/hda10: empty
L’elenco dei magic number riconosciuti è conenuto nel file /usr/share/magic.
In realtà ogni riga di tale file indica un controllo da effettuare ed ha la seguente
sintassi
offset type message
dove
-
offset è un valore numerico che indica la posizione del primo byte, dall’inizio del file, di
cui deve essere controllato il valore;
-
type è una stringa che indica il tipo di raggruppamenti di byte da considerare nel test. Può
assumere i seguenti valori
-
byte un byte;
-
short due byte, nel byte order nativo del sistema;
-
long quattro byte, nel byte order nativo del sistema;
-
string[/car]
una stringa (sequenza di byte). L’eventuale car può assumere i seguenti
valori
-
B indica che devono esserci almeno un determinato numero di
caratteri blank (il carattere corrispondente allo spazio);
-
b ignora eventuali caratteri blank;
-
c indica che il controllo deve essere di tipo case-insensitive;
-
date quattro byte interpretati come una data Unix-like;
-
beshort
due byte, nel big-endian byte order;
-
belong quattro byte, nel big-endian byte order;
-
bedate quattro byte, nel big-endian byte order, interpretati come una data
Unix-like;
-
leshort
due byte, nel little-endian byte order;
-
message è il messaggio da visualizzare nel caso in cui il confronto specificato abbia
successo;
Una riga può iniziare anche con il carattere ‘>’, che indica ulteriori test da effettuare. Il
numero di caratteri ‘>’ indica il livello del test: una riga in cui non è presente nessun carattere
iniziale ‘>’ è considerata a livello 0 e le righe a livello n sono sotto il controllo di quella
precedente e più prossima a livello n - 1, nel senso che un test a livello n va a buon fine,
vengono effettuati anche i test di livello n + 1. Se il carattere che segue l’ultimo ‘>’ è ‘(’ il
contenuto in parentesi è considerato come indirect offset relativo al file, ovvero viene letto il
contenuto del file a partire da tale offset ed il valore letto viene considerato l’offset relativo al
file a partire dal quale si deve effettuare il test. L’indirect offset è specificato con la seguente
sintassi
(offset[.[length]][plus])
dove
-
offset è il valore che indica l’offset (il numero di byte) relativo al file;
-
length indica la quantità di byte da considerare a partire dall’offset indicato da offset,
secondo quanto riportato nella tab. 4.8 (se non indicato viene considerato
sempre un valore long, cioè di 4 byte);
| Tabella 4.8: | Possibili valori di length. |
|
-
plus è un valore che viene aggiunto a quello letto dal file a partire dall’offset indicato da
offset ed una sintassi del tipo +num o -num, dove num è un valore numerico senza segno
espresso in byte;
Un esempio di una parte del contenuto del file /usr/share/magic (quella relativa al
riconoscimento dei file compressi con gzip) è riportato di seguito
# gzip (GNU zip, not to be confused with Info-ZIP or PKWARE zip archiver)
# Edited by Chris Chittleborough <cchittleborough@yahoo.com.au>, March 2002
# * Original filename is only at offset 10 if "extra field" absent
# * Produce shorter output - notably, only report compression methods
# other than 8 ("deflate", the only method defined in RFC 1952).
0 string \037\213 gzip compressed data
>2 byte <8 \b, reserved method
>2 byte >8 \b, unknown method
>3 byte &0x01 \b, ASCII
>3 byte &0x02 \b, continuation
>3 byte &0x04 \b, extra field
>3 byte&0xC =0x08
>>10 string x \b, was "%s"
>9 byte =0x00 \b, from MS-DOS
>9 byte =0x01 \b, from Amiga
>9 byte =0x02 \b, from VMS
>9 byte =0x03 \b, from Unix
>9 byte =0x05 \b, from Atari
>9 byte =0x06 \b, from OS/2
>9 byte =0x07 \b, from MacOS
>9 byte =0x0A \b, from Tops/20
>9 byte =0x0B \b, from Win/32
>3 byte &0x10 \b, comment
>3 byte &0x20 \b, encrypted
### >4 ledate x last modified: %s,
>8 byte 2 \b, max compression
>8 byte 4 \b, max speed