Warum wird mir bei Verwendung von mv die Berechtigung verweigert, obwohl die Verzeichnisrechte korrekt sind?

12

Beim Versuch, einen Ordner Musicüber zu verschieben, wird mir die Berechtigung verweigert, mvobwohl der Verzeichnisbesitzer auf meinen Benutzer und die Benutzerberechtigungen auf 7 festgelegt sind. Was ist los?

(Ich weiß, dass ich Sudo verwenden könnte, aber ich möchte herausfinden, was los ist. Hier riecht etwas nach Fisch). Ps: Ich bin auf Mac OS X El Capitan.

Terminal-Screenshot

Timo
quelle
1
Wenn jemand auf denselben Fehler stößt, kann dies daran liegen, dass Sie versuchen, eine geöffnete Datei zu erstellen. Nicht der OP-Fall, nur zu sagen, dass es helfen könnte.
Aderchox

Antworten:

20

Zu beachten ist, dass, wenn in Ordnern a, bewegen bzu c, die Ordner - Berechtigungen von abestimmen , was Sie tun können.

In diesem Fall sind die Berechtigungen .für am wichtigsten.

Beachten Sie, dass die Berechtigungen komplexer sind als nur rwx. Ihr musicOrdner hat ein @am Ende, der .Ordner hat ein +am Ende.

  • Verwenden Sie xattr -hdiese Option , um die komplexen Berechtigungen für das @ -Symbol zu bestimmen.
  • Benutzen getfacl diese , um die ACL für das Symbol + zu bestimmen.
Konerak
quelle
Haben Sie eine Ressource, die "komplexe Berechtigungen" abdeckt, wie Sie sie nennen?
user1717828
man xattrkönnte ein guter Ausgangspunkt sein.
Konerak
1
Nein, keine manuelle Eingabe. Ich konnte bei Google nach einem anderen Namen suchen: erweiterte Attribute , wenn jemand mehr erfahren möchte.
user1717828
4
Oder verwenden ls -la@e. Höchstwahrscheinlich gab es hier deny deleteACLs, die auch das Umbenennen verhindern.
Stéphane Chazelas
1
@ Timo, diese ACLs verhindern das Löschen oder Umbenennen dieser Verzeichnisse. Vermutlich wurden sie aus einem bestimmten Grund dort abgelegt, da einige Anwendungen darauf angewiesen sind, dass sie vorhanden sind, und ansonsten fehlschlagen würden.
Stéphane Chazelas
15

Ich habe Windows Subsystem für Linux verwendet. Ich hatte das Verzeichnis in einer anderen Bash-Instanz geöffnet. Wenn ich es schließe, kann ich das Verzeichnis verschieben.

Chris Anderson
quelle
1
In VS Code mit Remote auf WSL musste ich den Editor schließen und ein Terminal für WSL außerhalb dieses VS Code-Projekts öffnen.
Björn
9

Es scheint, als ob sich irgendwo tief in diesem Verzeichnis mindestens eine Datei befand, die nicht über die richtigen Berechtigungen verfügte.

Also, was ich getan habe war:

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

Jetzt gehts.

Timo
quelle
17
Was auch immer das Problem war, es sollte nicht die Lösung sein, Musikdateien Ausführungsberechtigungen zu erteilen.
Stéphane Chazelas
3
Und es ist unwahrscheinlich, dass ein Objekt in einem Verzeichnis Ihre Fähigkeit beeinträchtigt, dieses Verzeichnis umzubenennen.
Scott
Ich weiß, dass es komisch ist, aber das hat den Trick getan. Die Verwendung von chmod und chown im Verzeichnis selbst hatte keine Auswirkung.
Timo
Ist es möglich, dass chmod 755die speziellen '@' Berechtigungen für den Musikordner entfernt wurden?
HorusKol
@HorusKol oder der Chown. Die Symptome des OP stimmen mit den Verzeichnissen überein , in denen ACLs zum Löschen verweigert wurden. Zumindest bei Yosemite wird diese ACL durch Ausführen eines Chowns oder Chmod 755 jedoch nicht gelöscht. Das würdest du brauchen chmod -a 'everyone deny delete' Music. In El Capitan könnte es anders sein.
Stéphane Chazelas
4

Das Problem hier hat wahrscheinlich mit der Zugriffssteuerungsliste (Access Control List, ACL) des Musikordners zu tun. Die ACL ist ein separates Berechtigungssystem zu den regulären POSIX-Berechtigungssystemen, die normalerweise von aufgelistet werden ls -l. Einige andere Verzeichnisse im Home-Ordner und anderswo haben ebenfalls ACLs.

Verwenden Sie Folgendes, um die ACLs im Home-Verzeichnis anzuzeigen:

/bin/ls -le ~

Sie werden wahrscheinlich eine Regel wie 0: group:everyone deny deletefür das Musikverzeichnis sehen. Wie Sie bemerkt haben, können Sie das Problem mit überschreiben sudo. Wenn Sie dies nicht möchten (oder nicht können), haben Sie andere Optionen, da Sie der Eigentümer der Datei sind. Sie können den fehlerhaften Eintrag basierend auf seinem Index aus der ACL des Musikverzeichnisses entfernen (0 in dem oben angegebenen Beispiel):

