เคล็ดลับสำหรับ @ 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 หา แต่ก็ไม่ได้เป็นความคิดที่ดี