Chciałbym wiedzieć, jak znane są typy plików, jeśli nazwy plików nie mają sufiksów.
Na przykład plik o nazwie myfile
może być binarny lub tekstowy na początek, skąd system wie, czy plik jest binarny czy tekstowy?
Chciałbym wiedzieć, jak znane są typy plików, jeśli nazwy plików nie mają sufiksów.
Na przykład plik o nazwie myfile
może być binarny lub tekstowy na początek, skąd system wie, czy plik jest binarny czy tekstowy?
Odpowiedzi:
file
Narzędzie określa typ pliku w ciągu 3 sposoby:
Najpierw testy systemu plików : w ramach tych testów na pliku wywoływane jest jedno z wywołań systemowych rodziny stat . Zwraca różne typy plików unix : zwykły plik, katalog, link, urządzenie znakowe, urządzenie blokowe, nazwany potok lub gniazdo. W zależności od tego wykonywane są magiczne testy.
Te magiczne testy są nieco bardziej skomplikowane. Typy plików są odgadywane przez bazę wzorów zwaną plikiem magicznym . Niektóre typy plików można określić, odczytując bit lub liczbę w określonym miejscu pliku (na przykład pliki binarne). Plik magiczny zawiera „ magiczne liczby ”, aby przetestować plik, czy go zawiera, czy nie i które informacje tekstowe powinny zostać wydrukowane. Te „ magiczne liczby ” mogą być 1-4 bajtowymi wartościami, łańcuchami, datami, a nawet wyrażeniami regularnymi. Przy dalszych testach można znaleźć dodatkowe informacje. W przypadku pliku wykonywalnego dodatkową informacją byłoby to, czy jest dynamicznie połączone, czy nie, pozbawioneczy nie, czy architektura. Czasami wiele testów musi przejść pomyślnie, aby typ pliku mógł zostać naprawdę zidentyfikowany. Ale tak czy inaczej, nie ma znaczenia, ile testów zostanie przeprowadzonych, zawsze jest to tylko dobre przypuszczenie .
Oto pierwsze 8 bajtów w pliku niektórych popularnych typów plików, które mogą pomóc nam poczuć, jak te magiczne liczby mogą wyglądać:
Hexadecimal ASCII
PNG 89 50 4E 47|0D 0A 1A 0A ‰PNG|....
JPG FF D8 FF E1|1D 16 45 78 ÿØÿá|..Ex
JPG FF D8 FF E0|00 10 4A 46 ÿØÿà|..JF
ZIP 50 4B 03 04|0A 00 00 00 PK..|....
PDF 25 50 44 46|2D 31 2E 35 %PDF|-1.5
Jeśli nie można znaleźć typu pliku podczas testów magicznych, plik wydaje się być plikiem tekstowym i file
szuka kodowania zawartości. Kodowanie wyróżnia się różnymi zakresami i sekwencjami bajtów, które stanowią tekst do wydrukowania w każdym zestawie.
Podziały linii są również badane, w zależności od ich wartości HEX:
0A
( \n
) klasyfikuje plik zakończony Un * x / Linux / BSD / OSX0D 0A
( \r\n
) są plikami z systemów operacyjnych Microsoft0D
( \r
) byłby systemem Mac OS do wersji 915
( \025
) byłby IBM AIXTeraz zaczynają się testy językowe . Jeśli wydaje się, że jest to plik tekstowy, plik jest przeszukiwany pod kątem określonych ciągów, aby dowiedzieć się, który język zawiera (C, Perl, Bash). Niektóre języki skryptowe można również zidentyfikować za pomocą hashbang ( #!/bin/interpreter
) w pierwszym wierszu skryptu.
Jeśli nic nie dotyczy pliku, nie można określić typu pliku i file
po prostu drukuje „dane”.
Widzisz więc, że nie ma potrzeby stosowania przyrostka. Przyrostek i tak może się pomylić, jeśli zostanie ustawiony nieprawidłowo.
file(1)
, co robi, ale z (bardzo) inną implementacją.
Często to nie obchodzi. Po prostu przekazujesz go do programu, który interpretuje go lub nie. Otwarcie pliku .jpg w edytorze tekstu może być nieprzydatne, ale nie jest to niemożliwe. Rozszerzenie, podobnie jak reszta nazwy pliku, służy organizacyjnej wygodzie ludzi.
Może być również możliwe tworzenie plików, które można poprawnie interpretować na wiele sposobów. Ponieważ format pliku ZIP zaczyna się od nagłówka na końcu pliku , możesz wstawić inne rzeczy na wierzch i nadal będzie on ładowany jako plik ZIP. Jest to powszechnie używane do tworzenia samorozpakowujących się plików zip.
Informacje te często znajdują się w nagłówku pliku. file
Komenda analizuje cel i powie Ci informacje na temat pliku. Wiele informacji jest często uzyskiwanych z nagłówków plików, które często są pierwszymi kilkoma bajtami pliku (patrz poniżej). Nagłówki są używane przez system, aby dowiedzieć się, jak obsługiwać pliki. #!/bin/bash
na początku pliku informuje system, aby używał powłoki bash do interpretowania następującego skryptu. ELF
informuje system, że jest to plik wykonywalny ELF.
[~] root@www # file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[~] root@www # file /etc/passwd
/etc/passwd: ASCII text
Przykłady nagłówków plików:
[root@server4 ~]# xxd old_sm_logo.png | head -5
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
0000010: 0000 0134 0000 006f 0806 0000 0062 bf3c ...4...o.....b.<
[root@server4 ~]# xxd /bin/ls | head -5
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
0000010: 0200 3e00 0100 0000 a024 4000 0000 0000 ..>......$@.....
[root@server4 proj]# xxd resizer.sh | head -5
0000000: 2321 2f62 696e 2f62 6173 680a 5b20 2d7a #!/bin/bash.[ -z
0000010: 2022 2431 2220 5d20 2626 2065 6368 6f20 "$1" ] && echo
file
Polecenie próbuje odgadnąć od zawartości pliku jak plik jest prawdopodobnie przeznaczonych do użytku. To nie jest nieomylne.
file
. W rzeczywistości dokonuje analizy pliku. Jednak większość typów plików jest identyfikowana przez rodzaj nagłówka. 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
jest nagłówkiem pliku wykonywalnego ELF (kilka pierwszych bajtów / bin / ls). Podobnie #!/bin/bash
na początku pliku ASCII zidentyfikowałby go jako skrypt powłoki. Kolejny przykład: 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
(obraz w formacie .png)
Pierwszą rzeczą, którą należy sprawdzić, jest zakodowany na stałe typ pliku rozpoznawany przez jądro. Są to typy plików, takie jak katalog, plik specjalny znak, plik specjalny blok, plik specjalny potok, gniazdo i łącze symboliczne. Ta informacja pochodzi z i-węzła pliku. Jeśli plik jest zwykłym plikiem, następny zestaw informacji pochodzi z pierwszych 256 bajtów w poszukiwaniu wzorców. W ten sposób pliki tekstowe i kod źródłowy C są rozpoznawane przez sprawdzenie tych bajtów. Ponadto narzędzia szukają również magicznej liczby, która służy do testowania i sprawdzania poprawności typu pliku. Możesz dodać własne typy plików, które będą rozpoznawane, dodając informacje do pliku /etc/magic
. Sprawdź stronę podręcznika, magic(5)
aby zobaczyć format pliku magicznego.
W starszej implementacji (na przykład Solaris) plik /etc/magic
wyliczył większość rozpoznanych typów plików.
file
Komenda odnosi pewne heurystyki z inspekcji (części) plik i podejmowania wykwalifikowanego przypuszczenie. Poza tym istnieją specjalne przypadki, w których można uzyskać dodatkowe informacje; jak #!
na początku pliku tekstowego, BoM (znak kolejności bajtów) lub określone bajty nagłówka wykonywalnych formatów plików. Te #!
i binarne znaki w wykonywalnych są wykorzystywane przez system do ich odróżnić.
System nie wie, czy plik jest binarny czy tekstowy. We wszystkich (AFAIK) systemach operacyjnych typu Unix fopen(path, "rb")
jest dokładnie taki sam jak fopen(path "r")
- b
nie ma żadnego efektu. Jest to akceptowane, ponieważ standard C musi być przenośny dla niektórych innych systemów operacyjnych, które dokonują takiego rozróżnienia.
Twierdziłbym, że „typ pliku” nie jest nawet sensowną koncepcją pod Uniksem;
W dawnych czasach osób obsługujących komputery mainframe ich systemy operacyjne obsługiwały kilka typów plików, w tym sekwencyjne i indeksowo-sekwencyjne. Nowoczesne systemy operacyjne (Un * x i prawdopodobnie Windows) ograniczają zestaw typów plików do minimum (w tym wykonywalny, współużytkowany obiekt).
Może być również możliwe tworzenie plików, które można poprawnie interpretować na wiele sposobów
Możliwe, że istnieje trudny format pliku: fragment kodu C, który można interpretować jako opis obrazu. Poza tym istnieją różne, coraz mniej szczegółowe formaty: plik tekstowy, plik XML, dokument SOAP.