특정 사용자가 읽을 수없는 파일을 찾고 싶습니다.
사용자 이름이 "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
입니다. 마치 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 연산자가있는 경우에만 가능합니다. 나는 xor를 만들거나하지 않을 수 있지만 위의 두 솔루션보다 더 복잡 할 것입니다.
puppet
로 파일에 액세스 할 수 있기 때문에 잘못 되었습니다--wxrwxrwx puppet puppet
.