GNU/Linux >> Znalost Linux >  >> Linux

Existuje soubor, který vždy existuje a 'normální' uživatel ho nemůže lstat?

Na moderních systémech Linux byste měli být schopni používat /proc/1/fdinfo/0 (informace pro deskriptor souboru 1 (stdout) procesu id 1 (init v kořenovém jmenném prostoru pid, který by měl běžet jako root )).

Seznam můžete najít pomocí (jako běžný uživatel):

sudo find /etc /dev /sys /proc -type f -print0 |
  perl -l -0ne 'print unless lstat'

(odeberte -type f pokud se nechcete omezovat na běžné soubory).

/var/cache/ldconfig/aux-cache je dalším potenciálním kandidátem, pokud potřebujete zvážit pouze systémy Ubuntu. Měl by fungovat na většině GNU systémů jako /var/cache/ldconfig je vytvořen pro čtení+zápis+prohledávání pro root pouze pomocí ldconfig příkaz, který je součástí GNU libc.


Když se podíváte na manuálovou stránku lstat(2), můžete se inspirovat případy, které by mohly způsobit selhání s jinými chybami než ENOENT (soubor neexistuje.)

Nejzřetelnější z nich je:

EACCES Pro jeden z adresářů v předponě cesty cesta je odepřeno oprávnění k vyhledávání .

Potřebujete tedy adresář, ve kterém nelze vyhledávat.

Ano, můžete vyhledat takový, který již ve vašem systému je (možná /var/lib/private pokud existuje?) Ale můžete si jej také vytvořit sami, s ekvivalentem:

$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile

Operace lstat(2) selže s EACCES zde. (Odebrání všech oprávnění z adresáře to zajistí. Možná toho ani tolik nepotřebujete a chmod -x odstranění oprávnění ke spuštění by stačilo, protože oprávnění ke spuštění v adresáři jsou potřebná pro přístup k souborům v něm.)

Existuje další kreativní způsob, jak zabránit selhání lstat(2), když se podíváte na jeho manuálovou stránku:

ENOTDIR Komponenta předpony cesty cesta není adresář.

Takže pokus o přístup k souboru jako /etc/passwd/nonexistent by měla spustit tuto chybu, která se opět liší od ENOENT ("Žádný takový soubor nebo adresář") a může vyhovovat vašim potřebám.

Další je:

ENAMETOOONG cesta je příliš dlouhý.

Ale možná budete potřebovat opravdu dlouhý název (domnívám se, že 4 096 bajtů je typický limit, ale váš systém/souborový systém může mít delší.)

Nakonec je těžké říci, zda některý z nich bude skutečně užitečné pro vás. Říkáte, že chcete něco, co nespustí scénář „soubor neexistuje“. I když to obvykle znamená chybu ENOENT, v praxi mnoho kontrol na vyšší úrovni jednoduše interpretuje jakoukoli chybu z lstat(2) jako "neexistuje". Například test -e nebo ekvivalentní [ -e ...] z shellu může jednoduše interpretovat vše výše uvedené jako „neexistuje“, zejména proto, že nemá dobrý způsob, jak vrátit jinou chybovou zprávu a nevrácení chyby by znamenalo, že soubor existuje, což zcela jistě není případ.


Můžete find to sám.

Pomocí /etc -- adresář konfiguračních souborů jako výchozí bod:

sudo find /etc -type f -perm 0400 -user root

V mém systému to nic nevrací.

Můžete být méně omezující a povolit skupinu root (pouze uživatel root by měl být členem skupiny root ) a dávejte pozor na povolení 440 :

sudo find /etc -perm 0440 -user root -group root

V mém systému to vrací:

/etc/sudoers.d/README
/etc/sudoers

Upravit:

Na základě vaší úpravy hledáte adresář, který nemá dostatečná oprávnění pro volajícího uživatele, aby zabránil výpisu adresáře:

sudo find / -perm o-rwx -type d -user root -group root 

zde hledám adresáře (-type d ), kterým chybí perm bity pro čtení-zápis-spouštění pro ostatní (o-rwx ) a je ve vlastnictví root:root .

Technicky vzato, pouze absence provádění (x ) bit by zabránil výpisu adresáře (lstat(2) ) v adresáři.

Ve výstupu jsem našel /run/systemd/inaccessible/ na mém systému založeném na inicializaci Systemd.

Pokud jde o soubory v /proc , /sys , /dev :

  • Tyto souborové systémy jsou virtuální FS, tj. jsou umístěny v paměti, nikoli na disku

  • Pokud se plánujete spolehnout na /proc , použijte /proc/1/ tj. spoléhejte se na něco pod PID 1, nikoli na žádné pozdější PID, aby měly spolehlivost/konzistenci, protože u pozdějších PID (procesů) není zaručena existence.


Linux
  1. Jak spravovat oprávnění/vlastnictví souborů a adresářů v Linuxu

  2. Jak mohu zkontrolovat, zda soubor existuje, a provést příkaz, pokud ne?

  3. Jak vyprázdnit (zkrátit) soubor na linuxu, který již existuje a je nějakým způsobem chráněn?

  1. mkdir -p selže, když adresář existuje

  2. Jak mohu najít soubor/adresář, který by mohl být kdekoli na příkazovém řádku linuxu?

  3. Existuje proměnná instalační cesty Qt, kterou mohu použít v souboru .pro?

  1. Rozdíl mezi uživatelem Sudo a uživatelem root?

  2. Existuje nástroj, který dokáže detekovat (a pokud je to možné, opravit) závady v souborech MP3?

  3. Jak může správce souborů připojit disk bez root?