我想查找特定用户将无法读取的文件。
假设用户名是“ user123”,并且它们在一个名为“ user123”的组中。我想找到的文件,如果它们是user123所拥有的,则打开u + r;失败,如果该文件是组user123,则应启用g + r;否则它可能会打开o + r。
由于GNU find具有“可读性”,因此我可以这样做:
sudo -u user123 find /start ! -readable -ls
但是,该过程必须由没有sudo访问权限的用户运行。因此,II尝试了此操作:(它不检查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 的唯一文件。好像find在解释-u=r
as -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
我的目标是不必两次测试用户/组。我真正需要的是一个更复杂的if-then-else结构,只有在有-xor运算符的情况下才可能实现。我可以用和/或不可以构建异或,但是它比上面的两个解决方案要复杂得多。
puppet
可以使用来访问文件--wxrwxrwx puppet puppet
。