스크립트 파일과 이진 파일의 차이점을 찾는 방법은 무엇입니까?


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스크립트 파일입니다. 노틸러스를 통해 파일을 보면서이 정보를 얻습니다. 그러나 명령 줄을 통해 차이점을 찾지 못했습니다. 파일이 이진 파일인지 여부를 예측할 수 없습니다 스크립트 파일.

명령 줄을 통해 스크립트와 바이너리 파일을 어떻게 구별 할 수 있습니까?

답변:


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 시스템에는 실제 실행 파일이 5 개 미만입니다. 우분투에서는 이것들 /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

대답은 Mu 입니다.
Simon Richter

1

File 명령은 훌륭하지만보다 전문적인 분석 도구를 위해 File Identifier 도구 인 TrID 패키지 를 사용 해보고 싶습니다 .

TrID 는 이진 서명에서 파일 형식을 식별하고 사용하기 쉬운 유틸리티입니다.

자세한 내용과 패키지를 보려면 다음 사이트를 방문하십시오 : 사이트

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.