Pourquoi Linux / POSIX ont lchown mais pas lchmod?

11

Il semble que Linux supporte le changement de propriétaire d'un lien symbolique (ie lchown) mais changer le mode / permission d'un lien symbolique (ie lchmod) n'est pas supporté . Autant que je sache, cela est conforme à POSIX. Cependant, je ne comprends pas pourquoi on soutiendrait l'une ou l'autre de ces opérations mais pas les deux. Quelle est la motivation derrière cela?

Florian Brucker
la source
1
Les autorisations d'un lien symbolique sont toujours lrwxrwxrwx. A chmodn'a aucun sens ici. En suivant le lien, vous accédez aux autorisations des cibles.
ott--
2
@ott: Sous Linux, les autorisations d'un lien symbolique sont toujours celles que vous avez données précisément parce que Linux ne prend pas en charge lchmod. Mais d'autres systèmes d'exploitation de type Unix le prennent en charge (par exemple Mac OS X ), donc la question est de savoir pourquoi Linux ne le fait pas quand il le prend en charge lchown.
Florian Brucker

Réponses:

9

Linux, comme la plupart des systèmes de type Unix (Apple OS / X étant l'une des rares exceptions), ignore les autorisations sur les liens symboliques lorsqu'il s'agit de résoudre leurs cibles par exemple.

Cependant, la propriété des liens symboliques, comme d'autres fichiers, est pertinente en ce qui concerne l'autorisation de renommer ou de dissocier leurs entrées dans des répertoires dont le tbit est défini, tels que /tmp.

Pour pouvoir supprimer ou renommer un fichier (lien symbolique ou non) dans /tmp, vous devez être le propriétaire du fichier. C'est une des raisons pour lesquelles on peut vouloir changer la propriété d'un lien symbolique (pour accorder ou supprimer l'autorisation de dissocier / renommer).

$ ln -s / /tmp/x
$ rm /tmp/x
# OK removed

$ ln -s / /tmp/x
$ sudo chown -h nobody /tmp/x
$ rm /tmp/x
rm: cannot remove ‘/tmp/x’: Operation not permitted

De plus, comme mentionné par Mark Plotnick dans sa réponse maintenant supprimée , les applications de sauvegarde et d'archivage doivent lchown()restaurer les liens symboliques vers leurs propriétaires d'origine. Une autre option serait de changer euid et egid avant de créer le lien symbolique, mais cela ne serait pas efficace et ne compliquerait pas la bonne gestion du répertoire dans lequel le lien symbolique est extrait.

Stéphane Chazelas
la source
Je ne sais pas si c'est la motivation d'origine, mais cela donne une raison pour laquelle le design est utile. Merci!
Florian Brucker du
0

Il n'y a pas de lchmod () dans posix mais fchmodat () qui permettrait de définir les permissions d'un lien symbolique. Cela ne nécessite toujours pas l'évaluation des autorisations des liens symboliques.

schily
la source
1
OP sait que ne pas avoir lchmodest conforme à POSIX. Qu'est-ce que cette réponse ajoute qui n'est pas déjà dans la question?
muru
L'op a demandé pourquoi une seule des fonctions est prise en charge et j'ai expliqué que pratiquement les deux sont disponibles, mais pas sous le nom mentionné.
schily
1
Comment? La norme dit : Certaines implémentations peuvent permettre de changer le mode des liens symboliques. Ceci n'est pas pris en charge par les interfaces dans la spécification POSIX. Les systèmes avec un tel support fournissent une interface nommée lchmod (). Pour prendre en charge de telles implémentations, fchmodat () a un paramètre indicateur. Tout cela indique qu'il y a un indicateur pour fchmodat qui permet à l'implémentation de changer les perms des liens symboliques. Ce n'est pas nécessairement le cas.
muru
Correct, comme les permissions des liens symboliques ne sont pas évaluées depuis 35 ans, cela n'a aucun sens de changer les modes. Fchmodat () existe pour l'orthogonslité. Le seul véritable avantage était futimensat () car des horodatages réglables pour les liens symboliques aident les humains à comprendre une arborescence de répertoires.
schily
@schilly, OS / X respecte les autorisations sur les liens symboliques. Là, si vous ne disposez pas des autorisations de lecture, vous ne pouvez pas résoudre leurs cibles.
Stéphane Chazelas