Pourquoi la permission est-elle refusée lors de l'utilisation de mv alors que les droits de répertoire sont corrects?

13

Je reçois une autorisation refusée lorsque j'essaie de déplacer le dossier Musicvia mvbien que le propriétaire du répertoire soit défini sur mon utilisateur et que les autorisations utilisateur soient définies sur 7. Que se passe-t-il?

(Je sais que je pourrais utiliser sudo mais je veux découvrir ce qui ne va pas. Quelque chose sent le poisson ici). Ps: je suis sur Mac OS X El Capitan.

Capture d'écran du terminal

Timo
la source
1
Quiconque tombe sur la même erreur, c'est peut-être parce que vous essayez de créer un fichier ouvert. Pas le cas OP cependant, juste pour dire que cela pourrait aider.
aderchox

Réponses:

20

Notez que, lorsque vous êtes dans un dossier a, en vous déplaçant bvers c, les autorisations de dossier adéterminent ce que vous pouvez faire.

Dans ce cas, les autorisations sur .seront les plus importantes.

Notez que les autorisations sont plus complexes que simplement rwx. Votre musicdossier a un @à la fin, le .dossier a un +à la fin.

  • Utilisez xattr -hpour déterminer les autorisations complexes pour le symbole @.
  • Utilisez getfaclpour déterminer l'ACL pour le symbole +.
Konerak
la source
Avez-vous une ressource qui couvre les "autorisations complexes", comme vous les appelez?
user1717828
man xattrpourrait être un bon point de départ.
Konerak
1
non, pas de saisie manuelle. J'ai pu chercher sur Google un autre nom: des attributs étendus , si quelqu'un d'autre veut en savoir plus.
user1717828
4
Ou utilisez ls -la@e. Très probablement ici, il y avait une deny deleteACL qui empêche également le changement de nom.
Stéphane Chazelas
1
@Timo, ces ACL empêchent de supprimer ou de renommer ces répertoires. Vraisemblablement, ils ont été mis là pour une raison, comme certaines applications comptent sur eux et échoueraient autrement.
Stéphane Chazelas
18

J'utilisais le sous-système Windows pour Linux. J'ai eu le répertoire ouvert dans une autre instance bash. La fermeture m'a permis de déplacer le répertoire.

Chris Anderson
la source
3
Dans VS Code avec une télécommande sur WSL, j'ai dû fermer l'éditeur et ouvrir un terminal à WSL en dehors de ce projet VS Code.
Bjorn
9

On dirait qu'il y avait au moins 1 fichier quelque part au fond de ce répertoire qui n'avait pas les bonnes autorisations.

Donc, ce que j'ai fait, c'est:

sudo chown -R valmar ./Music
sudo chmod -R 755 ./Music

Maintenant ça marche.

Timo
la source
17
Quel que soit le problème, donner des autorisations d'exécution aux fichiers musicaux ne devrait pas être la solution.
Stéphane Chazelas
3
Et il semble peu probable qu'un objet dans un répertoire puisse interférer avec votre capacité à renommer ce répertoire.
Scott
Je sais que c'est bizarre mais ça a fait l'affaire. L'utilisation de chmod et chown sur le répertoire lui-même n'a eu aucun effet.
Timo
est-il possible que chmod 755les autorisations spéciales «@» aient été supprimées du dossier Musique?
HorusKol
@HorusKol, ou le chown. Les symptômes de l'OP correspondraient aux répertoires ayant un ACL de suppression , mais au moins sur Yosemite, faire un chown ou chmod 755 ne supprime pas cet ACL. Vous en auriez besoin chmod -a 'everyone deny delete' Music. Cela pourrait être différent à El Capitan.
Stéphane Chazelas
4

Le problème ici a probablement à voir avec la liste de contrôle d'accès (ACL) du dossier Musique. L'ACL est un système d'autorisation distinct de ceux POSIX réguliers qui sont normalement répertoriés par ls -l. Certains autres répertoires dans le dossier Accueil et ailleurs ont également des ACL.

Pour voir les ACL dans le répertoire personnel, utilisez:

/bin/ls -le ~

Vous verrez probablement une règle comme 0: group:everyone deny deletepour le répertoire Musique. Comme vous l'avez noté, vous pouvez contourner le problème avec sudo. Si vous ne voulez pas faire cela (ou ne pouvez pas), vous avez d'autres options, étant donné que vous êtes le propriétaire du fichier. Vous pouvez supprimer l'entrée incriminée de l'ACL du répertoire Music, en fonction de son index (0 dans l'exemple que j'ai donné ci-dessus):

/bin/chmod -a# 0 Music

Ou vous pouvez supprimer toutes les entrées de l'ACL:

/bin/chmod -N Music

