จะทราบประเภทไฟล์ได้อย่างไรหากไม่ได้มาจากคำต่อท้ายไฟล์


55

ฉันต้องการทราบว่าไฟล์เป็นที่รู้จักกันอย่างไรถ้าชื่อไฟล์ไม่มีคำต่อท้าย

ตัวอย่างเช่นไฟล์ที่ชื่อmyfileอาจเป็นไบนารีหรือข้อความที่จะเริ่มต้นด้วยระบบจะทราบได้อย่างไรว่าไฟล์นั้นเป็นไบนารีหรือข้อความ


3
เพียงความคิดเห็นคำตอบที่เหลือครอบคลุมทุกอย่าง ทุกวันนี้มันอาจเกิดขึ้นได้ว่ามี locale ที่กำหนดค่าผิดพลาดหรือ executables เก่าไฟล์ utf-8 บางไฟล์อาจถูกตรวจพบว่าเป็นข้อมูลไบนารีเนื่องจาก non-ascii bytes
orion

19
ระบบไม่สนใจ แอปพลิเคชั่นบางอย่างอาจสนใจ แต่พวกเขาแต่ละคนมีวิธีจัดการกับตัวเอง
jwodder

2
โปรดทราบว่าแม้สำหรับไฟล์ปกติ (ไม่ใช่ไฟล์อุปกรณ์ซ็อกเก็ตโดเมน unix ชื่อไปป์ ฯลฯ ) "ประเภทไฟล์" อาจหมายถึงสองสิ่งที่แตกต่างกัน: (1) รูปแบบไฟล์เฉพาะ (".docx", XML, รูปแบบข้อความ MS-DOS , RTF, ระเบียนที่มีความยาวคงที่, รายการอาจยาวมาก) หรือ (2) ไฟล์ที่แอปเฉพาะรู้วิธีจัดการกับ (".xlsx" หรือ ".doc" หรืออะไรก็ตามที่ทับซ้อนกับประเภทรูปแบบ) . มันคุ้มค่าที่จะแยกแยะความแตกต่างในใจเมื่อพูดถึง "ประเภทไฟล์"
Bruce Ediger

@ jwodder ระบบดูแล มันเป็นระบบที่บ่นว่าคุณไม่สามารถเรียกใช้ไฟล์ที่ไม่สามารถเรียกใช้งานได้เมื่อคุณพยายามที่จะไม่ใช่แอพพลิเคชั่นเหล่านั้น!
Mr Lister

1
@MrLister True แต่ไฟล์ที่เรียกทำงานได้ / ไม่สามารถเรียกใช้งานได้นั้นไม่มีส่วนเกี่ยวข้องกับ 'ส่วนขยาย'
user2338816

คำตอบ:


84

fileยูทิลิตี้กำหนดประเภทไฟล์มากกว่า 3 วิธี:

การทดสอบระบบไฟล์เป็นครั้งแรก: ภายในการทดสอบเหล่านั้นการเรียกใช้ระบบสถิติตระกูลหนึ่งจะถูกเรียกใช้บนไฟล์ สิ่งนี้จะส่งคืนชนิดไฟล์ unix ที่แตกต่างกัน: ไฟล์ปกติ, ลิงก์, อุปกรณ์ตัวอักษร, อุปกรณ์บล็อก, ไปป์ที่มีชื่อหรือซ็อกเก็ต การทดสอบเวทย์มนตร์นั้นขึ้นอยู่กับว่า

การทดสอบเวทย์มนตร์นั้นซับซ้อนกว่าเล็กน้อย ประเภทไฟล์ที่มีการคาดเดาจากฐานข้อมูลของรูปแบบที่เรียกว่าไฟล์มายากล ไฟล์บางประเภทสามารถกำหนดได้โดยการอ่านบิตหรือตัวเลขในตำแหน่งเฉพาะภายในไฟล์ (เช่นไบนารี) ไฟล์เวทย์มี " หมายเลขเวทย์มนตร์ " เพื่อทดสอบไฟล์ว่ามีหรือไม่และควรพิมพ์ข้อมูลข้อความใด " หมายเลขเวทมนตร์ " เหล่านั้นสามารถเป็น 1-4Byte ค่าสตริงวันที่หรือแม้กระทั่งการแสดงออกปกติ ด้วยการทดสอบเพิ่มเติมข้อมูลเพิ่มเติมสามารถพบได้ ในกรณีของการปฏิบัติการข้อมูลเพิ่มเติมจะเป็นไม่ว่าจะมีการเชื่อมโยงแบบไดนามิกหรือไม่ปล้นหรือไม่หรือสถาปัตยกรรม บางครั้งการทดสอบหลายครั้งจะต้องผ่านก่อนจึงจะสามารถระบุประเภทไฟล์ได้อย่างแท้จริง แต่อย่างไรก็ตามมันไม่สำคัญว่าจะทำการทดสอบมากแค่ไหนมันก็เป็นการคาดเดาที่ดีเสมอ

