cờ-tinh trùng được tìm thấy

Sep 05 2020

Tôi đang cố gắng xoay sở với lệnh này:

find /home/ -type d \( -perm -0002 -a ! -perm -1000 \) 2>/dev/null

Tôi hiểu rằng nó sẽ tìm trong thư mục 'home' cho tất cả các thư mục và chuyển hướng tất cả các thư stderr đến một tệp (để loại bỏ chúng), tuy nhiên, tôi bối rối với phần ở giữa, cụ thể là:

\( -perm -0002 -a ! -perm -1000 \)

Các dấu gạch chéo nghĩa là gì? Tôi giả định ! -perm -1000có nghĩa là tìm kiếm các thư mục không có các quyền đó và -perm -0002có nghĩa là tìm kiếm các thư mục có các quyền đó, nhưng tôi chỉ quen với việc xem các quyền trong biểu mẫu 644 (ví dụ). Tại sao có bốn chữ số? Ngoài ra, -alá cờ để làm gì?

Trả lời

4 netmonk Sep 05 2020 at 17:45

Trong sách hướng dẫn, bạn có thể tìm thấy:

Operators
              Operators join together the other items within the expression.
              They include for example -o (meaning logical OR) and -a
              (meaning logical AND).  Where an operator is missing, -a is
              assumed.

Vì vậy, nghĩa đen \( -perm -0002 -a ! -perm -1000 \)là: perm = 0002 và không phải là perm = 1000

perm = 0002 có nghĩa là có thể ghi cho Người khác.
perm = 1000 có nghĩa là bit dính được thiết lập.

Vì vậy, biểu thức này tìm kiếm tệp có thể ghi cho Khác và không có bộ bit dính.

Tìm kiếm thư mục được thực hiện với -type d dthư mục phương tiện vì vậy hãy tìm thư mục look after object of type

Từ hướng dẫn tìm kiếm, -permcó một số hình thức:

  • -perm 0002 sẽ khớp với tất cả các tệp có cài đặt quyền chính xác này
  • -perm -0002sẽ khớp với tất cả các tệp nơi bit bên phải này được thiết lập, (có nghĩa là 0772, 1752... bất kỳ kết hợp nào nếu tệp có thể ghi cho người khác)
5 ilkkachu Sep 05 2020 at 22:23

Trong -type d \( -perm -0002 -a ! -perm -1000 \), trước hết, các dấu gạch chéo thoát khỏi ngoặc cho vỏ, để họ có thể được thông qua như là một cuộc tranh cãi, thay vì được hiểu là các nhà khai thác đặc biệt bằng vỏ. (Bạn cũng cần như vậy >, ví dụ , vì những lý do rõ ràng.) Chúng cũng có thể được viết là '('hoặc "(", nhưng cuối cùng findchỉ thấy (và ).

Dấu ngoặc đơn nhóm các điều kiện, và -alà một và kết hợp. Đó cũng là mặc định ngầm định cho các điều kiện quay lại, như được sử dụng ở đây với -type dvà biểu thức trong ngoặc đơn, không có -akết nối rõ ràng nào với chúng. Biểu thức chính xác tương đương với -type d -perm -0002 ! -perm -1000. Dấu ngoặc đơn thực sự chỉ cần thiết với hoặc kết hợp -o.

-type dlà hiển nhiên, và có nghĩa là tìm kiếm một tệp có tất cả các bit quyền được thiết lập. Hoặc, trong trường hợp này, các thư mục có quyền ghi cho người khác ( ) được đặt và bit dính ( ) không được đặt (vì phủ định). Tôi nghĩ rằng sự kết hợp ở đây cũng có thể được viết là . Lưu ý dấu gạch ngang phía trước chuỗi quyền, nếu không có nó, ý nghĩa sẽ khác. Xem ví dụ: trang Linux man để tìm , tìm "(expr)" và "-perm mode".-perm -NNNNNNNN00021000-perm -o+w ! -perm -o+t

Quyền truy cập ghi vào một thư mục cho phép tạo, xóa và đổi tên các tệp bên trong nó và bit dính ngăn chặn việc xóa và đổi tên các tệp do người dùng khác sở hữu. Toàn bộ biểu thức tìm kiếm các thư mục mà mọi người có thể xóa hoặc đổi tên bất kỳ tệp nào.

2 binarysta Sep 05 2020 at 17:47
  • -a: là logic AND ( -ocó thể được sử dụng cho OR)
  • \(, \): bởi vì dấu ngoặc đơn có ý nghĩa đặc biệt trong shell, dấu gạch chéo được sử dụng để thoát khỏi chúng
  • quyền có bốn chữ số có liên quan đến sticky bit, setuid,setgid