Skąd znane typy plików, jeśli nie z sufiksu pliku?

55

Chciałbym wiedzieć, jak znane są typy plików, jeśli nazwy plików nie mają sufiksów.

Na przykład plik o nazwie myfilemoże być binarny lub tekstowy na początek, skąd system wie, czy plik jest binarny czy tekstowy?

Niklas Rosencrantz
źródło
3
Tylko komentarz, pozostałe odpowiedzi obejmują wszystko. W dzisiejszych czasach może się zdarzyć, że w przypadku źle skonfigurowanych ustawień regionalnych lub starych plików wykonywalnych niektóre pliki utf-8 mogą zostać błędnie wykryte jako dane binarne z powodu bajtów innych niż ascii.
orion
19
System nie dba o to. Niektóre aplikacje mogą się tym przejmować, ale każda z nich ma swoje własne sposoby radzenia sobie z tym.
jwodder
2
Zauważ, że nawet w przypadku zwykłych plików (nie plików urządzeń, gniazd domeny Unix, nazwanych potoków itp.) „Typ pliku” może oznaczać dwie różne rzeczy: (1) Określony format pliku („.docx”, XML, format tekstowy MS-DOS , RTF, rekordy o stałej długości, lista może być bardzo długa) lub (2) Plik, z którym dana aplikacja wie, jak sobie radzić („.xlsx” lub „.doc” lub cokolwiek innego, nakłada się na typ formatu) . Warto pamiętać o tym rozróżnieniu, mówiąc o „typie pliku”.
Bruce Ediger,
@jwodder System się przejmuje. Jest to system, który narzeka, że ​​nie można wykonać pliku niewykonywalnego podczas próby, a nie te aplikacje!
Pan Lister
1
@MrLister Prawda, ale plik wykonywalny / plik wykonywalny nie ma nic wspólnego z „rozszerzeniem”.
user2338816

Odpowiedzi:

84

fileNarzę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 fileszuka 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 / OSX
  • 0D 0A( \r\n) są plikami z systemów operacyjnych Microsoft
  • 0D( \r) byłby systemem Mac OS do wersji 9
  • 15( \025) byłby IBM AIX

Teraz 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 filepo 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.

chaos
źródło
4
Istnieje również wspólna baza danych MIME freedesktop.org, z której korzystają praktycznie wszystkie aplikacje X11. Jest to podobne pojęcie do tego file(1), co robi, ale z (bardzo) inną implementacją.
lcd047
4
Zauważ, że wynik tego procesu jest w zasadzie zgadywaniem i nie należy na nim polegać w niczym ważnym. (Funkcje
ułatwiające
Więc jeśli dodam% PNG na górze pliku tekstowego, będzie on widoczny jako plik png. Dobrze??
saga
@saga Jeśli poprawnie kodujesz i zamiast znaku procentowego wstawisz znak miliona, to: może. Mogą istnieć dodatkowe testy.
Bananguin
19

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.

pjc50
źródło
4
Ostatni akapit: Funky Formaty plików to ciekawa rozmowa na ten temat, prezentująca np. JPEG, który jest także programem na świecie Javy Hello, po zaszyfrowaniu przez AES staje się PNG, lub po odszyfrowaniu przez 3DES staje się PDF i więcej ( wszystkie z „interesującą” zawartością, tj. nie tylko z białym szumem lub artefaktami)
Hagen von Eitzen
14

Informacje te często znajdują się w nagłówku pliku. fileKomenda 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/bashna początku pliku informuje system, aby używał powłoki bash do interpretowania następującego skryptu. ELFinformuje 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
h3rrmiller
źródło
3
To raczej wprowadza w błąd. Pliki uniksowe same w sobie nie mają „nagłówka”. filePolecenie próbuje odgadnąć od zawartości pliku jak plik jest prawdopodobnie przeznaczonych do użytku. To nie jest nieomylne.
Nate Eldredge
Masz rację, wyjaśniając zachowanie 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/bashna 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)
h3rrmiller
2
Ale twoja odpowiedź brzmi, jakby nagłówek był nieodłączną cechą pliku uniksowego. Na przykład pliki tekstowe nie mają takiego nagłówka; ktoś taki jak OP prawdopodobnie uważa, że ​​plik źródłowy C i plik źródłowy Java mają różne „typy plików”, ale nie ma nagłówka, aby je rozróżnić. Twierdziłbym, że „typ pliku” nie jest nawet sensowną koncepcją pod Uniksem; system operacyjny po prostu udostępnia system plików i od każdej aplikacji zależy, jaka jest zawartość danego pliku.
Nate Eldredge
Zgadzam się. Próbowałem odpowiedzieć tak prosto, jak to możliwe, nie schodząc za dużo dziur królików.
h3rrmiller
7

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/magicwyliczył większość rozpoznanych typów plików.

unxnut
źródło
4

fileKomenda 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ć.

Janis
źródło
4

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")- bnie 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.

Toby Speight
źródło
0

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.

ijbalazs
źródło
1
W miarę formatów plików XPM nie jest taki trudny. Uważam, że „trudne” jest zacząć od czegoś, co jest zarówno prawidłowym JPEG, jak i prawidłowym plikiem ZIP.
Mark