Làm cách nào tôi chỉ có thể tìm thấy các tệp thực thi trong một thư mục nhất định trong Linux?


155

Làm cách nào tôi chỉ có thể tìm thấy các tệp thực thi trong một thư mục nhất định trong Linux?


Đây là một loại kịch bản BASH, nó không tệ là những gì tôi có thể nói :) stackoverflow.com/a/20209457/2067125
AjayKumarBasuthkar

Còn việc sử dụng filelệnh tiêu chuẩn thì sao?
Đột phá

4
Đối với bất kỳ ai muốn làm điều này trên máy Mac (đã thử nghiệm trên OS X 10.9.5): ls -l | egrep '^[^d]..x..x..x.*$' Trên đây sẽ liệt kê tất cả các tệp thực thi (cho tất cả / người dùng và nhóm) trong thư mục hiện tại. Lưu ý : -executableTùy chọn không hoạt động trên máy Mac do đó cách khắc phục ở trên.
techfoobar


1
@techfoobar: Câu hỏi không rõ ràng: Có nghĩa là các tệp có chứa mã thực thi hoặc có nghĩa là các tệp có quyền thực thi? Nhưng ngay cả khi chúng tôi cho rằng sự cho phép thực thi là điều mong muốn (vì phần lớn các câu trả lời dường như), câu hỏi không nói là có thể thực thi được . Giải pháp của bạn sẽ tìm thấy các tệp (và cả fifos, socket, symlink, v.v.) có quyền thực thi thế giới, nhưng không phải 750 ( -rwxr-x---), vẫn có thể thực thi được đối với một số người dùng.
G-Man

Câu trả lời:


156

Việc kiểm tra các tập tin thực thi có thể được thực hiện bằng -perm(không được khuyến nghị) hoặc -executable(được khuyến nghị, vì nó đưa ACL vào tài khoản). Để sử dụng -executabletùy chọn:

find <dir> -executable

nếu bạn chỉ muốn tìm các tệp thực thi và các thư mục không thể tìm kiếm, hãy kết hợp với -type f:

find <dir> -executable -type f

23
một shebang không có nghĩa là họ thực thi. nó chỉ cho chúng tôi biết nên sử dụng trình thông dịch nào. và theo định nghĩa linux Các tập tin thực thi trong tiếng Anh, các tập tin có các tập tin có tập tin thực thi (x)
knittl

2
Phiên bản tìm kiếm nào hỗ trợ kiểu đó cho -type? man tìm danh sách b, c, d, p, f, l, s và D trên hệ thống của tôi.
innaM

2
Tương tự ở đây, tìm thấy của tôi không có một -type xtrong hai.
davr

7
Nếu bạn có một phiên bản tìm kiếm cũ (có thể trước 4.3.8) mà thiếu sử dụng thì có thể tìm thấy. -perm / u = x, g = x, o = x.
Ludwig Weinzierl

8
find: invalid predicate -executable'trên RHEL
SSH vào

33

Sử dụng -permtùy chọn tìm . Điều này sẽ tìm thấy các tệp trong thư mục hiện tại có thể được thực thi bởi chủ sở hữu của chúng, bởi các thành viên nhóm hoặc bởi những người khác:

find . -perm /u=x,g=x,o=x

Chỉnh sửa:

Tôi vừa tìm thấy một tùy chọn khác có mặt ít nhất trong GNU find 4.4.0:

find . -executable

Điều này sẽ làm việc thậm chí tốt hơn bởi vì ACL cũng được xem xét.


2
Điều này chỉ hoạt động trên một phiên bản mới hơn của tìm kiếm. Cái được mặc định với CentOS đưa ra lỗi find: invalid mode / u = x, g = x, o = x'`
davr

12
Sau đó, bạn nên thử phiên bản "-perm +" hiện không dùng nữa trong GNU find: find. -perm +111 "
innaM

Có vẻ như -perm /111có thể là phiên bản di động nhất.
Scott

12

Tôi biết câu hỏi đặc biệt đề cập đến Linux, nhưng vì đó là kết quả đầu tiên trên Google, tôi chỉ muốn thêm câu trả lời mà tôi đang tìm kiếm (ví dụ nếu bạn - giống như tôi lúc này - bị chủ nhân của bạn buộc phải sử dụng non GNU / Hệ thống Linux).

Đã thử nghiệm trên macOS 10.12.5

find . -perm +111 -type f

1
Hoạt động trong RHEL 5 cũng vậy.
Jose Tomás Tocino

Đây là biến thể duy nhất tôi có thể làm việc trên OS X 10.14, thx
Justin

3

Tôi có một cách tiếp cận khác, trong trường hợp điều bạn thực sự muốn chỉ là làm một cái gì đó với các tệp thực thi - và không nhất thiết phải thực sự buộc find để tự lọc:

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done

Tôi thích điều này bởi vì nó không dựa vào -executableđó là nền tảng cụ thể; và nó không dựa vào -permđó là một chút phức tạp, một nền tảng bit cụ thể và như được viết ở trên đòi hỏi tệp phải được thực thi cho tất cả mọi người (không chỉ bạn).