Vous pouvez maintenant déplacer le répertoire (sous réserve des autorisations POSIX normales). Si vous souhaitez remettre l'ACL après le déplacement, vous pouvez utiliser:

/bin/chmod +a "group:everyone deny delete" Music_tmp

Et utilisez à /bin/ls -lenouveau pour confirmer que l'ACL est comme vous le souhaitez. Consultez les exemples ACL man chmodpour plus d'informations. En particulier, cette introduction est utile:

Chaque fichier a une ACL, contenant une liste ordonnée d'entrées. Chaque entrée fait référence à un utilisateur ou à un groupe et accorde ou refuse un ensemble d'autorisations. Dans les cas où un utilisateur et un groupe existent avec le même nom, le nom de l'utilisateur / groupe peut être préfixé avec "utilisateur:" ou "groupe:" afin de spécifier le type de nom.

Commande ACL

Je ne pense pas que la page de manuel explique les règles de commande, mais cette page explique clairement les règles de commande des ACL. En particulier, une denyrègle explicite sera appliquée avant une allowrègle explicite . Ainsi, tant que l' group:everyone deny deleteentrée est en place, il n'est pas possible d'accorder à votre utilisateur la permission de supprimer avec une allowrègle. En effet, l'autorisation est refusée au everyonegroupe, qui vous inclut, et cette règle sera appliquée en premier.

Tournoiement en haut
la source
2
Je ne sais pas pourquoi cela a été rejeté. L' everyone deny deleteentrée ACL sur les répertoires de départ par défaut de macOS est la raison réelle pour laquelle les répertoires ne peuvent être ni déplacés ni supprimés. (Notez également que le système d'exploitation peut les recréer à tout moment.)
Diti
1
cette réponse BASCULÉE !!! putain de merde, ces nouvelles ACL sont un PITA ÉNORME.
Dean Hiller
3

J'ai eu ce problème lorsqu'un ensemble de programmes s'exécutait dans un répertoire que j'essayais de supprimer. Afin de déplacer le répertoire, j'ai dû d'abord tuer tous les programmes en cours d'exécution à partir de ce répertoire.

Dans les commandes suivantes, soyez très prudent sur la façon dont vous sélectionnez le nom de votre programme. J'ai utilisé les commandes suivantes, pour référence:

ps aux | grep -i [NAME_OF_ANNOYING_PROGRAM] | grep -v grep
# make sure that you are only about to kill the programs you want to kill

ps aux | grep -i [NAME_OF_ANNOYING_PROGRAM] | grep -v grep | awk '{print $2}' | sudo xargs kill -9
sudo mv /usr/local/[DIR_FOR_ANNOYING_PROGRAM] /usr/local/[DIR_FOR_ANNOYING_PROGRAM]2

La procédure générale est la suivante:

  1. tuer tous les programmes en cours d'exécution à partir du répertoire en question
  2. tenter de renommer le répertoire
  3. si cela échoue, forcez à tuer ( kill -9avec beaucoup de prudence ) tous les programmes du répertoire
  4. tenter de renommer le répertoire
  5. si cela échoue, voyez si le programme est en cours d'exécution à nouveau, c'est-à-dire qu'il a été redémarré par un programme démon exécuté à partir d'un répertoire différent
  6. forcer à tuer le programme démon qui redémarre le programme ennuyeux
  7. forcer à tuer le programme ennuyeux
  8. renommer le répertoire
  9. profit
WattsInABox
la source
1
Je ne pense pas que l'OP ait probablement des programmes exécutés à partir du répertoire ~ / Music. Quoi qu'il en soit, il a dit qu'il ne voulait pas utiliser sudo, ce que fait cette réponse.
spin
Tout ce que je dis, c'est que j'ai eu cette situation. Pourrait être utile à quelqu'un même si cela n'a pas aidé le PO.
WattsInABox
C'est peut-être utile pour quelqu'un, certainement - c'est pourquoi je n'ai pas voté contre. Mais je pense que l'intention de StackExchange est que les réponses publiées répondent réellement à la question qui a été posée.
spin
1
Un autre problème potentiel, si vous voulez que cette réponse soit d'une utilité générale pour un novice: vous ne donnez aucun avertissement concernant le choix très soigneux de vos termes de recherche dans le premier grepet la vérification. Tout ce que vous y mettrez en premier grepchoisira parmi le pool de tous les programmes en cours d'exécution et killavec des privilèges root ...
spinup
1
Bien, @Watts, je pense que c'est une grande amélioration
spin
0

Cela peut également se produire lorsque l'un des fichiers à l'intérieur est protégé en écriture. J'ai eu le cas de bord aujourd'hui quand access.logétait protégé en écriture pour Apache, qui était déjà arrêté. Je viens de supprimer ce fichier, donc j'ai pu déplacer le répertoire parent.

vintproykt
la source