Záleží na tom, jak zavoláte chmod
a platformě, na které běžíte.
Například v systému Linux man chmod
říká toto:
chmod
nikdy nemění oprávnění symbolických odkazů;chmod
systémové volání nemůže změnit jejich oprávnění. To není problém, protože oprávnění symbolických odkazů se nikdy nepoužívají. Pro každý symbolický odkaz uvedený na příkazovém řádku všakchmod
změní oprávnění odkazovaného souboru. Naproti tomuchmod
ignoruje symbolické odkazy, ke kterým došlo během rekurzivního procházení adresářů.
Na počítačích Mac však lze chmod použít k úpravě oprávnění symbolického odkazu pomocí možností, jako je tato (z man chmod
):
-h Pokud je soubor symbolický odkaz, změňte režim samotného odkazu spíše než souboru, na který odkaz ukazuje.
Pro příklad předpokládejme, že zbytek této odpovědi používáte na počítači s Linuxem.
Pokud v prvním případě spustíte chmod -R 777 directory
chcete-li rekurzivně změnit oprávnění, cíl odkazu nebude ovlivněn, ale pokud to uděláte chmod 777 directory/*
, bude.
Pokud změníte oprávnění u cíle odkazu přímo, tato oprávnění se provedou (protože jak říkají manuálová stránka a baraboom, skutečná oprávnění k odkazu se k ničemu nepoužívají).
Testovací protokol pro ilustraci:
$ mkdir dir && touch dir/file{1,2} /tmp/file3 && ln -s {/tmp,dir}/file3
$ ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group 0 2011-06-27 22:02 /tmp/file3
-rw-r--r-- 1 user group 0 2011-06-27 22:02 dir/file1
-rw-r--r-- 1 user group 0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3
$ chmod -R 777 dir && ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group 0 2011-06-27 22:02 /tmp/file3
-rwxrwxrwx 1 user group 0 2011-06-27 22:02 dir/file1
-rwxrwxrwx 1 user group 0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3
$ chmod 700 dir/* && ls -l dir/* /tmp/file3
-rwx------ 1 user group 0 2011-06-27 22:02 /tmp/file3
-rwx------ 1 user group 0 2011-06-27 22:02 dir/file1
-rwx------ 1 user group 0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3
Odpovědi barabooma a petha jsou správné:Bity oprávnění na samotných symbolických odkazech jsou irelevantní (kromě systému macOS; viz níže) a změna oprávnění u symbolického odkazu – pomocí chmod
nástrojem příkazového řádku nebo pomocí chmod()
systémové volání – bude jednoduše fungovat, jako by bylo provedeno proti cíli symbolického odkazu.
Chcete-li citovat SUSv4/POSIX.1-2008 popis systémového volání symlink():
Hodnoty bitů režimu souboru pro vytvořený symbolický odkaz nejsou specifikovány. Všechna rozhraní specifikovaná v POSIX.1-2008 se musí chovat tak, jako by obsah symbolických odkazů bylo možné vždy přečíst, kromě hodnoty bitů režimu souboru vrácených v st_mode pole stat struktura není specifikována.
Zde „nespecifikováno“ ponechává prostor pro interpretaci pro každou implementaci. Specifikace:
- V systému Linux (testováno pomocí ext4fs),
stat()
vrátíst_mode=0777
, bez ohledu na to, jaký byl umask, když byl symbolický odkaz vytvořen;ls -l
proto vždy zobrazujelrwxrwxrwx
pro symbolické odkazy. - V systémech macOS (HFS) a FreeBSD (UFS i ZFS) má symbolický odkaz vlastní oprávnění:
chmod -h
výše uvedený příkaz může změnit toto oprávnění k propojení (které interně používá jiné než POSIXlchown()
systémové volání k dosažení tohoto cíle) astat()
systémové volání vrací tuto hodnotu prost_mode
.
Symbolické odkazy na Linuxu a FreeBSD lze vždy následovat, jak je uvedeno v POSIX. Zejména na FreeBSD to znamená, že souborový režim symbolického odkazu nemá vůbec žádný vliv na řízení přístupu.
Na druhou stranu macOS mírně porušuje POSIX. Ačkoli symbolický odkaz lze sledovat bez ohledu na jeho oprávnění ke čtení, readlink()
selže s EACCES
(Oprávnění odepřeno), pokud uživatel nemá oprávnění ke čtení:
$ sudo ln -shf target symlink
$ sudo chmod -h 444 symlink
$ ls -l symlink
lr--r--r-- 1 root staff 1 Mar 14 13:05 symlink -> target
$ sudo chmod -h 000 symlink
$ ls -l symlink
ls: symlink: Permission denied
l--------- 1 root staff 1 Mar 14 13:05 symlink
$ echo kthxbye > target
$ cat symlink
kthxbye
(Všimněte si, že -> target
část chybí ve výstupu z druhého ls -l
a to cat symlink
přesto uspěl a vytiskl obsah target
soubor, i když uživatel neměl oprávnění ke čtení na symlink
.)
NetBSD zjevně nabízí speciální možnost připojení s názvem symperm
což, pokud je nastaveno, způsobí oprávnění ke čtení/spouštění symbolických odkazů k ovládání readlink()
a procházení odkazů.