Portál AbcLinuxu, 5. května 2025 23:21
$ ls -l | grep tmp drwxrwxrwt 37 root root 760 Mar 24 13:57 tmp2) Vytvorim adresar pomoci PHPkove funkce
mkdir("/tmp/ftpdown/data",0666, true). vysledkem je
php /opt/test/test.php PHP Warning: mkdir(): Permission denied in /opt/test/test.php on line 23Funkce mkdir vrati false. WTF? 3) Kdo jsem?
$ whoami uzivatel4) Je tam ten adresář? A kdo ho vlastní?
$ cd /tmp $ ls -l | grep ftpdown drw-rw-r-- 2 uzivatel uzivatel 40 Mar 24 13:43 ftpdownWTF? 3) Co je uvnitř?
$ cd ftpdown bash: cd: ftpdown: Permission deniedWTF? 4) A jako root co?
$ su Password: # whoami root # cd ftpdown # ls # cd .. # ls -l | grep ftpdown drw-rw-r-- 2 uzivatel uzivatel 40 Mar 24 13:43 ftpdown # exit $ ls -l | grep ftpdown drw-rw-r-- 2 uzivatel uzivatel 40 Mar 24 13:43 ftpdown $ cd ftpdown bash: cd: ftpdown: Permission denied $ whoami uzivatel $ rmdir ftpdown $ ls -l | grep ftpdownNo to rozhodne dava smysl ze uzivatel nemuze prejit do adresare ktery mu patri a ktery sam vytvoril (i kdyz ne uplne zcela podle zadani - mel vytvorit rekurzivne celou cestu), ale za to smazat ho muze bez problemu. To je co za skvelou featuru tohle chovani? Nebo co za novinku ve Fedore nechapu, ze mi to vubec nedava smysl? Muze me to nekdo prosim vysvetlit?
Řešení dotazu:
cd
test
objekty a,b,c
tak
carbon% mkdir test carbon% cd test carbon% touch a carbon% touch b carbon% mkdir c carbon% cd .. carbon% chmod 0666 test carbon% ls -l test ls: nelze přistoupit k 'test/a': Operace zamítnuta ls: nelze přistoupit k 'test/b': Operace zamítnuta ls: nelze přistoupit k 'test/c': Operace zamítnuta celkem 0 -????????? ? ? ? ? ? a -????????? ? ? ? ? ? b d????????? ? ? ? ? ? c carbon% chmod 777 test carbon% ls -l test celkem 0 -rw-r--r-- 1 a a 0 24. bře 16.14 a -rw-r--r-- 1 a a 0 24. bře 16.15 b drwxr-xr-x 1 a a 0 24. bře 16.15 cPrávo read umožní číst názvy v adresáři. právo x umožní číst a měnit inode.
x
je právo vstoupit do adresáře. Kdyby bylo pro čtení inode nutné právo x
, nepřečetl byste data z inode žádného nespustitelného souboru. A můžete si to vyzkoušet i v tom vašem příkladu – nechte si vypsat ls -l
a uvidíte, že vám to o adresáři test vypíše i údaje uložené v inode (oprávnění, uživatele, datum vytvoření atd.). ls -l test
selhává z toho důvodu, že abyste mohl přečíst data o test/a
, musíte nejdřív vstoupit do adresáře test
. A k tomu potřebujete právo x
na test
.
x
na adresáři neuděláte ani obyčejné cd
do toho adresáře, a k tomu není potřeba dělat nic s inody objektů, které jsou v adresáři – ten adresář dokonce může být prázdný. Právo x
opravdu znamená jen možnost vstoupit do adresáře, což je to, co v uživatelském prostoru dělá příkaz cd
. Důvod, proč se nedostanete k těm inodům přes tento adresář je ten, že byste do něj nejprve musel vstoupit, abyste se k nim dostal. Nic vám ale nebrání se k nim dostat přes jinou cestu (pokud existuje).
test % mkdir -p level1/level2 test % cd level1/level2 level2 % touch file level2 % ls -l total 0 -rw-r--r-- 1 filip filip 0 Mar 25 22:35 file level2 % chmod u-x ../ #adresáři level1 odeberu právo x level2 % ls -l total 0 -rw-r--r-- 1 filip filip 0 Mar 25 22:35 file #a pro zajímavost level2 % ls -l ../../ ls: cannot access ../../: Permission denied level2 % cd .. cd: permission denied: .. level2 % cd ../.. cd: permission denied: ../.. level2 % cd ~ %Jak je vidět, problém je opravdu v tom vstoupení do adresáře – pokud už v adresáři jsem nebo se do něj dostanu jinudy, právo
x
se mne nijak netýká.
r
. Představte si to tak, jak to bylo implementováno v prvních unixových souborových systémech – adresář je jenom zvláštní druh souboru, který má v „obsahu souboru“ uvedený seznam souborů, které jsou v tom adresáři. Když chcete číst obsah souboru (ať je to skutečný soubor nebo adresář), potřebujete k tomu právo r
. Když se na soubor odkazujete pomocí cesty, musíte jít po jednotlivých adresářích – vždy vstoupit do adresáře (na to potřebujete právo x
) a pak můžete zase o adresář níž nebo se dostanete ke konkrétnímu souboru. Pokud nemáte právo r
na nějaký adresář, ale máte na něj právo x
, můžete přečíst soubor v tom adresáři nebo vstoupit do podadresáře, pokud znáte jejich jména.
ls -l tmpa když už máte tu Fedoru
ll tmp
ls -ld tmp
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.