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.