Điều -type fnày rất quan trọng vì trong các thư mục * nix phải có khả năng thực thi để có thể truy cập được và càng nhiều truy vấn trong findlệnh, lệnh của bạn sẽ càng hiệu quả về bộ nhớ.

Nhưng dù sao, chỉ đưa ra một cách tiếp cận khác, vì * nix là vùng đất của một tỷ cách tiếp cận.


(0) Bạn thích cái nào, phức tạp và chính xác hay trực quan và thiếu sót? Tôi thích chính xác. (1)  câu trả lời của innaM , có tính năng find -perm, tìm các tệp có bất kỳ bit quyền thực thi nào được đặt. (2) Ngược lại, câu trả lời này chỉ tìm thấy các tệp mà người dùng hiện tại có quyền thực thi. Cấp, đó có thể là những gì OP muốn, nhưng nó không rõ ràng. Tiết (Cont'd)
Scott

(Tiếp theo) Nhìn (3) Để rõ ràng, bạn có thể muốn thay đổi `…`thành $(…)- xem cái này , cái nàycái này . (4) Nhưng đừng làm for i in $(find …); do …; nó không thành công trên tên tập tin có chứa không gian. Thay vào đó, hãy làm find … -exec …. (5) Và, khi bạn làm việc với các biến shell, luôn trích dẫn chúng (trong dấu ngoặc kép) trừ khi bạn có lý do chính đáng để không và bạn chắc chắn rằng bạn biết bạn đang làm gì.
Scott

@scott OK, tôi đứng ra sửa :) Tôi đọc -permlập luận là yêu cầu cả ba, không phải một trong số họ. Ngoài ra, cảm ơn bạn đã đóng góp vào việc bảo vệ các đối số shell, đó là tất cả những gì tôi không biết.
Đánh dấu McKenna

@MarkMcKenna bạn có một lỗi đánh máy trong đó: for i in find. -type f ; do [ -x $i ] && echo "$i is executable"; done; bạn đang thiếu phần <dir> mà tôi sử dụng dấu chấm (.)
Devy

2

Một tệp được đánh dấu thực thi không cần phải là tệp hoặc đối tượng có thể thực thi hoặc có thể tải.

Đây là những gì tôi sử dụng:

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print

2
Cái này làm gì
DerMike

@DerMike, Đây là một trong những cách để tìm tệp thực thi trong thư mục hiện tại, bao gồm các tệp .so, ngay cả khi một tệp không được đánh dấu thực thi mà nó có thể khám phá.
AjayKumarBasuthkar

Ý tôi là, làm thế nào để làm điều đó?
DerMike

Nó đọc từ tiêu đề của tệp để khám phá, mọi tệp nhị phân hoặc tệp tập lệnh đều có tiêu đề.
AjayKumarBasuthkar

Theo như tôi biết, -name "*"không có tác dụng gì find- nó thường tìm thấy tất cả các tệp không bị loại bỏ bởi các bài kiểm tra.
G-Man

1

Là một fan hâm mộ của một ...

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

Sử dụng 'xargs' để lấy đầu ra từ lệnh find (sử dụng print0 để đảm bảo tên tệp có khoảng trắng được xử lý chính xác). Bây giờ chúng tôi có một danh sách các tệp có thể thực thi được và chúng tôi cung cấp từng tệp một, làm tham số cho lệnh 'tệp'. Sau đó grep cho thuật ngữ ASCII để bỏ qua nhị phân. Vui lòng thay thế lệnh có thể thực hiện bằng lệnh find với kiểu bạn thích (xem câu trả lời trước đó) hoặc cách nào hoạt động trên OS NIX OS của bạn

Tôi đã yêu cầu ở trên để tìm các tệp có eval trong các tập lệnh do root sở hữu, vì vậy đã tạo ra các mục sau để giúp tìm các điểm yếu leo ​​thang riêng tư nơi người dùng root chạy các tập lệnh với các tham số không an toàn ...

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find /  -not \( -path /proc -prune \)  -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &

Điều đó sẽ không hoạt động nếu tập lệnh chứa các ký tự không phải ASCII. filebáo cáo mã hóa, vì vậy một kịch bản python có thể được báo cáo là a /usr/bin/python script, UTF-8 Unicode text executable. find ... | xargs file -b | grep -v '^ELF'có thể làm việc tốt hơn để phát hiện ra những người không nhị phân.
xenoid

0

Tôi đã tạo một hàm vào ~/.bashrctối nay để tìm các tệp thực thi không nằm trong đường dẫn hệ thống và không phải thư mục:

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[ -x "$1" ]] && [[ ! -d "$1" ]] \
        &&  echo "executable: $1"'  _  {}
} # xlocate ()

Ưu điểm là nó sẽ tìm kiếm ba bản phân phối Linux và cài đặt Windows trong một giây trong đó findlệnh mất 15 phút.

Ví dụ:

$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate

real    0m0.504s
user    0m0.487s
sys     0m0.018s

Hoặc cho toàn bộ thư mục và tất cả nó là phụ:

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real    0m0.741s
user    0m0.705s
sys     0m0.032s
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.