ต่อไปนี้คือ 8 ไบต์แรกในไฟล์ของประเภทไฟล์ทั่วไปที่สามารถช่วยให้เรารับรู้ว่าตัวเลขมายากลเหล่านี้มีลักษณะอย่างไร:

             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

หากไม่พบประเภทไฟล์ที่ผ่านการทดสอบเวทมนต์ไฟล์นั้นน่าจะเป็นไฟล์ข้อความและfileค้นหาการเข้ารหัสของเนื้อหา การเข้ารหัสมีความแตกต่างโดยช่วงและลำดับของไบต์ที่แตกต่างกันซึ่งประกอบด้วยข้อความที่พิมพ์ได้ในแต่ละชุด

การขึ้นบรรทัดใหม่จะถูกตรวจสอบด้วยเช่นกันขึ้นอยู่กับค่า HEX ของพวกเขา

  • 0A( \n) จัดประเภทไฟล์ที่ยกเลิก Un * x / Linux / BSD / OSX
  • 0D 0A( \r\n) เป็นไฟล์จากระบบปฏิบัติการ Microsoft
  • 0D( \r) จะเป็น Mac OS จนกระทั่งรุ่น 9
  • 15( \025) จะเป็น IBMs AIX

ตอนนี้การทดสอบภาษาเริ่มต้นขึ้น หากดูเหมือนว่าจะเป็นไฟล์ข้อความไฟล์นั้นจะถูกค้นหาสตริงเฉพาะเพื่อค้นหาว่ามีภาษาใดบ้าง (C, Perl, Bash) ภาษาสคริปต์บางภาษาสามารถระบุได้เหนือhashbang ( #!/bin/interpreter) ในบรรทัดแรกของสคริปต์

หากไม่มีสิ่งใดที่ใช้กับไฟล์ประเภทไฟล์จะไม่สามารถระบุได้และfileเพียงพิมพ์ "data"

ดังนั้นคุณจะเห็นว่าไม่จำเป็นต้องมีคำต่อท้าย คำต่อท้ายอาจสร้างความสับสนหากตั้งค่าผิด


4
นอกจากนี้ยังมีฐานข้อมูล MIME ที่ใช้ร่วมกันของ freedesktop.org ซึ่งถูกใช้โดยแอพพลิเคชั่น X11 ทั้งหมด นี่เป็นแนวคิดที่คล้ายคลึงกับสิ่งที่file(1)ทำ แต่มีการใช้งานที่แตกต่างกัน (มาก)
lcd047

4
โปรดทราบว่าผลลัพธ์ของกระบวนการนี้เป็นเพียงการคาดเดาและไม่ควรเชื่อถือในสิ่งที่สำคัญ (คุณสมบัติความสะดวกสบายเช่นการตัดสินใจโปรแกรมเริ่มต้นเพื่อเปิดไฟล์ด้วยนั้นใช้ได้)
253751

ดังนั้นถ้าฉันเพิ่ม% PNG ที่ด้านบนของไฟล์ข้อความมันจะถูกมองว่าเป็นไฟล์ png ขวา??
saga

@saga หากคุณได้รับการเข้ารหัสที่ถูกต้องและหากคุณใส่เครื่องหมาย mille แทนการเซ็นต์เซ็นต์ละก็: บางที อาจมีการทดสอบเพิ่มเติม
Bananguin

19

บ่อยครั้งที่มันไม่สนใจ คุณเพียงแค่ส่งมันไปยังโปรแกรมและแปลความหมายได้หรือไม่ก็ได้ อาจไม่เป็นประโยชน์ในการเปิด. jpg ในโปรแกรมแก้ไขข้อความ แต่คุณไม่ได้ป้องกันไม่ให้ทำเช่นนี้ ส่วนขยายเช่นเดียวกับส่วนที่เหลือของชื่อไฟล์เป็นเพื่อความสะดวกขององค์กรของมนุษย์

อาจเป็นไปได้ที่จะสร้างไฟล์ที่สามารถตีความได้อย่างถูกต้องในหลายวิธี เนื่องจากรูปแบบไฟล์ ZIP เริ่มต้นมีส่วนหัวที่ท้ายไฟล์คุณสามารถเติมสิ่งอื่น ๆ ไว้ด้านหน้าและจะยังคงโหลดเป็นไฟล์ ZIP โดยทั่วไปจะใช้เพื่อสร้างไฟล์ zip ที่แตกไฟล์เอง


4
ย่อหน้าสุดท้าย: รูปแบบไฟล์ Funkyเป็นการพูดคุยที่น่าสนใจในเรื่องนั้นนำเสนอเช่น jpeg ที่เป็นโปรแกรม java hello world เช่นกันหลังจาก AES เข้ารหัสมันกลายเป็น PNG หรือหลังจาก 3DES ถอดรหัสมันกลายเป็น PDF และอีกมากมาย ( ทั้งหมดที่มีเนื้อหา "น่าสนใจ" คือไม่เพียง แต่มีสัญญาณรบกวนสีขาวหรือสิ่งประดิษฐ์)
Hagen von Eitzen

14

ข้อมูลดังกล่าวมักพบได้ในส่วนหัวของไฟล์ fileคำสั่งวิเคราะห์เป้าหมายและบอกข้อมูลเกี่ยวกับไฟล์ ข้อมูลจำนวนมากมักได้มาจากส่วนหัวของไฟล์ซึ่งมักจะเป็นสองสามไบต์แรกของไฟล์ (ดูด้านล่าง) ระบบใช้ส่วนหัวเพื่อหาวิธีจัดการกับไฟล์ #!/bin/bashที่จุดเริ่มต้นของไฟล์บอกให้ระบบใช้ bash shell เพื่อแปลสคริปต์ต่อไปนี้ 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

ตัวอย่างส่วนหัวของไฟล์:

[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

3
นี่ค่อนข้างทำให้เข้าใจผิด ไฟล์ Unix ไม่มี "ส่วนหัว" ต่อ se fileคำสั่งพยายามที่จะคาดเดาจากเนื้อหาของแฟ้มวิธีไฟล์อาจจะมีวัตถุประสงค์ที่จะนำมาใช้ มันไม่ผิดพลาด
Nate Eldredge

fileคุณมีสิทธิในวิธีที่คุณอธิบายลักษณะการทำงานของ อันที่จริงแล้วทำการวิเคราะห์ไฟล์ อย่างไรก็ตามประเภทไฟล์ส่วนใหญ่จะระบุโดยส่วนหัวของการเรียงลำดับ 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............เป็นส่วนหัวของไฟล์สั่งการของ ELF (สองสามไบต์แรกของ / bin / ls) ในทำนองเดียวกัน#!/bin/bashที่ด้านบนของไฟล์ ASCII จะระบุว่าเป็นเชลล์สคริปต์ อีกตัวอย่างหนึ่ง: 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR(ภาพ. png)
h3rrmiller

2
แต่คำตอบของคุณทำให้ดูเหมือนว่าส่วนหัวเป็นคุณสมบัติที่สืบทอดได้ของไฟล์ Unix ตัวอย่างเช่นไฟล์ข้อความไม่มีส่วนหัวดังกล่าว บางคนเช่น OP อาจพิจารณาไฟล์ต้นฉบับ C และไฟล์ต้นฉบับ Java เพื่อให้มี "ประเภทไฟล์" ที่แตกต่างกัน แต่ไม่มีส่วนหัวเพื่อแยกความแตกต่าง ฉันจะยืนยันว่า "ประเภทไฟล์" ไม่ได้เป็นแนวคิดที่มีความหมายภายใต้ Unix; ระบบปฏิบัติการจัดเตรียมระบบไฟล์และขึ้นอยู่กับแต่ละแอปพลิเคชันเพื่อตัดสินใจว่าเนื้อหาของไฟล์ใด ๆ ที่ระบุ
Nate Eldredge

ฉันเห็นด้วย. ฉันพยายามที่จะตอบให้ง่ายที่สุดโดยไม่ต้องลงหลุมกระต่ายมากเกินไป
h3rrmiller

7

สิ่งแรกที่ต้องตรวจสอบคือชนิดของไฟล์ที่กำหนดรหัสยากซึ่งเคอร์เนลรู้จัก เหล่านี้เป็นประเภทไฟล์เช่นไดเรกทอรีไฟล์อักขระพิเศษไฟล์พิเศษบล็อกไฟล์พิเศษไพพ์ซ็อกเก็ตและลิงก์สัญลักษณ์ ข้อมูลนี้มาจาก inode ของไฟล์ หากไฟล์เป็นไฟล์ธรรมดาชุดข้อมูลถัดไปจะมาจาก 256 ไบต์แรกโดยค้นหารูปแบบ ดังนั้นไฟล์ข้อความและซอร์สโค้ด C จึงถูกจดจำโดยการตรวจสอบไบต์เหล่านั้น นอกจากนี้ยูทิลิตี้ยังค้นหาหมายเลขมายากลที่ใช้ในการทดสอบและตรวจสอบประเภทไฟล์ /etc/magicคุณสามารถเพิ่มประเภทไฟล์ของคุณเองได้รับการยอมรับโดยการเพิ่มข้อมูลไปยังแฟ้ม อ้างถึง man page สำหรับmagic(5)เพื่อดูรูปแบบของไฟล์เวทย์มนตร์

ในการนำไปใช้งานแบบเก่า (เช่น Solaris) ไฟล์จะ/etc/magicระบุชนิดไฟล์ส่วนใหญ่ที่รู้จัก


4

fileคำสั่งใช้การวิเคราะห์พฤติกรรมจากการตรวจสอบ (ส่วนของ) ไฟล์และการคาดเดาที่มีคุณสมบัติเหมาะสม นอกเหนือจากนั้นมีบางกรณีพิเศษที่สามารถรับข้อมูลเพิ่มเติม; เช่น#!ที่จุดเริ่มต้นของไฟล์ข้อความ, BoM (เครื่องหมายคำสั่งซื้อไบต์) หรือไบต์ส่วนหัวเฉพาะของรูปแบบไฟล์ปฏิบัติการ #!และไบนารีเครื่องหมายใน executables จะถูกใช้โดยระบบจะบอกพวกเขาออกจากกัน


4

ระบบไม่ทราบว่าไฟล์เป็นไบนารีหรือข้อความ ในทุกระบบปฏิบัติการ (AFAIK) ระบบปฏิบัติการ Unix fopen(path, "rb")นั้นเหมือนกับfopen(path "r")- bไม่มีผลใด ๆ เป็นที่ยอมรับเพราะมาตรฐาน C จำเป็นต้องพกพาไปยัง OS อื่น ๆ ที่สร้างความแตกต่าง


0

ฉันจะยืนยันว่า "ประเภทไฟล์" ไม่ได้เป็นแนวคิดที่มีความหมายภายใต้ Unix;

ในช่วงเวลาที่ดีของเมนเฟรมผู้ใช้ระบบปฏิบัติการของพวกเขารองรับไฟล์หลายประเภทรวมถึงลำดับและดัชนีเรียงตามลำดับ ระบบปฏิบัติการที่ทันสมัย ​​(Un * x และ Windows ที่มีเนื้อหา) จะลดชุดของประเภทไฟล์ให้น้อยที่สุด

อาจเป็นไปได้ที่จะสร้างไฟล์ที่สามารถตีความได้อย่างถูกต้องในหลายวิธี

มีความเป็นไปได้ว่ามีรูปแบบไฟล์ที่ยุ่งยาก: ชิ้นส่วนของรหัส C ซึ่งสามารถตีความได้ว่าเป็นคำอธิบายภาพ นอกจากนี้ยังมีรูปแบบที่แตกต่างกันโดยเฉพาะน้อยกว่า: ไฟล์ข้อความ, ไฟล์ XML, เอกสาร SOAP


1
เมื่อรูปแบบไฟล์เป็นไป XPM นั้นไม่ยุ่งยาก ฉันคิดว่า "ยุ่งยาก" เพื่อเริ่มต้นด้วยบางสิ่งที่เป็นทั้ง JPEG ที่ถูกต้องและไฟล์ ZIP ที่ถูกต้อง
Mark
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.