Làm thế nào để tìm filetypes thực thi?


7

Tôi muốn tìm các loại tệp có thể thực thi được từ quan điểm của kernel. Theo như tôi biết thì tất cả các tệp thực thi trên Linux đều là các tệp ELF. Vì vậy, tôi đã thử như sau:

find * | file | grep ELF

Tuy nhiên, điều đó không làm việc; có ai có ý tưởng khác không?


@Levon Nó cho tôi thấy sự giúp đỡ sử dụng của tập tin. Có lẽ tập tin không thể xử lý đầu vào của tìm kiếm.
JohnnyFromBF

3
Chỉ là một nút bên nhỏ, với binfmt_miscbạn có thể chạy các tệp tùy ý như các lớp, exes, v.v. en.wikipedia.org/wiki/Binfmt_misc
Ulrich Dangel

@UlrichDangel: +1 để đề cập binfmt_misc. Các định dạng nhị phân cũng linh hoạt như các hệ thống tệp trên Linux. Bằng mọi cách, hãy tìm ELF, nhưng (a) bạn không tìm thấy tất cả các tệp thực thi, (b) ELF bạn thấy không nhất thiết phải thực thi trong thực tế. Chẳng hạn, ELF SPARC64 sẽ không chạy trên x86.
Alexios

Không. Các tệp a.out cũng có thể được thực thi và các tệp được đánh dấu có thể thực thi được như bashscripts với shebang thích hợp.
người dùng không xác định

Tại sao tôi nhận được phiếu bầu tiêu cực cho câu hỏi đó, những kẻ ngốc trong công việc?
JohnnyFromBF

Câu trả lời:


11

Chỉnh sửa sau: chỉ có điều này làm những gì jan cần: cảm ơn bạn huygens;

find . -exec file {} \; | grep -i elf


find . -exec file {} \; | grep -i elflà những gì tôi đang tìm kiếm, cảm ơn!
JohnnyFromBF

1
Tôi nghĩ rằng lệnh đầu tiên của bạn không hoạt động. Nó đang tìm kiếm các tệp có tên như "* elf *" (không tính đến trường hợp này). Bạn muốn grep đầu ra giống như bạn đã làm trong đề xuất thứ hai.
Huygens

@huygens Tôi đã thử nó trước khi tôi đăng và nó hoạt động. chạm vào elf 1elf 1ELF2 elf2 </ code>; lệnh của tôi sẽ tìm thấy tất cả các tập tin liên quan đến elf;
từ

@huygens Tôi đã thử nó trước khi tôi đăng và nó hoạt động. chạm vào yêu tinh 1elf 1ELF2 elf2; Lệnh của tôi sẽ tìm tất cả các tệp liên quan đến elf (giống như grep); bạn đã gặp lỗi đó vì bạn đã sao chép nó (tôi nghĩ) và nó có một khoảng trống không cần thiết, trong "". nhưng nếu tôi viết "asteriskELFasterisk" trong <code>, html sẽ ăn dấu hoa thị của tôi !!!
từ

Nếu bạn làm điều cd /sbin; find . -iname "*elf*" -exec file {} \;đó sẽ báo cáo không có tập tin :) tuy nhiên cd /sbin; find . -exec file {} \; | grep -i elfsẽ báo cáo một số. Do đó quan điểm của tôi là chính xác. Tùy chọn -iname của find chỉ cần kiểm tra xem tên tệp có khớp với mẫu không. Vì vậy, nếu một thực thi ELF được gọi là mkswap, bạn sẽ không tìm thấy nó. Tái bút: Tôi đã thử cả hai "*elf*"*elf *"như tôi mong đợi không có nhị phân nào được tìm thấy trong / sbin không chính xác.
Huygens

1

Hãy nhìn vào -executablelá cờ của find.


3
Đó không phải là những gì tôi muốn, tôi không muốn các tệp được gắn thẻ là các tệp thực thi nhưng tôi muốn tìm các tệp ELF, các tệp được nhận dạng là có thể thực thi được bởi kernel.
JohnnyFromBF

Cờ quyền thực thi phù hợp (cũng vậy thư mục), xem trang man:Matches files which are executable and directories which are searchable (in a file name resolution sense).
Huygens

1
@Huygens: Vì vậy, thư mục là các tệp (mọi thứ đều là tệp trên Unix), nhưng để loại trừ chúng, chỉ cần sử dụng find -type f -executable.
người dùng không xác định

2
@Ian: Nhưng Shellscripts có thể được thực thi bởi kernel. Cờ thực thi + shebang thích hợp có nghĩa là tệp thực thi. Hoặc cờ + nhị phân-elf, hoặc cờ + a.out hoặc cờ + binfmt-patch.
người dùng không xác định

1
@Huygens: Không, bạn có thể thực thi các tập lệnh shell với các lệnh thực thi, xem: en.wikipedia.org/wiki/Shebang_%28Unix%29 . Nếu có một shebang, chỉ phần còn lại của tập lệnh được trình thông dịch thực thi. Kể từ năm 1980.
người dùng không biết

