Belirli bir kullanıcının okuyamayacağı dosyaları bulmak istiyorum.
Kullanıcı adının "user123" olduğunu ve "user123" adlı bir grupta olduklarını varsayın. Ben kullanıcı123 sahip oldukları u + r sahip dosyaları bulmak istiyorum; dosya kullanıcı123 grubu ise, g + r açık olmalıdır; başarısız olursa o + r açık olabilir.
GNU bulgusu "okunabilir" olduğundan, bunu yapabilirim:
sudo -u user123 find /start ! -readable -ls
Ancak bu işlem sudo erişimi olmayan bir kullanıcı tarafından çalıştırılmalıdır. Bu nedenle II bunu denedi: (o + r'yi kontrol etmiyor, ancak bu noktada önemli değil)
find /start \( -user user123 ! -perm -u=r \) -o \( -group user123 ! -perm -g=r \) -ls
ancak bu dosyayı listeler:
272118 4 -rw------- 1 user123 user123 3243 Jul 3 19:50 /start/blah/blah/file.txt
Bu dosya, /start
user123 tarafından g=r
kapalı olan tek dosyadır . Bulmak yorumluyor sanki -u=r
kadar -g=r
.
Mantığı tersine çevirmeye karar verdim ve bunun yerine test ettim not ( truth )
:
find /etc/puppet ! \( \( -user puppet -perm -u=r \) -o \( -group puppet -perm -g=r \) -o \( -perm -o=r \) \) -ls
Bu çalışır!
Orijinal neden find
başarısız oldu? Bu bir hata mı find
(olası değil) veya mantık yanlış mı?
Güncelleme: Mantık yanlıştı. Aşağıda belirtildiği gibi, o zamandan beri! (A || B || C) == (! A &&! B &&! C) bunlar iki eşdeğer ifadedir:
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
Amacım kullanıcı / grubu iki kez test etmek zorunda değildi. Gerçekten ihtiyacım olan daha karmaşık bir if-then-else yapısı, muhtemelen sadece -xor operatörü olsaydı mümkün olurdu. Bir xor oluşturabilirim ve / veya / değil ama yukarıdaki iki çözümden daha karmaşık olurdu.
puppet
ile bir dosyaya erişimi vardır--wxrwxrwx puppet puppet
.