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?


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

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 

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.


Nie przejmuję się tak bardzo fałszywymi pozytywami, jak fałszywymi negatywami. Są binaria, od których nie sądzę #!.
— Larry Wang
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.