1

Trước tiên tôi sẽ tìm các tệp thông thường vì tệp thực thi nhị phân thuộc về loại tệp đó.

Sau đó, tôi sẽ yêu cầu mỗi tệp thông thường loại mime và nếu nó khớp với ứng dụng / x-thực thi thì đó là tệp thực thi nhị phân (phù hợp với các tệp thực thi của Linux, ví dụ như Windows phù hợp với ứng dụng / x-dosxec).

find . -type f -print0 | xargs -0 -n 10 file -i | grep "application/x-executable"

Thử lệnh này tôi thấy có sự khác biệt với find . -type f -print0 | xargs -0 -n 10 file | grep -w ELF. Có vẻ như lệnh filenày có lỗi và phát hiện ELF thực thi dưới dạng đối tượng chia sẻ ELF. Vì vậy, mặc dù lệnh là lý thuyết chính xác, trong thực tế, nó không đầy đủ.

Vì vậy, chúng tôi phải tìm kiếm các tệp thực thi ELF và các đối tượng được chia sẻ nhưng loại trừ tất cả các tệp có tên * .so và .so.

find . -type f ! \( -name "*.so.*" -o -name "*.so" \) -print0 | xargs -0 -n 10 file -i | egrep "application\/x-sharedlib|application\/x-executable"

Nó có thể không hoàn hảo, nhưng đó là khá gần.


Trên thực tế, câu trả lời đầu tiên của tôi không hoàn toàn chính xác, vì một số tệp thực thi nhị phân được phát hiện bởi file -ilà application / x-sharedlib và không phải là application / x-execable.
Huygens

Các tệp nhị phân mà tôi đã lấy mẫu từ máy Mac của mình application/octet-stream; charset=binary, theo cả máy Mac filefilehộp Debian của tôi. (Nói về OS X, filenó bao gồm cả việc sử dụng -Ithay vì -i. Cả hai đều chấp nhận --mime.)
Blacklight Shining

1

Giải pháp thay thế không sử dụng filereadelf, đối với những người trên hệ thống hạn chế (ví dụ: được nhúng):

find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%2x" " {}\n"'  {} \; | grep ^7f454c46

Về cơ bản, chúng tôi xuất bốn byte đầu tiên với hexdumpvà sử dụng chúng làm chữ ký . Sau đó chúng ta có thể grep tất cả các tệp loại ELF bằng chữ ký của nó 7f454c46.

Hoặc, vì 7fnhân vật xóa , và 45, 4c, 46byte là E, L, Fnhân vật tương ứng, chúng tôi cũng có thể sử dụng:

find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%1_u" " {}\n"'  {} \; | grep ^delELF

Ngoài ra, bạn có thể sử dụng headthay vì hexdumptrong trường hợp này:

find $WHERE -type f -exec head -c 4 {} \; -exec echo " {}" \;  | grep ^.ELF

0

Giống như những người khác, tôi cũng muốn trả lời. Câu trả lời của tôi cũng dựa trên việc sử dụng findtiện ích, nhưng tôi có một ý tưởng, khác với các câu trả lời khác. Nó dựa trên thực tế đó, rằng -execcũng có thể được sử dụng làm tiêu chí tìm kiếm. Bây giờ, có ý tưởng này, chúng ta có thể cấu trúc lại tất cả các đề xuất trước đó cho đề xuất này:

find /path -type f -exec sh -c "file {} | grep -Pi ': elf (32|64)-bit' > /dev/null" \; -print

Tức là chúng tôi đã chuyển grepvào -exec.

Điều này mang lại cho chúng ta điều gì, bạn có thể hỏi? Chúng tôi có thể sử dụng tính linh hoạt của -printvà các findtiện ích khác. Ví dụ: chúng ta có thể định dạng một đầu ra theo sở thích của mình hoặc sử dụng -print0và chuyển hướng một đầu ra sang một số tập lệnh, v.v.


0

Tôi nghĩ rằng điều này trả lời câu hỏi ban đầu nếu mục đích của họ là tìm các tệp thực thi nhị phân bằng cách đảm bảo mỗi trận đấu có một tiêu đề elf.

Nó sắp xếp các tệp tiền xử lý dựa trên loại -executablesau đó chạy kết quả thông qua một lớp vỏ riêng biệt gọi ra các readelf -lống dẫn đến grep mà âm thầm khớp với các tiêu đề rõ ràng executable. Bất cứ điều gì vượt qua bài kiểm tra này được chuyển printfcho đầu ra.

Các pwdbit đầu ra đường dẫn đầy đủ.

find `pwd` -type f -executable -exec sh -c 'readelf -l "$1" 2>/dev/null | grep -qio 'executable' && printf "$1\n"' -- {} \;

-2
find -type f -exec file {} \; | grep ELF | grep executable | cut -d: -f1

Không hoạt động trên tất cả các tệp / đường dẫn
Anthon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.