Jak rekurencyjnie usuwać uprawnienia do wykonywania plików bez dotykania folderów?

40

Zrobiłem kopię zapasową na dysku NTFS i ta kopia naprawdę okazała się konieczna. Jednak dysk NTFS pomylił uprawnienia. Chciałbym przywrócić je do normalnego trybu bez ręcznego naprawiania każdego pliku.

Jednym z problemów jest to, że nagle wszystkie moje uzyskane pliki tekstowe wykonują uprawnienia, co jest błędem ofc. Więc próbowałem:

sudo chmod -R a-x folder\ with\ restored\ backup/

Ale jest to błędne, ponieważ usuwa również xzezwolenie z katalogów, co czyni je nieczytelnymi.

Jakie jest prawidłowe polecenie w tym przypadku?

gaazkam
źródło
1
Meta: Nigdy nie zrozumiałem, dlaczego systemy uniksowe dodają bit wykonania do plików montowanych z systemów plików DOS lub Windows. To nie jest tak, że ktokolwiek kiedykolwiek wykona te pliki. Generalnie dodam „noexec” do moich opcji montowania tam, gdzie jest to praktyczne.
Edward Falk,

Odpowiedzi:

68
chmod -R -x+X *

W -xusuwa wykonać uprawnienia dla wszystkich
The +Xdoda wykonać uprawnienia dla wszystkich, ale tylko dla katalogów.

Jak Gibb
źródło
2
Polecenie, którego ostatecznie użyłem, aby przywrócić uprawnienia do normalnego: `chmod -R a-x + X, u-x + rwX, go-wx + rX katalog /
nazwa`
3
Zobacz także odpowiedź Edwarda na temat wyjątku dla BSD
fikr4n
4
To nie spełnia wymogu „bez dotykania folderów”. Co się stanie, jeśli wykonanie (być może dla świata) zostanie celowo usunięte w niektórych katalogach? Nie powinieneś go dodawać.
Ben Voigt,
4
to nie działało na Macu. Przesunięcie flagi -R na początek sprawi, że będzie to działać zarówno w terminalach Linux i Mac. chmod -R -x+x *
JoeMoe1984
2
Właściwie w prawidłowej kolejności działa na OSX, ale tak naprawdę nie ma pożądanego efektu. Musisz to zrobić jako dwa osobne kroki:chmod -R -x * && chmod -R +X *
Timmmm,
14

Ok, ponownie przeczytałem strony podręcznika "chmod" dla Mac OS X, BSD i Linux i przeprowadziłem kilka eksperymentów. Oto, czego dowiedziałem się o trybach symbolicznych. Może się skomplikować, ale warto to zrozumieć:

  • Ogólna forma to klauzula [, klauzula …] gdzie:
  • klauzula : = [ugoa] [+ - =] [rwxXstugo]
  • [ugoa] ( kto ) (określ wiele) oznacza ustawienie uprawnień dla użytkownika, grupy, innych lub wszystkich. Jeśli nie zostanie określony, domyślnie jest to „a”, ale działa umask .
  • [+ - =] ( akcja ) (określ jedną) oznacza:
    • + oznacza dodanie określonych uprawnień do już obowiązujących uprawnień
    • - oznacza usunięcie określonych uprawnień z już obowiązujących uprawnień
    • = oznacza ustawić uprawnienia na określone uprawnienia, usuwając wszystkie pozostałe
  • [rwxXstugo] ( pozwolenie ) (określ wielokrotność rwxXst LUB jeden z ugo) ustawia uprawnienia dla określonego użytkownika (użytkowników) w następujący sposób:
    • r - przeczytaj
    • w - pisz
    • x - uruchom / wyszukaj
    • X - uruchom / przeszukaj katalog iff LUB dowolny bit wykonania został już ustawiony.
    • s - suid lub sgid
    • t - lepki
    • u - skopiuj uprawnienia użytkownika
    • g - kopiowanie uprawnień grupy
    • o - skopiuj inne pozwolenie

Na przykład a+xsprawiłby , że plik byłby wykonywalny przez wszystkich. a+Xsprawiłby, że plik byłby wykonywalny przez wszystkich, JEŚLI byłby on wykonywalny przez kogokolwiek.

a+xsprawiłoby, że każdy mógł przeszukiwać katalog. a+Xsprawiłoby, że każdy mógłby przeszukiwać katalog.

Kluczowa różnica między BSD a Linuksem polega na tym, że w przypadku BSD określanie odbywa się na podstawie uprawnień do pliku przed wykonaniem chmod. W Linuksie ustalenie jest dokonywane bezpośrednio przed wykonaniem klauzuli + X.

