it-swarm.com.de

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

Beim Versuch, den Ordner Music über mv zu verschieben, wird mir die Berechtigung verweigert, obwohl 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

12
Timo

Beachten Sie, dass im Ordner a, wenn Sie b nach c verschieben, die Ordnerberechtigungen von a bestimmen, was Sie tun können.

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

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

  • Verwenden xattr -h, um die komplexen Berechtigungen für das @ -Symbol zu bestimmen.
  • Verwenden Sie getfacl, um die ACL für das Symbol + zu bestimmen.
20
Konerak

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.

15
Chris Anderson

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 funktioniert es.

9
Timo

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 unter ls -l Aufgeführt werden. 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 delete Für das Musikverzeichnis sehen. Wie Sie bemerkt haben, können Sie das Problem mit Sudo überschreiben. Wenn Sie dies nicht möchten (oder nicht können), haben Sie andere Möglichkeiten, 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

Verwenden Sie erneut /bin/ls -le, Um zu bestätigen, dass die ACL Ihren Wünschen entspricht. Weitere Informationen finden Sie in den ACL-Beispielen in man chmod. 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 Namenstyp 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 deny -Regel vor einer expliziten allow -Regel angewendet. Solange der Eintrag group:everyone deny delete Vorhanden ist, kann Ihrem Benutzer keine Berechtigung zum Löschen mit einer allow -Regel erteilt werden. Dies liegt daran, dass der Gruppe everyone, zu der Sie gehören, die Berechtigung verweigert wird und diese Regel zuerst angewendet wird.

4
spinup

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 darüber, 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, erzwinge das Töten (kill -9 mit viel Vorsicht ) alle 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. 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
  8. verzeichnis umbenennen
  9. profitieren
3
WattsInABox

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

0
vintproykt