Chci najít soubory, které konkrétní uživatel nebude moci číst.
Předpokládejme, že uživatelské jméno je „user123“ a jsou ve skupině s názvem „user123“. Chci najít soubory, které, pokud jsou vlastněny uživatelem 123, mají zapnuté u+r; pokud je soubor group user123, měl by mít zapnuté g+r; v opačném případě může mít zapnuté o+r.
Protože GNU find má „-readable“, mohl bych udělat toto:
sudo -u user123 find /start ! -readable -ls
Proces však musí spustit uživatel, který nemá přístup sudo. Proto jsem zkusil toto:(nekontroluje to o+r, ale to v tuto chvíli není důležité)
find /start ( -user user123 ! -perm -u=r ) -o ( -group user123 ! -perm -g=r ) -ls
ale uvádí tento soubor:
272118 4 -rw------- 1 user123 user123 3243 Jul 3 19:50 /start/blah/blah/file.txt
Tento soubor je jediným souborem pod /start
který je ve vlastnictví user123 s g=r
vypnuto. Je to, jako kdyby find interpretoval -u=r
jako -g=r
.
Rozhodl jsem se zkusit obrátit logiku a místo toho otestovat not ( truth )
místo toho:
find /etc/puppet ! ( ( -user puppet -perm -u=r ) -o ( -group puppet -perm -g=r ) -o ( -perm -o=r ) ) -ls
To funguje!
Proč původní find
selhat? Je to chyba v find
(nepravděpodobné) nebo je logika špatná?
Aktualizace: Měl jsem špatnou logiku. Jak je uvedeno níže, protože
! ( A || B || C ) ==( !A &&!B &&!C )
toto jsou dva ekvivalentní výroky:
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
Mým cílem bylo, abych nemusel testovat uživatele/skupinu dvakrát. Co opravdu potřebuji, je složitější struktura if-then-else, která by pravděpodobně byla možná pouze v případě, že by existoval operátor -xor. Mohl bych sestavit xor z a/nebo/ne, ale bylo by to složitější než dvě výše uvedená řešení.
Přijatá odpověď:
Logika je špatná. Myslíte si, že tento soubor neměl být uveden, protože je ve vlastnictví user123
a má r
uživatele bitová sada. Je však uveden, protože odpovídá druhému kritériu (vlastní jej skupina user123
a má r
skupiny bit nenastavený).
Vaše druhá verze funguje díky jednomu z de Morganových zákonů:negace logického ORingu skupiny příkazů je logicky ekvivalentní AND negace jednotlivých příkazů. Jinými slovy:
! ( A || B || C ) == ( !A && !B && !C )
Takže funkční find
hledá soubor, který
- Není (ve vlastnictví uživatele
user123
a čitelné pro daného uživatele) AND - Není (vlastněno skupinou
user123
a čitelné pro uvedenou skupinu) AND - Není světově čitelný.
zatímco první find
hledá soubor, který
- Je ve vlastnictví uživatele
user123
a nečitelný daným uživatelem NEBO - Je ve vlastnictví skupiny
user123
a není čitelný pro uvedenou skupinu NEBO (pokud jste jej dokončili) - Není světově čitelný
Takže soubor vyhovující JAKÉMUKOLI z výše uvedených 3 kritérií (a ne nutně všem) bude uveden tak, jak jste viděli.
Upravit
Mimochodem (po zhlédnutí vašeho profilu) jsem velkým fanouškem vaší knihy O’Reilly 🙂