/bin/chmod -a# 0 Music

Oder Sie können alle Einträge in der ACL entfernen:

/bin/chmod -N Music

Jetzt können Sie das Verzeichnis verschieben (vorbehaltlich der regulären POSIX-Berechtigungen). Wenn Sie die ACL nach dem Verschieben zurücksetzen möchten, können Sie Folgendes verwenden:

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

Und verwenden Sie /bin/ls -leerneut, um zu bestätigen, dass die ACL Ihren Wünschen entspricht. man chmodWeitere Informationen finden Sie in den ACL-Beispielen . Insbesondere ist dieses Intro hilfreich:

Jede Datei verfügt über eine ACL, die eine geordnete Liste von Einträgen enthält. Jeder Eintrag bezieht sich auf einen Benutzer oder eine Gruppe und gewährt oder verweigert eine Reihe von Berechtigungen. In Fällen, in denen ein Benutzer und eine Gruppe mit demselben Namen vorhanden sind, kann dem Benutzer- / Gruppennamen "Benutzer:" oder "Gruppe:" vorangestellt werden, um den Typ des Namens anzugeben.

ACL-Reihenfolge

Ich glaube nicht, dass diese Manpage die Regeln für die Bestellung erklärt , aber diese Seite erklärt die Bestellregeln für ACLs klar. Insbesondere wird eine explizite denyRegel vor einer expliziten allowRegel angewendet . Solange der group:everyone deny deleteEintrag vorhanden ist, kann Ihrem Benutzer keine Berechtigung zum Löschen mit einer allowRegel erteilt werden . Dies liegt daran, dass der everyoneGruppe, zu der Sie gehören, die Berechtigung verweigert wird und diese Regel zuerst angewendet wird.

Spinup
quelle
2
Ich weiß nicht, warum dies abgelehnt wurde. Der everyone deny deleteACL-Eintrag in den Standardverzeichnissen von macOS ist der eigentliche Grund, warum die Verzeichnisse weder verschoben noch gelöscht werden können. (Beachten Sie auch, dass das Betriebssystem sie jederzeit neu erstellen kann.)
Diti
1
diese Antwort ROCKED !!! Heiliger Mist, diese neuen ACLs sind eine RIESIGE PITA.
Dean Hiller
3

Ich hatte dieses Problem, als eine Reihe von Programmen in einem Verzeichnis ausgeführt wurde, das ich entfernen wollte. Um das Verzeichnis zu verschieben, musste ich zuerst alle laufenden Programme aus diesem Verzeichnis beenden.

Seien Sie in den folgenden Befehlen sehr vorsichtig, wie Sie den Namen Ihres Programms auswählen. Ich habe die folgenden Befehle als Referenz verwendet:

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

Das allgemeine Verfahren ist:

  1. Beenden Sie alle Programme, die aus dem betreffenden Verzeichnis ausgeführt werden
  2. Versuchen Sie, das Verzeichnis umzubenennen
  3. Wenn dies fehlschlägt, erzwingen Sie das Beenden ( kill -9mit großer Vorsicht ) aller Programme aus dem Verzeichnis
  4. Versuchen Sie, das Verzeichnis umzubenennen
  5. Wenn dies fehlschlägt, prüfen Sie, ob das Programm erneut ausgeführt wird, dh, dass es von einem Daemon-Programm neu gestartet wurde, das aus einem anderen Verzeichnis ausgeführt wird
  6. Erzwinge das Beenden des Daemon-Programms, das das nervige Programm neu startet
  7. erzwinge das nervige Programm mit Gewalt
  8. Verzeichnis umbenennen
  9. profitieren
WattsInABox
quelle
1
Ich glaube nicht, dass im OP wahrscheinlich Programme aus dem Verzeichnis ~ / Music ausgeführt werden. Wie auch immer, er sagte, er möchte kein Sudo verwenden, was diese Antwort tut.
Spinup
Ich sage nur, dass ich diese Situation hatte. Könnte für jemanden hilfreich sein, obwohl es für das OP nicht hilfreich war.
WattsInABox
Es ist möglicherweise für jemanden hilfreich - deshalb habe ich nicht abgelehnt. Ich denke jedoch, dass StackExchange beabsichtigt, dass die veröffentlichten Antworten tatsächlich die gestellte Frage beantworten.
Spinup
1
Ein weiteres potenzielles Problem, wenn Sie möchten, dass diese Antwort für einen Anfänger von allgemeinem Nutzen ist: Sie geben keine Warnungen aus, wenn Sie Ihre Suchbegriffe im ersten grepSchritt sehr sorgfältig auswählen und überprüfen. Was auch immer Sie zuerst grepkill
eingeben,
1
Schön, @Watts, ich denke, das ist eine große Verbesserung
Spinup
0

Dies kann auch passieren, wenn eine der darin enthaltenen Dateien schreibgeschützt ist. Ich hatte heute den Randfall, als ich access.login Apache schreibgeschützt war, was bereits gestoppt wurde. Ich habe diese Datei gerade entfernt, sodass ich das übergeordnete Verzeichnis weiter verschieben konnte.

vintproykt
quelle