GNU/Linux >> Znalost Linux >  >> Linux

Jak se oprávnění k souboru vztahují na symbolické odkazy?

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šak chmod změní oprávnění odkazovaného souboru. Naproti tomu chmod 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 zobrazuje lrwxrwxrwx 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ž POSIX lchown() systémové volání k dosažení tohoto cíle) a stat() systémové volání vrací tuto hodnotu pro st_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ů.


Linux
  1. Linux chmod and chown – Jak změnit oprávnění a vlastnictví souborů v Linuxu

  2. Jak změnit oprávnění k souboru v cPanel File Manager

  3. Pochopení oprávnění UNIX a typů souborů

  1. Oprávnění pro Linux:Úvod do chmod

  2. Jak změnit oprávnění k souborům na disku Fat32?

  3. Jak použít chmod ke změně oprávnění k souboru?

  1. Jak změnit oprávnění souborů rekurzivně pomocí chmod v Linuxu

  2. Jak odstranit setgid (linux/unix)?

  3. Jak umask ovlivňuje ACL?