ธง -perm ในการค้นหา

Sep 05 2020

ฉันพยายามห่อหัวรอบคำสั่งนี้:

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ธงทำอะไร?

คำตอบ

4 netmonk Sep 05 2020 at 17:45

ในคู่มือคุณสามารถค้นหา:

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... สิ่งที่รวมกันถ้าไฟล์เป็นแบบเขียนสำหรับคนอื่น ๆ )
5 ilkkachu Sep 05 2020 at 22:23

ใน-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 ป้องกันการลบและเปลี่ยนชื่อไฟล์ที่เป็นของผู้ใช้รายอื่น นิพจน์ทั้งหมดค้นหาไดเร็กทอรีที่ทุกคนสามารถลบหรือเปลี่ยนชื่อไฟล์ใด ๆ

2 binarysta Sep 05 2020 at 17:47
  • -a: เป็นตรรกะและ ( -oสามารถใช้สำหรับหรือ)
  • \(, \): เนื่องจากวงเล็บมีความหมายพิเศษในเชลล์จึงใช้เครื่องหมายทับเพื่อหลบหนี
  • สิทธิ์สี่หลักที่เกี่ยวข้องกับsticky bit, setuid,setgid