Tak więc w przypadku BSD kombinacja a-x,a+Xusunęłaby uprawnienia do wykonywania / wyszukiwania, a następnie spowodowałaby, że każdy mógł przeszukiwać katalog, a plik mógł być wykonywany przez wszystkich, jeśli pierwotnie byłby wykonywalny przez kogokolwiek.

W systemie Linux a-x,a+Xusuwałby uprawnienia do wykonywania / wyszukiwania, a następnie umożliwiałoby przeszukiwanie katalogu przez wszystkich, pozostawiając plik wykonywalny przez nikogo.


Oto konkretny przykład: na komputerze BSD: katalog, plik wykonywalny i plik niewykonywalny:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Zauważ, że zarówno katalog, jak i „plik” są wykonywane przez użytkownika, ale nie przez innych.

Teraz wykonujemy chmod a-x,a+X *. Pierwsza klauzula usunie bit wykonywania / wyszukiwania od wszystkich użytkowników dla wszystkich plików, ale druga klauzula doda go z powrotem zarówno dla „opłaty”, jak i „fie”. „opłata”, ponieważ jest to katalog, i „fie”, ponieważ miał przynajmniej jeden bit wykonywalny na początek.

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Wykonałem ten sam wynik chmod -x+X.

Wniosek: Rozwiązanie Jak Gibb będzie działało na Linuksie, ale w przypadku BSD należy wykonać dwa przejścia.

Nie testowałem tego na SVr4 ani innych wariantach Uniksa.

Edward Falk
źródło
Niezła lektura. Dzięki za przeprowadzenie badań w tym zakresie.
Jak Gibb
10

Jednym ze sposobów na to:

find backup -type f -exec chmod 0644 {} +
Satō Katsura
źródło
6
Może to zakończyć dodawanie lub usuwanie uprawnień, których nie chcesz zmieniać. Lepszy w użyciuchmod a-x {}
Edward Falk,
1
@EdwardFalk chmod a-x {}może również spowodować usunięcie uprawnień, których nie chcesz zmieniać, i może pozostawić pliki do zapisu na całym świecie. Chodzi o to, że 0644 jest „ogólnie rozsądnym” kompromisem. OP powinien oczywiście również zaangażować mózg przed zastosowaniem rozwiązań z Internetu na swoim komputerze.
Satō Katsura,
4
„ax” usuwa uprawnienia do wykonywania dla użytkownika, grupy, innych i pozostawia inne uprawnienia bez zmian, o ile mi wiadomo. Czy mam to źle?
Edward Falk,
1
@EdwardFalk Nie, masz rację. Ale nie wiesz, czym tak naprawdę jest zestaw plików, a także nie wiesz, jakie chmodsą wcześniej uprawnienia . Jeśli pliki kopii zapasowej zawierają skrypty i pliki binarne, ich usunięcie xjest nieprawidłowe. Jeśli wcześniejsze uprawnienia chmodto 0777, to chmod a-xnadal pozostawi im 0666, co prawdopodobnie nie jest tym, czego chcesz. Mówię tylko, że jest chmod 0644to lepsza heurystyka, a nie chmod a-xto, że jest zła.
Satō Katsura,
1
@NajibIdrissi Z wyjątkiem sytuacji, gdy wiesz, że zmieniono je na 0777 po skopiowaniu ich do obcego systemu plików, który nie ma uprawnień UNIX. Właśnie to zrobił OP.
Satō Katsura,
6
 find backup ! -type l ! -type d -exec chmod a-x {} +

Usunąłbym uprawnienia do wykonywania plików, które nie są w katalogu typu (zgodnie z twoją prośbą) ani dowiązaniem symbolicznym (dowiązania symboliczne są zwykle zawsze rwxrwxrwx i chmodwpłynęłyby na cel dowiązania symbolicznego na nich).

Uwaga:

 find backup -type f -exec chmod a-x {} +

zmieniłoby tylko uprawnienia do zwykłych plików. Wykluczałoby to katalogi i dowiązania symboliczne , ale także urządzenia , nazwane potoki , gniazda i ewentualnie inne w zależności od systemu (chociaż w przypadku OP w przypadku kopii zapasowej systemu plików NTFS, raczej nie byłoby ich).

Stéphane Chazelas
źródło
2

W zsh użyj kwalifikatora globu, . aby dopasować tylko zwykłe pliki (nie zawierające dowiązań symbolicznych) i Ddopasować pliki kropek:

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

Jeśli linia poleceń jest zbyt długa, możesz użyć zargs:

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
Gilles „SO- przestań być zły”
źródło