Question Comment les autorisations de fichiers s'appliquent-elles aux liens symboliques?


Disons que vous avez cette structure:

+ directory
-- file1
-- file2
-- file3 -> /tmp/file3

file3 est un lien vers un autre file3 ailleurs sur le système.

Maintenant disons que je chmod 777 le répertoire et tous les contenus qu'il contient. Est-ce que mon file3 dans /tmp recevoir ces autorisations? Aussi, disons que nous avons la même situation mais inversé.

/tmp/file3 -> /directory/file3

Si j'applique les autorisations sur le fichier lié, comment cela affecte-t-il le lien?


80
2018-06-27 20:42


origine


Les autorisations n'affectent que le fichier, pas le lien symbolique. - baraboom


Réponses:


Cela dépend de comment vous appelez chmod et la plate-forme que vous utilisez.

Par exemple, sur un système Linux, man chmod dit ceci:

chmod  ne modifie jamais les permissions des liens symboliques; la chmod   L'appel système ne peut pas modifier leurs autorisations. Ce n'est pas un problème   puisque les permissions des liens symboliques ne sont jamais utilisées. cependant,   pour chaque lien symbolique répertorié sur la ligne de commande, chmod change le   les autorisations du fichier pointé. En revanche, chmod ne tient pas compte   liens symboliques rencontrés lors des traversées de répertoires récursives.

Cependant, sur un Mac, chmod peut être utilisé pour modifier les permissions d’un lien symbolique en utilisant des options telles que man chmod):

-h Si le fichier est un lien symbolique, changez le mode du lien   lui-même plutôt que le fichier que le lien pointe vers.

Par exemple, supposons que vous êtes sur une machine Linux pour le reste de cette réponse.

Si dans le premier cas vous courez chmod -R 777 directory pour modifier récursivement les autorisations, la cible du lien ne sera pas affectée, mais si vous le faites chmod 777 directory/*, ce sera.

Si vous modifiez les autorisations sur la cible de lien directement, ces autorisations seront transférées (car en tant que page de manuel et baraboom Par exemple, les autorisations de lien ne sont utilisées pour rien).


Journal de test pour illustration:

$ 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

80
2018-06-27 21:23



Ce fut une surprise pour moi aussi. Question suivante: qui fait les autorisations sur un lien symbolique signifier? - Edward Falk
Les autorisations de lien symbolique @EdwardFalk ne sont pas non restrictives car tout doit pouvoir être parcouru pour obtenir les autorisations du fichier lié. - Walf


Les réponses de baraboom et peth sont toutes les deux correctes: les bits de permission sur les liens symboliques eux-mêmes ne sont pas pertinents (sauf sur macOS; voir ci-dessous), et la modification de l'autorisation sur un lien symbolique - par le chmod outil de ligne de commande ou par le chmod() appel système - agira simplement comme si elle était effectuée contre la cible du lien symbolique.

Citer la description SUSv4 / POSIX.1-2008 de l'appel système symlink ():

Les valeurs des bits en mode fichier pour le lien symbolique créé ne sont pas spécifiées. Toutes les interfaces spécifiées par POSIX.1-2008 doivent se comporter comme si le contenu des liens symboliques pouvait toujours être lu, sauf que la valeur des bits du mode fichier renvoyés dans le st_mode domaine de la stat la structure n'est pas spécifiée.

Ici, "non spécifié" laisse place à l'interprétation pour chaque implémentation. Détails:

  • Sous Linux (testé avec ext4fs), stat() résultats st_mode=0777, quel que soit le umask lors de la création du lien symbolique; ls -l affiche donc toujours lrwxrwxrwx pour les liens symboliques.
  • Sur macOS (HFS) et FreeBSD (UFS et ZFS), un lien symbolique a sa propre permission: chmod -h La commande ci-dessus peut modifier cette autorisation de lien (qui utilise en interne un lchown()appel système pour y parvenir), et le stat() appel système renvoie cette valeur pour st_mode.

Les liens symboliques sous Linux et FreeBSD peuvent toujours être suivis, comme spécifié par POSIX. En particulier, sur FreeBSD, cela signifie que le mode de fichier d’un lien symbolique n’a aucun effet sur le contrôle d’accès.

En revanche, macOS interrompt légèrement POSIX. Bien qu'un lien symbolique puisse être suivi, quelle que soit son autorisation de lecture, readlink() échoue avec EACCES (Autorisation refusée) si l'utilisateur ne dispose pas de l'autorisation de lecture:

$ 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

(Notez que le -> target partie manquante dans la sortie de la seconde ls -l commande, et que cat symlink encore réussi et imprimé le contenu de la target fichier même si l'utilisateur n'avait pas l'autorisation de lecture sur symlink.)

NetBSD propose apparemment une option de montage spéciale nommée symperm qui, s'il est défini, provoque des autorisations de lecture / exécution de lien symbolique pour contrôler readlink() et traverser le lien.


2
2018-03-14 20:32





  1. déposez le fichier de liens (après vous être assuré qu'il n'est utilisé par aucun processus)
  2. définir umask de telle manière que le 777-umask = autorisations de fichier requises
  3. créer le fichier de lien à nouveau

-1
2017-10-02 05:48



Comment cela répond-il à la question? - jww