I przypadkowo chmod -R + x w katalogu. Jak przywrócić prawidłowe uprawnienia?

20

Mówiąc konkretnie, tak było chmod -R 755. Teraz każdy plik jest wykonywalny, czego nie chcę. Myślę, że powinienem spojrzeć na pierwsze dwa bajty każdego pliku #!, ale czy to obejmie wszystko? Czy zamiast tego filepowinienem spojrzeć na wszystko i na tym oprzeć swoją decyzję? Lub, co bardziej prawdopodobne, jest jeszcze lepszy sposób na zrobienie tego?

Jaki jest preferowany sposób rekurencyjnego przechodzenia przez katalog i ustawiania -x na plikach, które nie powinny być wykonywalne?

Larry Wang
źródło
Czy zrobiłeś to w /innym katalogu?
gvkv
1
@gvkv: Nie /, katalog w całości należący do mnie.
Larry Wang
1
@ Larry w przyszłości powinieneś prawdopodobnie użyć jakiegoś wariantu + x zamiast zgwałcić wszystkie uprawnienia i być może powodować zapisywanie wszystkich plików.
ksenoterrakid
@xenoterracide: Uzgodniony. To, czego naprawdę chciałem, to dać grupie takie same uprawnienia jak ja (co się ostatecznie zdarzyło!), Po prostu nie napisałem wystarczająco dużo myślenia.
Larry Wang
Ile plików mówimy? Ile powinno być wykonywalnych? Czy jest jakiś sposób na odróżnienie od nazw plików?
David Thornley,

Odpowiedzi:

15

Tu nie ma magicznej kuli. Uprawnienia zawierają informacje, które nie zawsze są zbędne.

Jeśli zrobiłbyś to w katalogu systemowym, twój system byłby w bardzo złym stanie, ponieważ musiałbyś się martwić o bity setuid i setgid oraz o pliki, które nie powinny być czytelne dla całego świata, oraz o pliki które mają być zapisywane w grupie lub w świecie.

W katalogu dla poszczególnych użytkowników musisz się martwić o pliki, które nie powinny być czytelne w świecie. Nikt ci tam nie pomoże.

Jeśli chodzi o wykonywalność, dobrą zasadą byłoby, aby wszystko, co nie wygląda na to, że mogłoby być wykonane, było niewykonalne. Jądro może wykonywać skrypty, których pierwsze dwa bajty są #!, binaria ELF których pierwsze cztery bajty są \x7fELFgdzie \x7fjest bajt o wartości 12, a kilka typów plików rzadsze (a.out, cokolwiek zarejestrowanych binfmt_misc). Dlatego następujące polecenie powinno przywrócić twoje uprawnienia do rozsądnego stanu (zakłada bash 4 lub zsh, w przeciwnym razie użyj finddo przejścia przez drzewo katalogów; ostrzeżenie wpisane bezpośrednio w przeglądarce):

for x in **/*; do
  if ! [ -f "$x" ]; then continue; fi # skip all but regular files
  case $(head -c 4 "$x") in
    "#!"??) :;; # skip script
    "\x7fELF") :;; # skip ELF executable
    *) chmod a-x "$x";;
  esac
done

Należy pamiętać, że istnieje prosty sposób tworzenia kopii zapasowych i przywracania uprawnień drzewa katalogów, w systemie Linux i ewentualnie innych unikach z obsługą ACL:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions
Gilles „SO- przestań być zły”
źródło
Dzięki! Na szczęście myślę, że wszystko należy do tych dwóch kategorii. Jeśli coś pominie, mogę sobie z tym poradzić później.
Larry Wang
Pamiętaj, że to **/*wymaga globstar.
Chris Down,
Poleciłbym dwie zmiany w tym skrypcie. Po pierwsze, użyj findraczej niż globstar; dwa, zamiast patrzeć na głowę, użyj filepolecenia, aby zobaczyć, co to jest, i stamtąd się rozgałęzi.
Shadur,
@Shadur findjest mniej niezawodny niż globstar, globstarjest preferowany w prawie każdym przypadku.
Chris Down
1
@Gilles Najlepiej jak w „jeśli masz, jest o wiele lepszy”, jest nie tylko szybszy, ale także bardziej niezawodny (i nie ma nieoczekiwanych SNAFU).
Chris Down
6

Wierzę, że będziesz chciał czegoś takiego

find dir -type f -exec chmod ugo-x '{}' +

Wyszukuje wszystkie zwykłe pliki, rekurencyjnie w katalogu (wyklucza katalogi i urządzenia) i usuwa bit wykonywalny.

Chciałbym zacząć tutaj, a następnie pracować nad stworzeniem plików, które powinny być wykonywalne.

Poniższe powinno działać dokładnie tak, jak prosiłeś (znajdzie wszystkie zwykłe pliki, grep je dla #!, A następnie usuń bity x, jeśli nie zostaną znalezione)

find . -type f | xargs grep -L #! | xargs chmod ugo-x

prawdopodobnie lepsza wersja powyższego (mniej rur)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 
ksenoterracid
źródło
3
Zrób to grep -L '^#!'przynajmniej (cudzysłowy są konieczne i ^ograniczają się do dopasowania na początku wiersza), ale nadal jest zbyt liberalne, ponieważ pasuje #!do dowolnej linii. Użycie xargszakończy się niepowodzeniem w przypadku nazw plików zawierających spacje lub znaki cudzysłowu; use xargs -d '\n'(wymaga GNU xargs).
Gilles „SO- przestań być zły”
0

Cóż, bez linii shebang plik zostanie wykonany jako skrypt powłoki, nominalnie za pomocą /bin/sh. Twój pomysł to dobry początek i przy założeniu, że dany katalog nie zawiera plików o znaczeniu krytycznym, prawdopodobnie nie ma dużego ryzyka wykonania niektórych grepi chmodkombinacji. Możesz napotkać fałszywe alarmy, tj. Pliki z linią shebang, które nie mają mieć ustawionego bitu wykonywalnego, ale nie znając więcej informacji na temat tego, co znajduje się w katalogu, tylko Ty możesz zdecydować, czy stanowi to znaczące zagrożenie egzystencjalne dla twojego system i / lub dane.

gvkv
źródło
Nie przejmuję się tak bardzo fałszywymi pozytywami, jak fałszywymi negatywami. Są binaria, od których nie sądzę #!.
Larry Wang