GNU/Linux >> Znalost Linux >  >> Linux

Najít soubory, které uživatel nemůže číst?

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ý.
Související:Linux – Jak zjistit, které vydání kernelu ho obsahuje, když má git commit hash?

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 🙂


Linux
  1. Získání všech souborů, které byly upraveny ke konkrétnímu datu?

  2. Jak najít všechny soubory, které neobsahují textový řetězec?

  3. Najít největší soubory rekurzivně?

  1. Jak mohu použít xargs ke kopírování souborů, které mají v názvech mezery a uvozovky?

  2. Může read(2) vrátit nulu, když není na EOF?

  3. Hledání souborů, které NENÍ ve vlastnictví konkrétního uživatele

  1. Může být skript spustitelný, ale nečitelný?

  2. Jak najdu všechny pevné odkazy na souborovém systému?

  3. Proč mohou „Ostatní“ číst soubory ve výchozím nastavení v Ubuntu?