Dlaczego dostaję odmowę dostępu podczas korzystania z mv, mimo że prawa do katalogu są prawidłowe?

14

I dostać pozwolenie odrzucone podczas próby przenieść folderu Musicpoprzez mvchoć właściciel katalogu jest ustawiona na moich uprawnieniach użytkowników i użytkowników są ustawione do 7. Co się dzieje?

(Wiem, że mógłbym użyć sudo, ale chcę dowiedzieć się, co jest nie tak. Coś tu pachnie podejrzanie). Ps: Jestem na Mac OS X El Capitan.

Zrzut ekranu terminalu

Timo
źródło
1
Każdy, kto natknie się na ten sam błąd, być może dlatego, że próbujesz zapisać plik, który jest otwarty. Nie jest to jednak przypadek OP, mówiąc tylko, że może to pomóc.
aderchox

Odpowiedzi:

21

Zwróć uwagę, że aprzechodząc bdo folderu , przechodząc do c, uprawnienia do folderu aokreślają, co możesz zrobić.

W tym przypadku .najważniejsze będą uprawnienia .

Zauważ, że uprawnienia są bardziej złożone niż po prostu rwx. Twój musicfolder ma @na końcu, .folder ma +na końcu.

  • Służy xattr -hdo określania złożonych uprawnień dla symbolu @.
  • Służy getfacldo określania listy ACL dla symbolu +.
Konerak
źródło
Czy masz zasób obejmujący „złożone uprawnienia”, jak je nazywasz?
user1717828,
man xattrmoże być dobrym punktem wyjścia.
Konerak,
1
nie, brak ręcznego wprowadzania. Udało mi się znaleźć w Google inną nazwę: rozszerzone atrybuty , jeśli ktokolwiek chce dowiedzieć się więcej.
user1717828,
4
Lub użyj ls -la@e. Najprawdopodobniej były tam deny deletelisty ACL, które również zapobiegają zmianie nazwy.
Stéphane Chazelas
1
@ Timo, te listy ACL zapobiegają usuwaniu lub zmianie nazw tych katalogów. Przypuszczalnie zostały tam umieszczone z jakiegoś powodu, tak jak niektóre aplikacje polegają na tym, że tam są i inaczej by się nie udały.
Stéphane Chazelas,
19

Korzystałem z podsystemu Windows dla systemu Linux. Miałem otwarty katalog w innej instancji bash. Zamknięcie go pozwoli mi przenieść katalog.

Chris Anderson
źródło
4
W VS Code ze zdalnym na WSL musiałem zamknąć edytor i otworzyć terminal WSL poza tym projektem VS Code.
Bjorn,
9

Wydaje się, jakby gdzieś głęboko w tym katalogu znajdował się co najmniej 1 plik, który nie miał odpowiednich uprawnień.

Więc to, co zrobiłem, to:

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

Teraz działa.

Timo
źródło
17
Niezależnie od problemu, udzielanie uprawnień do wykonywania plików muzycznych nie powinno być rozwiązaniem.
Stéphane Chazelas
3
I wydaje się mało prawdopodobne, aby obiekt w katalogu mógł zakłócać twoją zdolność do zmiany nazwy tego katalogu.
Scott,
Wiem, że to dziwne, ale to załatwiło sprawę. Używanie chmod i chown w samym katalogu nie miało żadnego efektu.
Timo,
czy możliwe jest chmod 755usunięcie specjalnych uprawnień „@” w folderze Muzyka?
HorusKol,
@HorusKol lub chown. Objawy OP pasowałyby do katalogów, w których odmowa usuwania list ACL, ale przynajmniej w Yosemite, wykonanie chown lub chmod 755 nie usuwa tej listy ACL. Potrzebujesz chmod -a 'everyone deny delete' Musictego. W El Capitan może być inaczej.
Stéphane Chazelas,
4

Problem tutaj prawdopodobnie dotyczy listy kontroli dostępu (ACL) folderu Music. ACL to oddzielny system uprawnień niż zwykłe systemy POSIX, które zwykle są wymienione przez ls -l. Niektóre inne katalogi w folderze domowym i gdzie indziej również zawierają listy ACL.

Aby zobaczyć listy ACL w katalogu domowym, użyj:

/bin/ls -le ~

Prawdopodobnie zobaczysz regułę podobną 0: group:everyone deny deletedo katalogu Muzyka. Jak zauważyłeś, możesz zastąpić problem z sudo. Jeśli nie chcesz tego robić (lub nie możesz), masz inne opcje, biorąc pod uwagę, że jesteś właścicielem pliku. Możesz usunąć obraźliwy wpis z listy ACL katalogu Music na podstawie jego indeksu (0 w podanym powyżej przykładzie):

