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 file
powinienem 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?
permissions
files
chmod
Larry Wang
źródło
źródło
/
innym katalogu?/
, katalog w całości należący do mnie.Odpowiedzi:
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ą\x7fELF
gdzie\x7f
jest bajt o wartości 12, a kilka typów plików rzadsze (a.out, cokolwiek zarejestrowanychbinfmt_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żyjfind
do przejścia przez drzewo katalogów; ostrzeżenie wpisane bezpośrednio w przeglądarce):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:
źródło
**/*
wymagaglobstar
.find
raczej niż globstar; dwa, zamiast patrzeć na głowę, użyjfile
polecenia, aby zobaczyć, co to jest, i stamtąd się rozgałęzi.find
jest mniej niezawodny niżglobstar
,globstar
jest preferowany w prawie każdym przypadku.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)
prawdopodobnie lepsza wersja powyższego (mniej rur)
źródło
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życiexargs
zakończy się niepowodzeniem w przypadku nazw plików zawierających spacje lub znaki cudzysłowu; usexargs -d '\n'
(wymaga GNUxargs
).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órychgrep
ichmod
kombinacji. 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.źródło
#!
.