ฉันต้องการทราบว่าไฟล์เป็นที่รู้จักกันอย่างไรถ้าชื่อไฟล์ไม่มีคำต่อท้าย
ตัวอย่างเช่นไฟล์ที่ชื่อmyfile
อาจเป็นไบนารีหรือข้อความที่จะเริ่มต้นด้วยระบบจะทราบได้อย่างไรว่าไฟล์นั้นเป็นไบนารีหรือข้อความ
ฉันต้องการทราบว่าไฟล์เป็นที่รู้จักกันอย่างไรถ้าชื่อไฟล์ไม่มีคำต่อท้าย
ตัวอย่างเช่นไฟล์ที่ชื่อmyfile
อาจเป็นไบนารีหรือข้อความที่จะเริ่มต้นด้วยระบบจะทราบได้อย่างไรว่าไฟล์นั้นเป็นไบนารีหรือข้อความ
คำตอบ:
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 / OSX0D 0A
( \r\n
) เป็นไฟล์จากระบบปฏิบัติการ Microsoft0D
( \r
) จะเป็น Mac OS จนกระทั่งรุ่น 915
( \025
) จะเป็น IBMs AIXตอนนี้การทดสอบภาษาเริ่มต้นขึ้น หากดูเหมือนว่าจะเป็นไฟล์ข้อความไฟล์นั้นจะถูกค้นหาสตริงเฉพาะเพื่อค้นหาว่ามีภาษาใดบ้าง (C, Perl, Bash) ภาษาสคริปต์บางภาษาสามารถระบุได้เหนือhashbang ( #!/bin/interpreter
) ในบรรทัดแรกของสคริปต์
หากไม่มีสิ่งใดที่ใช้กับไฟล์ประเภทไฟล์จะไม่สามารถระบุได้และfile
เพียงพิมพ์ "data"
ดังนั้นคุณจะเห็นว่าไม่จำเป็นต้องมีคำต่อท้าย คำต่อท้ายอาจสร้างความสับสนหากตั้งค่าผิด
file(1)
ทำ แต่มีการใช้งานที่แตกต่างกัน (มาก)
บ่อยครั้งที่มันไม่สนใจ คุณเพียงแค่ส่งมันไปยังโปรแกรมและแปลความหมายได้หรือไม่ก็ได้ อาจไม่เป็นประโยชน์ในการเปิด. jpg ในโปรแกรมแก้ไขข้อความ แต่คุณไม่ได้ป้องกันไม่ให้ทำเช่นนี้ ส่วนขยายเช่นเดียวกับส่วนที่เหลือของชื่อไฟล์เป็นเพื่อความสะดวกขององค์กรของมนุษย์
อาจเป็นไปได้ที่จะสร้างไฟล์ที่สามารถตีความได้อย่างถูกต้องในหลายวิธี เนื่องจากรูปแบบไฟล์ ZIP เริ่มต้นมีส่วนหัวที่ท้ายไฟล์คุณสามารถเติมสิ่งอื่น ๆ ไว้ด้านหน้าและจะยังคงโหลดเป็นไฟล์ ZIP โดยทั่วไปจะใช้เพื่อสร้างไฟล์ zip ที่แตกไฟล์เอง
ข้อมูลดังกล่าวมักพบได้ในส่วนหัวของไฟล์ 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
file
คำสั่งพยายามที่จะคาดเดาจากเนื้อหาของแฟ้มวิธีไฟล์อาจจะมีวัตถุประสงค์ที่จะนำมาใช้ มันไม่ผิดพลาด
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)
สิ่งแรกที่ต้องตรวจสอบคือชนิดของไฟล์ที่กำหนดรหัสยากซึ่งเคอร์เนลรู้จัก เหล่านี้เป็นประเภทไฟล์เช่นไดเรกทอรีไฟล์อักขระพิเศษไฟล์พิเศษบล็อกไฟล์พิเศษไพพ์ซ็อกเก็ตและลิงก์สัญลักษณ์ ข้อมูลนี้มาจาก inode ของไฟล์ หากไฟล์เป็นไฟล์ธรรมดาชุดข้อมูลถัดไปจะมาจาก 256 ไบต์แรกโดยค้นหารูปแบบ ดังนั้นไฟล์ข้อความและซอร์สโค้ด C จึงถูกจดจำโดยการตรวจสอบไบต์เหล่านั้น นอกจากนี้ยูทิลิตี้ยังค้นหาหมายเลขมายากลที่ใช้ในการทดสอบและตรวจสอบประเภทไฟล์ /etc/magic
คุณสามารถเพิ่มประเภทไฟล์ของคุณเองได้รับการยอมรับโดยการเพิ่มข้อมูลไปยังแฟ้ม อ้างถึง man page สำหรับmagic(5)
เพื่อดูรูปแบบของไฟล์เวทย์มนตร์
ในการนำไปใช้งานแบบเก่า (เช่น Solaris) ไฟล์จะ/etc/magic
ระบุชนิดไฟล์ส่วนใหญ่ที่รู้จัก
file
คำสั่งใช้การวิเคราะห์พฤติกรรมจากการตรวจสอบ (ส่วนของ) ไฟล์และการคาดเดาที่มีคุณสมบัติเหมาะสม นอกเหนือจากนั้นมีบางกรณีพิเศษที่สามารถรับข้อมูลเพิ่มเติม; เช่น#!
ที่จุดเริ่มต้นของไฟล์ข้อความ, BoM (เครื่องหมายคำสั่งซื้อไบต์) หรือไบต์ส่วนหัวเฉพาะของรูปแบบไฟล์ปฏิบัติการ #!
และไบนารีเครื่องหมายใน executables จะถูกใช้โดยระบบจะบอกพวกเขาออกจากกัน
ระบบไม่ทราบว่าไฟล์เป็นไบนารีหรือข้อความ ในทุกระบบปฏิบัติการ (AFAIK) ระบบปฏิบัติการ Unix fopen(path, "rb")
นั้นเหมือนกับfopen(path "r")
- b
ไม่มีผลใด ๆ เป็นที่ยอมรับเพราะมาตรฐาน C จำเป็นต้องพกพาไปยัง OS อื่น ๆ ที่สร้างความแตกต่าง
ฉันจะยืนยันว่า "ประเภทไฟล์" ไม่ได้เป็นแนวคิดที่มีความหมายภายใต้ Unix;
ในช่วงเวลาที่ดีของเมนเฟรมผู้ใช้ระบบปฏิบัติการของพวกเขารองรับไฟล์หลายประเภทรวมถึงลำดับและดัชนีเรียงตามลำดับ ระบบปฏิบัติการที่ทันสมัย (Un * x และ Windows ที่มีเนื้อหา) จะลดชุดของประเภทไฟล์ให้น้อยที่สุด
อาจเป็นไปได้ที่จะสร้างไฟล์ที่สามารถตีความได้อย่างถูกต้องในหลายวิธี
มีความเป็นไปได้ว่ามีรูปแบบไฟล์ที่ยุ่งยาก: ชิ้นส่วนของรหัส C ซึ่งสามารถตีความได้ว่าเป็นคำอธิบายภาพ นอกจากนี้ยังมีรูปแบบที่แตกต่างกันโดยเฉพาะน้อยกว่า: ไฟล์ข้อความ, ไฟล์ XML, เอกสาร SOAP