/bin/chmod -a# 0 Music

Lub możesz usunąć wszystkie wpisy z listy ACL:

/bin/chmod -N Music

Teraz możesz przenosić katalog (z zastrzeżeniem zwykłych uprawnień POSIX). Jeśli chcesz przywrócić listę ACL po przeniesieniu, możesz użyć:

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

I użyj /bin/ls -leponownie, aby potwierdzić, że lista ACL jest taka, jak chcesz. Sprawdź przykłady ACL w, man chmodaby uzyskać więcej informacji. W szczególności to wprowadzenie jest pomocne:

Każdy plik ma jedną listę ACL, zawierającą uporządkowaną listę wpisów. Każdy wpis odnosi się do użytkownika lub grupy i przyznaje lub odrzuca zestaw uprawnień. W przypadkach, gdy użytkownik i grupa istnieją o tej samej nazwie, nazwa użytkownika / grupy może być poprzedzona przedrostkiem „użytkownik:” lub „grupa:” w celu określenia rodzaju nazwy.

Zamówienie ACL

Nie sądzę, że strona podręcznika wyjaśnia zasady dotyczące zamawiania, ale ta strona wyjaśnia zasady porządkowania list ACL. W szczególności wyraźna denyreguła zostanie zastosowana przed wyraźną allowregułą. Tak długo, jak group:everyone deny deletewpis jest na swoim miejscu, nie można dać użytkownikowi pozwolenia na usunięcie za pomocą allowreguły. Wynika to z tego everyone, że grupie odmawia się pozwolenia , które obejmuje ciebie, i ta reguła zostanie zastosowana jako pierwsza.

zakręcić
źródło
2
Nie wiem, dlaczego to zostało odrzucone. everyone deny deleteWpis ACL na domyślnych katalogów domowych MacOS”jest rzeczywisty powód katalogi mogą być ani przeniesiony, ani usunięta. (Należy również pamiętać, że system operacyjny może je ponownie utworzyć w dowolnym momencie.)
Diti
1
ta odpowiedź ROCKED !!! cholera, te nowe listy ACL to OGROMNA PITA.
Dean Hiller,
3

Miałem ten problem, gdy zestaw programów działał w katalogu, który próbowałem usunąć. Aby przenieść katalog, musiałem najpierw zabić wszystkie działające programy z tego katalogu.

W poniższych poleceniach bardzo ostrożnie wybieraj nazwę swojego programu. W celach informacyjnych użyłem następujących poleceń:

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

Ogólna procedura to:

  1. zabij wszystkie programy działające w danym katalogu
  2. spróbuj zmienić nazwę katalogu
  3. jeśli to się nie powiedzie, wymuś zabicie ( kill -9z dużą ostrożnością ) wszystkich programów z katalogu
  4. spróbuj zmienić nazwę katalogu
  5. jeśli to się nie powiedzie, sprawdź, czy program działa ponownie, to znaczy, że został zrestartowany przez jakiś program demona działający z innego katalogu
  6. wymuszenie zabicia programu demona, który ponownie uruchamia denerwujący program
  7. zmusić do zabicia irytującego programu
  8. zmień nazwę katalogu
  9. zysk
WattsInABox
źródło
1
Nie sądzę, że OP prawdopodobnie ma jakieś programy uruchomione z katalogu ~ / Music. W każdym razie powiedział, że nie chce używać sudo, co robi ta odpowiedź.
spinup
Mówię tylko, że miałem taką sytuację. Może być komuś pomocny, nawet jeśli nie był pomocny dla PO.
WattsInABox
Z pewnością jest to pomocne dla kogoś, z pewnością - dlatego nie głosowałem. Ale myślę, że intencją StackExchange jest to, że opublikowane odpowiedzi faktycznie odpowiadają na zadane pytanie.
spinup
1
Kolejny potencjalny problem, jeśli masz na myśli, że ta odpowiedź ma ogólne zastosowanie dla początkującego: nie podajesz żadnych ostrzeżeń o bardzo ostrożnym wyborze wyszukiwanych słów grepi sprawdzeniu ich. Cokolwiek wprowadzisz do tego pierwszego grep, wybierze z puli wszystkich uruchomionych programów i killto z uprawnieniami roota ...
spinup
1
Fajnie, @Watts, myślę, że to duża poprawa
spinup
0

Może się tak również zdarzyć, gdy jeden z plików w środku jest chroniony przed zapisem. Miałem dzisiaj przypadek na krawędzi, kiedy access.logbył chroniony przed zapisem na Apache, który został już zatrzymany. Właśnie usunąłem ten plik, więc mogłem przenieść katalog nadrzędny.

vintproykt
źródło