ธง -perm ในการค้นหา
ฉันพยายามห่อหัวรอบคำสั่งนี้:
find /home/ -type d \( -perm -0002 -a ! -perm -1000 \) 2>/dev/null
ฉันเข้าใจว่ามันจะดูในไดเร็กทอรี 'home' สำหรับไดเร็กทอรีทั้งหมดและเปลี่ยนเส้นทางข้อความ stderr ทั้งหมดไปยังไฟล์ (เพื่อระงับมัน) อย่างไรก็ตามฉันสับสนกับส่วนที่อยู่ตรงกลางโดยเฉพาะ:
\( -perm -0002 -a ! -perm -1000 \)
เครื่องหมายทับหมายถึงอะไร? ฉันคิดว่า! -perm -1000หมายถึงการค้นหาไดเรกทอรีที่ไม่มีสิทธิ์เหล่านั้นและ-perm -0002หมายถึงการค้นหาไดเรกทอรีที่มีสิทธิ์เหล่านั้น แต่ฉันคุ้นเคยกับการเห็นสิทธิ์ในรูปแบบ 644 เท่านั้น (ตัวอย่าง) ทำไมต้องมีตัวเลขสี่หลัก? นอกจากนี้-aธงทำอะไร?
คำตอบ
ในคู่มือคุณสามารถค้นหา:
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.
\( -perm -0002 -a ! -perm -1000 \)หมายความตามตัวอักษร: perm = 0002 และ not perm = 1,000
perm = 0002 หมายถึงสามารถเขียนได้สำหรับผู้อื่น
perm = 1,000 หมายถึงมีการตั้งค่าบิตเหนียว
ดังนั้นนิพจน์นี้จึงค้นหาไฟล์ที่เขียนได้สำหรับ Other และไม่มีการกำหนดค่าบิตเหนียว
การค้นหาไดเร็กทอรีทำได้ด้วย-type d dไดเร็กทอรีหมายถึงดังนั้นให้ค้นหาอ็อบเจ็กต์ประเภทไดเร็กทอรี
จากคู่มือการค้นหา-permมีหลายรูปแบบ:
-perm 0002จะจับคู่ไฟล์ทั้งหมดด้วยการตั้งค่าการอนุญาตที่แน่นอนนี้-perm -0002จะตรงกับไฟล์ทั้งหมดที่นี้บิตที่ถูกต้องคือการติดตั้ง (ซึ่งหมายถึง0772,1752... สิ่งที่รวมกันถ้าไฟล์เป็นแบบเขียนสำหรับคนอื่น ๆ )
ใน-type d \( -perm -0002 -a ! -perm -1000 \)ครั้งแรกที่ทับหนีวงเล็บสำหรับเปลือกเพื่อให้พวกเขาสามารถส่งผ่านเป็นอาร์กิวเมนต์แทนการถูกตีความว่าเป็นผู้ประกอบการเป็นพิเศษโดยเปลือก (คุณต้องการเช่นเดียวกัน>ด้วยเหตุผลที่ชัดเจน) อาจเขียนเป็น'('หรือ"("เช่นกัน แต่ในที่สุดก็findจะเห็น(และ)เท่านั้น
วงเล็บจัดกลุ่มเงื่อนไขและ-aเป็นและร่วม นอกจากนี้ยังเป็นค่าเริ่มต้นโดยปริยายสำหรับเงื่อนไขย้อนกลับเช่นที่ใช้ที่นี่-type dและนิพจน์ในวงเล็บไม่มี-aการเชื่อมต่ออย่างชัดเจน นิพจน์เทียบเท่ากับ-type d -perm -0002 ! -perm -1000. วงเล็บเป็นจริงเฉพาะที่จำเป็นด้วยหรือ-oร่วม
-type dเห็นได้ชัดและวิธีการที่จะมองหาไฟล์ที่มีทั้งหมดของรับอนุญาตบิตชุด หรือในกรณีนี้ไดเร็กทอรีที่มีการตั้งค่า write for others permission ( ) และ Sticky bit ( ) unset (เนื่องจากการปฏิเสธ) ผมคิดว่าการรวมกันที่นี่ก็อาจจะเขียนเป็น สังเกตเครื่องหมายขีดที่ด้านหน้าของสตริงสิทธิ์หากไม่มีความหมายจะแตกต่างกัน ดูเช่นหน้า man ของ Linux เพื่อค้นหาค้นหา "(expr)" และ "-perm mode"-perm -NNNNNNNN00021000-perm -o+w ! -perm -o+t
สิทธิ์การเขียนไปยังไดเร็กทอรีช่วยให้สามารถสร้างลบและเปลี่ยนชื่อไฟล์ที่อยู่ภายในไดเร็กทอรีและ Sticky bit ป้องกันการลบและเปลี่ยนชื่อไฟล์ที่เป็นของผู้ใช้รายอื่น นิพจน์ทั้งหมดค้นหาไดเร็กทอรีที่ทุกคนสามารถลบหรือเปลี่ยนชื่อไฟล์ใด ๆ
-a: เป็นตรรกะและ (-oสามารถใช้สำหรับหรือ)\(,\): เนื่องจากวงเล็บมีความหมายพิเศษในเชลล์จึงใช้เครื่องหมายทับเพื่อหลบหนี- สิทธิ์สี่หลักที่เกี่ยวข้องกับ
sticky bit,setuid,setgid