ฉันต้องการค้นหาไฟล์ที่ผู้ใช้บางรายไม่สามารถอ่านได้
สมมติว่าชื่อผู้ใช้คือ "user123" และอยู่ในกลุ่มชื่อ "user123" ฉันต้องการค้นหาไฟล์ที่ถ้าพวกเขาเป็นเจ้าของโดย user123 มี u + r บน; ความล้มเหลวที่ถ้าไฟล์เป็นกลุ่มผู้ใช้ 123 ควรมี g + r ใน; ความล้มเหลวที่มันสามารถมี o + r บน
เนื่องจาก GNU find มี "- อ่านได้" ฉันสามารถทำสิ่งนี้ได้:
sudo -u user123 find /start ! -readable -ls
อย่างไรก็ตามกระบวนการต้องดำเนินการโดยผู้ใช้ที่ไม่มีสิทธิ์เข้าถึง sudo ดังนั้นฉันจึงลองทำสิ่งนี้: (มันไม่ตรวจสอบ o + r แต่นั่นไม่สำคัญในตอนนี้)
find /start \( -user user123 ! -perm -u=r \) -o \( -group user123 ! -perm -g=r \) -ls
แต่มันจะแสดงรายการไฟล์นี้:
272118 4 -rw------- 1 user123 user123 3243 Jul 3 19:50 /start/blah/blah/file.txt
ไฟล์นี้เป็นไฟล์เดียวที่อยู่ภายใต้/start
ที่เป็นเจ้าของโดย user123 พร้อมกับg=r
off มันเป็นถ้าพบคือตีความเป็น-u=r
-g=r
ฉันตัดสินใจลองย้อนกลับตรรกะและทดสอบnot ( truth )
แทน:
find /etc/puppet ! \( \( -user puppet -perm -u=r \) -o \( -group puppet -perm -g=r \) -o \( -perm -o=r \) \) -ls
ได้ผลจริง!
เหตุใดต้นฉบับดั้งเดิมจึงfind
ล้มเหลว มันเป็นข้อผิดพลาดในfind
(ไม่น่า) หรือเป็นตรรกะที่ผิด?
ปรับปรุง:ฉันมีเหตุผลที่ไม่ถูกต้อง ตามที่ระบุไว้ด้านล่างตั้งแต่! (A || B || C) == (! A&&! B&&! C) เหล่านี้เป็นสองข้อความที่เทียบเท่ากัน:
find /start ! \( \( -user user123 -perm -u=r \) -o \( -group user123 -perm -g=r \) -o \( ! \( -user user123 -o -group user123 \) -perm -o=r \) \) -ls
find /start ! \( -user user123 -perm -u=r \) ! \( -group user123 -perm -g=r \) ! \( ! \( -user user123 -o -group user123 \) -perm -o=r \) -ls
เป้าหมายของฉันคือไม่ต้องทดสอบผู้ใช้ / กลุ่มสองครั้ง สิ่งที่ฉันต้องการจริงๆคือโครงสร้างที่ซับซ้อนกว่านั้นอีกซึ่งอาจเป็นไปได้ก็ต่อเมื่อมีตัวดำเนินการ -xor ฉันสามารถสร้าง xor จากและ / หรือ / ไม่ แต่มันจะซับซ้อนกว่าโซลูชันทั้งสองข้างต้น
puppet
--wxrwxrwx puppet puppet