เคล็ดลับสำหรับ @ gniourf_gniourfเพื่อล้างความเข้าใจผิดพื้นฐาน
ความพยายามในการนี้คำตอบที่จะให้ภาพรวมของคำตอบที่มีอยู่และเพื่อหารือเกี่ยวกับของพวกเขารายละเอียดปลีกย่อยและญาติเช่นเดียวกับการให้ข้อมูลพื้นฐานโดยเฉพาะอย่างยิ่งเกี่ยวกับการพกพา
การค้นหาไฟล์ที่เรียกใช้งานได้สามารถอ้างถึงกรณีการใช้งานที่แตกต่างกันสองกรณี :
- ผู้ใช้เป็นศูนย์กลาง : ค้นหาไฟล์ที่มีปฏิบัติการโดยผู้ใช้ปัจจุบัน
- ไฟล์ศูนย์กลางหาไฟล์ที่มี (อย่างใดอย่างหนึ่งหรือมากกว่า): บิตได้รับอนุญาตปฏิบัติการชุด
ทราบว่าในทั้งสถานการณ์มันอาจจะทำให้ความรู้สึกที่จะใช้find -L ...
แทนเพียงfind ...
เพื่อที่จะยังหาsymlinks เพื่อ executables
หมายเหตุว่าแฟ้มเป็นศูนย์กลางกรณีที่ง่าย - มองหา executables ที่มีสิทธิ์ในการปฏิบัติการตั้งค่าบิตสำหรับทั้งสามการรักษาความปลอดภัย (ผู้ใช้กลุ่มอื่น ๆ ) - จะโดยทั่วไปแต่ไม่จำเป็นต้องให้ผลผลิตผลเช่นเดียวกับสถานการณ์ที่ผู้ใช้เป็นศูนย์กลาง - และก็ สิ่งสำคัญคือต้องเข้าใจความแตกต่าง
ผู้ใช้เป็นศูนย์กลาง ( -executable
)
คำตอบที่ได้รับการยอมรับ commendably แนะนำ-executable
ถ้าGNU find
ใช้ได้
- GNU
find
มาพร้อมกับLinux distros
ส่วนใหญ่
- ในทางตรงกันข้ามแพลตฟอร์มที่ใช้ BSD รวมถึง macOS นั้นมาพร้อมกับ BSD find ซึ่งมีประสิทธิภาพน้อยกว่า
- ตามที่สถานการณ์ต้องการให้
-executable
จับคู่เฉพาะไฟล์ที่ผู้ใช้ปัจจุบันสามารถดำเนินการได้ (มีกรณีขอบ[1] )
BSD find
ทางเลือกที่นำเสนอโดยคำตอบที่ได้รับการยอมรับ ( -perm +111
) คำตอบที่แตกต่างกัน , ไฟล์คำถามศูนย์กลาง (เป็นคำตอบของตัวเองระบุ)
- โดยใช้เพียง
-perm
ที่จะตอบผู้ใช้คำถามเป็นศูนย์กลางเป็นไปไม่ได้เพราะสิ่งที่จำเป็นคือการเกี่ยวข้องไฟล์ของผู้ใช้และกลุ่มตัวตนให้กับผู้ใช้ปัจจุบันในขณะที่-perm
สามารถทดสอบไฟล์สิทธิ์
การใช้คุณสมบัติPOSIXfind
เพียงอย่างเดียวไม่สามารถตอบคำถามได้หากไม่เกี่ยวข้องกับยูทิลิตี้ภายนอก
ดังนั้นที่ดีที่สุดที่-perm
สามารถทำ (ด้วยตัวเอง) เป็นประมาณ-executable
ของ บางทีอาจเป็นการประมาณที่ใกล้เคียงกว่าที่-perm +111
เป็นอยู่-perm -111
เพื่อค้นหาไฟล์ที่มีการตั้งค่าบิตปฏิบัติการสำหรับหลักการรักษาความปลอดภัยทั้งหมด (ผู้ใช้กลุ่มอื่น ๆ ) - สิ่งนี้ทำให้ฉันรู้สึกเหมือนสถานการณ์ในโลกแห่งความจริงทั่วไป นอกจากนี้ยังเป็นโบนัสที่สอดคล้องกับ POSIX ด้วย (ใช้find -L
เพื่อรวม symlinks ดูคำอธิบายเพิ่มเติมด้านล่าง):
find . -type f -perm -111 # or: find . -type f -perm -a=x
คำตอบ gniourf_gniourf ของให้จริงเทียบเท่าแบบพกพาของ-executable
ใช้-exec test -x {} \;
แม้ว่าค่าใช้จ่ายของการปฏิบัติงาน
การรวม -exec test -x {} \;
กับ-perm +111
(กล่าวคือไฟล์ที่มีชุดบิตที่ปฏิบัติการได้อย่างน้อยหนึ่งชุด) อาจช่วยให้ประสิทธิภาพที่exec
ไม่จำเป็นต้องถูกเรียกใช้สำหรับทุกไฟล์ (ต่อไปนี้ใช้การค้นหา BSD find -perm +111
/ GNU ที่สอดคล้องกับ POSIX -perm /111
โปรดดูคำอธิบายเพิ่มเติมด้านล่าง) :
find . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) -exec test -x {} \; -print
ไฟล์เป็นศูนย์กลาง ( -perm
)
- หากต้องการคำตอบไฟล์คำถามเป็นศูนย์กลางก็คือ เพียงพอที่จะใช้ POSIX ที่สอดคล้องกับ
-perm
หลัก (ที่รู้จักกันในการทดสอบใน GNU หาคำศัพท์)
-perm
ช่วยให้คุณทดสอบการอนุญาตไฟล์ใด ๆไม่ใช่แค่ความสามารถในการดำเนินการ
- สิทธิ์ที่จะระบุเป็นทั้งฐานแปดหรือโหมดสัญลักษณ์ โหมดฐานแปดคือตัวเลขฐานแปด (เช่น
111
) ในขณะที่โหมดสัญลักษณ์เป็นสตริง (เช่นa=x
)
- โหมดสัญลักษณ์ระบุหลักการรักษาความปลอดภัยเป็น
u
(ผู้ใช้) g
(กลุ่ม) และo
(อื่น ๆ ) หรือa
เพื่ออ้างถึงทั้งสาม สิทธิ์ที่จะแสดงเป็นx
สำหรับการปฏิบัติการเช่นและมอบหมายให้ผู้บริหารใช้ประกอบการ=
, +
และ-
; สำหรับการสนทนาแบบเต็มรวมทั้งโหมดฐานแปดดูข้อมูลจำเพาะ POSIX สำหรับchmod
ยูทิลิตี้
- ในบริบทของ
find
:
- คำนำหน้าโหมดด้วย
-
(เช่น-ug=x
) หมายถึง: จับคู่ไฟล์ที่มีสิทธิ์ทั้งหมดที่ระบุไว้ (แต่ไฟล์ที่ตรงกันอาจมีสิทธิ์เพิ่มเติม)
- มีไม่มีคำนำหน้า (เช่น
755
) หมายถึง: แฟ้มที่มีการจับคู่นี้เต็มรูปแบบที่แน่นอนชุดของสิทธิ์
- ข้อแม้ : ทั้งGNU find และ BSD พบว่าใช้คำนำหน้าเพิ่มเติมที่ไม่เป็นมาตรฐานพร้อมตรรกะที่กำหนด - อนุญาตบิตกำหนดใดๆ แต่ทำเช่นนั้นด้วยไวยากรณ์ที่เข้ากันไม่ได้ :
- BSD ค้นหา:
+
- GNU ค้นหา:
/
[2]
- ดังนั้นหลีกเลี่ยงส่วนขยายเหล่านี้หากโค้ดของคุณต้องพกพาได้
- ตัวอย่างด้านล่างแสดงคำตอบแบบพกพาสำหรับคำถามต่างๆที่เน้นไฟล์เป็นศูนย์กลาง
ตัวอย่างคำสั่งไฟล์เป็นศูนย์กลาง
บันทึก:
- ตัวอย่างต่อไปนี้เป็นไปตาม POSIXซึ่งหมายความว่าควรทำงานในการใช้งานที่เข้ากันได้กับ POSIX รวมถึง GNU find และ BSD find โดยเฉพาะสิ่งนี้ต้องการ:
- ไม่ใช้คำนำหน้าโหมดที่ไม่เป็นมาตรฐาน
+
หรือ/
.
- การใช้รูปแบบ POSIX ของไพรมารีตัวดำเนินการเชิงตรรกะ :
!
สำหรับ NOT (GNU find และ BSD find also allow -not
); หมายเหตุที่\!
ใช้ในตัวอย่างเพื่อป้องกัน!
การขยายประวัติเชลล์
-a
สำหรับ AND (GNU find และ BSD find also allow -and
)
-o
สำหรับ OR (GNU find และ BSD find also allow -or
)
- ตัวอย่างนี้ใช้โหมดสัญลักษณ์เนื่องจากอ่านและจำได้ง่ายกว่า
- ด้วยคำนำหน้าโหมด
-
การ=
และ+
ผู้ประกอบการสามารถนำมาใช้แทนกันได้ (เช่น-u=x
เทียบเท่ากับ-u+x
- ถ้าคุณใช้-x
ในภายหลัง แต่มีจุดใดในการทำเช่นนั้น)
- ใช้
,
เพื่อเข้าร่วมโหมดบางส่วน และตรรกะโดยนัย เช่น-u=x,g=x
หมายความว่าต้องตั้งค่าทั้งผู้ใช้และบิตที่ปฏิบัติการได้ของกลุ่ม
- โหมดไม่สามารถตัวเองแสดงการจับคู่เชิงลบในความหมายของ "การแข่งขันเฉพาะในกรณีที่บิตนี้ไม่ได้ตั้งค่า" นั้น คุณต้องใช้แยกแสดงออกด้วยไม่หลัก
-perm
!
- โปรดสังเกตว่าไพรมารีของ find (เช่น
-print
หรือ-perm
เรียกอีกอย่างว่าการกระทำและการทดสอบใน GNU find) จะเชื่อมโยงกับ-a
(ตรรกะ AND) โดยปริยาย-o
และอาจจำเป็นต้องมีวงเล็บ (Escape as \(
และ\)
สำหรับเชลล์) เพื่อใช้หรือตรรกะ
find -L ...
แทนที่จะfind ...
ใช้เพื่อจับคู่symlinks กับไฟล์ปฏิบัติการ
-L
แนะนำให้ค้นหาเพื่อประเมินเป้าหมายของ symlinks แทนที่จะเป็น symlink เอง ดังนั้นโดยไม่-L
, -type f
จะไม่สนใจ symlinks ทั้งหมด
# Match files that have ALL executable bits set - for ALL 3 security
# principals (u (user), g (group), o (others)) and are therefore executable
# by *anyone*.
# This is the typical case, and applies to executables in _system_ locations
# (e.g., /bin) and user-installed executables in _shared_ locations
# (e.g., /usr/local/bin), for instance.
find -L . -type f -perm -a=x # -a=x is the same as -ugo=x
# The POSIX-compliant equivalent of `-perm +111` from the accepted answer:
# Match files that have ANY executable bit set.
# Note the need to group the permission tests using parentheses.
find -L . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \)
# A somewhat contrived example to demonstrate the use of a multi-principial
# mode (comma-separated clauses) and negation:
# Match files that have _both_ the user and group executable bit set, while
# also _not_ having the other executable bit set.
find -L . -type f -perm -u=x,g=x \! -perm -o=x
[1] คำอธิบาย-executable
จากman find
ณ GNU พบ 4.4.2:
จับคู่ไฟล์ที่เรียกใช้งานได้และไดเร็กทอรีที่สามารถค้นหาได้ (ในความหมายของการแก้ปัญหาชื่อไฟล์) สิ่งนี้คำนึงถึงรายการควบคุมการเข้าถึงและสิ่งประดิษฐ์การอนุญาตอื่น ๆ ซึ่งการทดสอบ -perm ละเว้น การทดสอบนี้ใช้การเรียกระบบ access (2) และเซิร์ฟเวอร์ NFS ที่ทำแผนที่ UID (หรือ root-squashing) สามารถหลอกได้เนื่องจากระบบจำนวนมากใช้การเข้าถึง (2) ในเคอร์เนลของไคลเอ็นต์ดังนั้นจึงไม่สามารถใช้ประโยชน์จาก ข้อมูลการแมป UID ที่เก็บไว้บนเซิร์ฟเวอร์ เนื่องจากการทดสอบนี้ขึ้นอยู่กับผลลัพธ์ของการเรียกระบบ access (2) เท่านั้นจึงไม่มีการรับประกันว่าไฟล์ที่การทดสอบนี้ประสบความสำเร็จจะสามารถดำเนินการได้จริง
[2] GNU พบเวอร์ชันที่เก่ากว่า 4.5.12ยังอนุญาตให้ใช้คำนำหน้า+
แต่นี่เป็นครั้งแรกที่เลิกใช้งานและในที่สุดก็ถูกลบออกเนื่องจากการรวม+
กับโหมดสัญลักษณ์จะให้ผลลัพธ์ที่ไม่คาดคิดเนื่องจากถูกตีความว่าเป็นมาสก์สิทธิ์ที่แน่นอน หากคุณ (ก) ทำงานในรุ่นก่อน 4.5.12 และ (ข) จำกัด ตัวเองให้ฐานแปดโหมดเท่านั้นคุณจะได้รับไปกับการใช้+
กับทั้ง GNU ค้นหาและ BSD หา แต่ก็ไม่ได้เป็นความคิดที่ดี