จะค้นหาความแตกต่างระหว่างไฟล์สคริปต์และไฟล์ไบนารีได้อย่างไร


11
$ ls -l /usr/bin
total 200732

-rwxr-xr-x 1 root   root     156344 Oct  4  2013 adb
-rwxr-xr-x 1 root   root       6123 Oct  8  2013 add-apt-repository
 list goes long ---------

ในข้างต้นadbเป็นไฟล์ไบนารีและadd-apt-repositoryเป็นไฟล์สคริปต์ฉันได้รับข้อมูลนี้โดยการดูไฟล์ผ่าน nautilus แต่ผ่านบรรทัดคำสั่งฉันไม่พบความแตกต่างใด ๆ ฉันไม่สามารถทำนายได้ว่าไฟล์เป็นไฟล์ไบนารีหรือ ไฟล์สคริปต์

ดังนั้นฉันจะแยกความแตกต่างระหว่างสคริปต์และไฟล์ไบนารีผ่านบรรทัดคำสั่งได้อย่างไร

คำตอบ:


16

เพียงใช้file:

$ file /usr/bin/add-apt-repository
/usr/bin/add-apt-repository: Python script, ASCII text executable
$ file /usr/bin/ab
/usr/bin/ab: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=569314a9c4458e72e4ac66cb043e9a1fdf0b55b7, stripped

ตามที่อธิบายไว้ในman file:

NAME
   file — determine file type

DESCRIPTION
 This manual page documents version 5.14 of the file command.

 file tests each argument in an attempt to classify it.  There are three
 sets of tests, performed in this order: filesystem tests, magic tests,
 and language tests.  The first test that succeeds causes the file type to
 be printed.

 The type printed will usually contain one of the words text (the file
 contains only printing characters and a few common control characters and
 is probably safe to read on an ASCII terminal), executable (the file con‐
 tains the result of compiling a program in a form understandable to some
 UNIX kernel or another), or data meaning anything else (data is usually
 “binary” or non-printable).  Exceptions are well-known file formats (core
 files, tar archives) that are known to contain binary data.  When adding
 local definitions to /etc/magic, make sure to preserve these keywords.
 Users depend on knowing that all the readable files in a directory have
 the word “text” printed.  Don't do as Berkeley did and change “shell
 commands text” to “shell script”.

นอกจากนี้คุณยังสามารถใช้เคล็ดลับเพื่อเรียกใช้โดยตรงกับชื่อของไฟล์ที่เรียกใช้ใน$PATH:

$ file $(type -p add-apt-repository | awk '{print $NF}')
/usr/local/bin/add-apt-repository: Python script, ASCII text executable
$ file $(type -p ab | awk '{print $NF}')
/usr/bin/ab: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=569314a9c4458e72e4ac66cb043e9a1fdf0b55b7, stripped

หากต้องการค้นหาประเภทไฟล์ของไฟล์เรียกทำงานทั้งหมดที่สามารถพบได้ในไดเรกทอรีของคุณ$PATHคุณสามารถทำได้:

find $(printf "$PATH" | sed 's/:/ /g') -type f | xargs file

และเมื่อต้องการเรียกใช้fileไฟล์ทั้งหมดในไดเรกทอรีเฉพาะ ( /usr/binเช่น) ให้ทำ

file /usr/bin/*

แต่เราต้องเรียกใช้fileสำหรับแต่ละไฟล์เพื่อดูว่าเป็นไฟล์ประเภทใดมีวิธีง่าย ๆ สำหรับไฟล์ทั้งหมดหรือไม่?
Avinash Raj

3
@AvinashRaj สำหรับไฟล์ทั้งหมดในไดเรกทอรีที่กำหนดหรือไม่ file /usr/bin/*เพียงแค่ทำ เช่นเดียวกับคำสั่งอื่น ๆ
terdon

5

ที่จริงแล้วความแตกต่างระหว่างสิ่งเหล่านั้นไม่มาก

บนระบบ Unix หรือ Linux ทั่วไปมีไฟล์ปฏิบัติการจริงน้อยกว่าห้าไฟล์ บน Ubuntu เหล่านี้เป็นและ/lib/ld-linux.so.2/sbin/ldconfig

ทุกสิ่งทุกอย่างที่ทำเครื่องหมายว่าเรียกใช้งานได้จะถูกเรียกใช้ผ่านล่ามซึ่งรองรับสองรูปแบบ:

  1. ไฟล์ที่เริ่มต้นด้วย#!จะมีชื่อล่ามระหว่างนี้และอักขระขึ้นบรรทัดใหม่ตัวแรก (ถูกต้องไม่มีข้อกำหนดว่า "สคริปต์" เป็นไฟล์ข้อความ)
  2. ไฟล์ ELF มีPT_INTERPกลุ่มที่ให้เส้นทางไปยังล่าม (ปกติ/lib/ld-linux.so.2)

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

  1. เคอร์เนลเปิดสคริปต์ค้นหา#! /bin/shที่จุดเริ่มต้น
  2. เคอร์เนลเปิด/bin/sh, พบส่วนที่ชี้ไปยังPT_INTERP/lib/ld-linux.so.2
  3. เคอร์เนลเปิด/lib/ld-linux.so.2พบว่าไม่มีเซกเมนต์PT_INTERPโหลดเซ็กเมนต์ข้อความและเริ่มต้นส่งผ่านตัวจัดการเปิด/bin/shและบรรทัดคำสั่งสำหรับการเรียกใช้สคริปต์ของคุณ
  4. ld-linux.so.2โหลดส่วนรหัสจาก/bin/shแก้ไขการอ้างอิงไลบรารีที่ใช้ร่วมกันและเริ่มฟังก์ชั่นหลัก
  5. /bin/sh จากนั้นเปิดไฟล์สคริปต์อีกครั้งและเริ่มตีความทีละบรรทัด

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


ข้อมูลดี แต่ไม่ใช่คำตอบสำหรับคำถามนี้
OrangeDog

คำตอบคือหมู่
Simon Richter

1

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

TrIDเป็นยูทิลิตี้ที่ออกแบบมาเพื่อระบุประเภทไฟล์จากลายเซ็นไบนารีของพวกเขาและใช้งานง่าย

สำหรับข้อมูลเพิ่มเติมและแพ็คเกจเพียงไปที่: เว็บไซต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.