web-dev-qa-db-fra.com

Modifier les autorisations d'un lien symbolique

J'ai un lien symbolique avec ces autorisations:

lrwxrwxrwx 1 myuser myuser       38 Aug 18 00:36 npm -> ../lib/node_modules/npm/bin/npm-cli.js*

Le lien symbolique se trouve dans une archive .tar.gz. Maintenant, quand je décompresse l'archive tar.gz en utilisant maven, le lien symbolique n'est plus valide. J'essaie donc de reconstruire le lien symbolique. Je crée d'abord le lien symbolique en utilisant ln mais comment puis-je définir les mêmes autorisations que le lien symbolique d'origine?

39
u123

Vous pouvez créer un nouveau lien symbolique et le déplacer vers l'emplacement de l'ancien lien.

ln -s <new_location> npm2
mv -f npm2 npm

Cela préservera la propriété du lien. Vous pouvez également utiliser chown pour définir manuellement la propriété du lien.

chown -h myuser:myuser npm

Sur la plupart des systèmes, les autorisations de lien symbolique n'ont pas d'importance. Lors de l'utilisation du lien symbolique, les autorisations des composants de la cible du lien symbolique seront vérifiées. Cependant, sur certains systèmes, ils importent. MacOS nécessite une autorisation de lecture sur le lien pour readlink, et l'option de montage symperm de NetBSD force les vérifications des autorisations de lien sur la lecture et la traversée. Sur ces systèmes (et leurs proches, y compris FreeBSD et OpenBSD), il existe un équivalent -h option pour chmod.

chmod -h 777 npm
63
user26112

Lorsque vous essayez d'utiliser chmod pour définir les autorisations du lien, vous effectuez en réalité la définition des autorisations de la cible du lien. Les autorisations du lien n'ont aucun sens.

12
Just Do It

Lorsque vous avez un lien comme:

link -> foo/bar

et souhaitez le changer en:

link -> new/target

Il y a deux cas à considérer:

  1. foo/bar n'est pas un répertoire ou n'existe pas ou vous n'avez pas accès à la recherche à foo. alors

    ln -s new/target link
    

    échouera car link existe déjà, mais vous pouvez surmonter cela en utilisant la norme:

    ln -fs new/target link
    
  2. foo/bar est un répertoire (et vous disposez des droits de recherche sur foo pour pouvoir déterminer que foo/bar est un directeur). Dans ce cas, lorsque vous faites:

    ln -s new/target link
    

    ou

    ln -fs new/target link
    

    Cela signifie que la création d'un nouveau lien symbolique target dans le répertoire link (link est un répertoire car il s'agit d'un lien symbolique vers le foo/bar répertoire). Vous allez donc créer un:

    foo/bar/target -> new/target
    

    Pour surmonter cela, GNU ln a un -T option pour que le nom du lien soit toujours considéré comme un nom de lien, et non comme un répertoire dans lequel créer le (s) lien (s). Ainsi, avec GNU ln:

    ln -fsT new/target link
    

    marchera. Comme précédemment, il supprimera le lien symbolique link d'origine et le créera à nouveau avec new/target comme cible (et euid et egid du processus comme propriétaire).

    GNU ln a également un -n option. Cela fonctionne comme -T sauf lorsque link est en fait un vrai répertoire, auquel cas il créera toujours le lien symbolique à l'intérieur de ce répertoire (au lieu d'échouer avec une erreur).

    Portablement, votre meilleure option est de supprimer le lien d'abord, puis de le recréer:

    rm -f link && ln -s new/target link
    

Sur la plupart des systèmes, les autorisations sur les liens symboliques sont ignorées et généralement fixées à rwxrwxrwx.

Sur les systèmes où les autorisations de lien symbolique sont importantes (comme OS/X où vous avez besoin d'une autorisation de lecture sur un lien symbolique pour pouvoir résoudre sa cible), il existe généralement un moyen de les modifier (chmod -h sur OS/X).

Propriété, bien que comme ci-dessus non pertinente pour l'accès au fichier pointé par le lien symbolique sur la plupart des systèmes, peut avoir une autre pertinence par rapport au bit t du répertoire parent ou des quotas ... =) et il y a une commande standard pour le changer:

chown -h user[:group] the-link
chgrp -h group the-link
5
Stéphane Chazelas

Si vous avez vraiment besoin de modifier l'autorisation des liens symboliques (généralement sans signification, comme écrit dans d'autres réponses), j'ai réussi à utiliser -R option de chown:

chown -R myuser:mygroup link

Si -R n'a pas été utilisé, les autorisations n'ont pas été modifiées.

0
Miroslav Mocek