Bir komut dosyası ile bir ikili dosya arasındaki fark nasıl bulunur?


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 ---------

Yukarıda adbbir ikili dosya ve add-apt-repositorybir komut dosyasıdır. Nautilus.But üzerinden dosyaları görüntüleyerek bu bilgileri almak, ama komut satırı aracılığıyla, herhangi bir fark bulamadım.Bir dosyanın ikili dosya olup olmadığını tahmin edemiyorum veya bir komut dosyası.

Peki komut satırından komut dosyası ve ikili dosyalar arasında nasıl ayrım yapabilirim?

Yanıtlar:


16

Sadece kullanın 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

Açıklandığı gibi 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”.

Bunu, doğrudan aşağıdakilerdeki yürütülebilir dosyanın adında çalıştırmak için bir hile de kullanabilirsiniz $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

Bilgisayarınızın dizinlerinde bulunan tüm yürütülebilir dosyaların dosya türünü bulmak için $PATHşunları yapabilirsiniz:

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

fileBelirli bir dizindeki tüm dosyalar üzerinde ( /usr/binörneğin) çalıştırmak için

file /usr/bin/*

Ancak bunun filene tür bir dosya olduğunu görmek için her dosya için çalışmalıyız.Tüm dosyalar için basit bir yöntem var mı?
Avinash Raj

3
Belirli bir dizindeki tüm dosyalar için @AvinashRaj? Sadece yap file /usr/bin/*. Tıpkı diğer komutlar gibi.
terdon

5

Aslında bunlar arasındaki farklar o kadar da büyük değil.

Tipik bir Unix veya Linux sisteminde, beşten az gerçek yürütülebilir dosya vardır. Ubuntu'da bunlar /lib/ld-linux.so.2ve /sbin/ldconfig.

Yürütülebilir olarak işaretlenen diğer her şey, iki biçimin desteklendiği bir yorumlayıcı aracılığıyla yürütülür :

  1. İle başlayan dosyalar #!, bu ve ilk yeni satır karakteri arasında yorumlayıcı adına sahip olacaktır (bu doğru, "komut dosyalarının metin dosyaları olma zorunluluğu yoktur).
  2. ELF dosyalarında PT_INTERP, tercümana giden yolu veren bir segment bulunur (genellikle /lib/ld-linux.so.2).

Böyle bir dosya yürütüldüğünde, çekirdek yorumlayıcının adını bulur ve onun yerine çağırır. Bu, örneğin bir kabuk komut dosyası çalıştırdığınızda, yinelemeli olarak gerçekleşebilir:

  1. Çekirdek betiği açar #! /bin/sh, başında bulur .
  2. Çekirdek açılır /bin/sh, PT_INTERPişaret eden bölümü bulur /lib/ld-linux.so.2.
  3. Çekirdek açılır /lib/ld-linux.so.2, PT_INTERPparçasının olmadığını bulur , metin parçasını yükler ve başlatır, açık tanıtıcıyı /bin/shve komut dosyası çağrınızın komut satırını iletir.
  4. ld-linux.so.2kod parçalarını yükler, /bin/shpaylaşılan kitaplık referanslarını çözer ve ana işlevini başlatır
  5. /bin/sh daha sonra komut dosyasını yeniden açar ve satır satır yorumlamaya başlar.

Çekirdek açısından bakıldığında, tek fark ELF dosyası için, dosya adı yerine açık dosya tanımlayıcısının geçirilmesidir; bu çoğunlukla bir optimizasyon. Tercümanın daha sonra dosyadan yüklenen bir kod segmentine atlamaya veya satır satır yorumlamaya karar vermesi sadece tercüman tarafından belirlenir ve çoğunlukla konvansiyona dayanır.


İyi bilgi, ama bu sorunun cevabı gerçekten değil.
OrangeDog

Cevap Mu .
Simon Richter

1

Dosya komutu harika, ancak daha profesyonel analiz aracı için, Dosya Tanımlama aracı olan TrID paketini denemenizi istiyorum .

TrID , dosya türlerini ikili imzalarından tanımlamak için tasarlanmış bir yardımcı programdır ve kullanımı kolaydır.

Daha fazla bilgi ve paket için şu adresi ziyaret edin: Site

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.