Zezwól na wykonywanie katalogów, ale nie plików

6

Mam strukturę katalogów z plikami i katalogami i lubię przypisywać uprawnienia, więc wszystkie pliki i katalogi mają uprawnienia do odczytu i zapisu dla użytkownika oraz uprawnienia do odczytu dla grupy, a także uprawnienia do wykonywania katalogu.

Chciałbym osiągnąć coś takiego:

$ ls -l
total 16
-rw-r----- 1 daniel daniel    0  5 23 16:20 1
-rw-r----- 1 daniel daniel    0  5 23 16:20 2
-rw-r----- 1 daniel daniel    0  5 23 16:20 3
-rw-r----- 1 daniel daniel    0  5 23 16:20 4
-rw-r----- 1 daniel daniel    0  5 23 16:20 5
drwxr-x--- 2 daniel daniel 4096  5 23 16:00 a
drwxr-x--- 2 daniel daniel 4096  5 23 16:00 b
drwxr-x--- 2 daniel daniel 4096  5 23 15:59 c
drwxr-x--- 2 daniel daniel 4096  5 23 15:59 d
Daniel
źródło

Odpowiedzi:

10

Aby zezwolić na wykonywanie (wyszukiwanie) katalogów, ale nie plików, użyj:

chmod -R +X .

Aby przypisać wszystkie uprawnienia, tak jak w przykładzie, użyj:

chmod -R u=rwX,g=rX,o= .

-Rzmienia rekursywnie pliki i katalogi, a +Xzestawy wykonują / wyszukują tylko wtedy, gdy plik jest katalogiem lub ma już uprawnienia do wykonywania dla niektórych użytkowników. ri woczywiście są odpowiednio do czytania i pisania.

Tryb X( górny x ) jest udokumentowany zarówno w tradycyjnej stronie podręcznika ( man 1 chmod), jak i w dokumentacji informacyjnej z coreutils ( info coreutils, węzłowa warunkowa wykonywalność ). Działa również na BSD i wydaje się być standardem POSIX.

Cristian Ciupitu
źródło
Tak, racja, nigdy nie mogłem się dostosować do faktu, że obecnie wiele poleceń (cp, chmod ...) ma flagę -R ... Pewnego razu znalezisko było jedynym instrumentem, aby to zrobić rekurencyjnie.
MariusMatutiae
2

Jeśli chcesz to zrobić rekurencyjnie, tj. Do katalogów w katalogach w katalogach, użyj polecenia:

 find /path/to/starting/directory -type d -exec chmod +x {} \;

To lokalizuje wszystkie i tylko podkatalogi ( -type d flag) katalogu / ścieżka / do / start / katalogu, a następnie dokonuje wymaganej zmiany uprawnień do wykonania dla każdego z nich. Przestrzeń przed \; jest obowiązkowe.

MariusMatutiae
źródło
0

Czy próbowałeś czegoś takiego:

chmod +x $(ls -p | grep /), dodaje to uprawnienie do wykonywania tylko katalogów

a jeśli chcesz zezwolić na wykonanie plików i katalogów, po prostu wykonaj:

chmod +x * i aby usunąć uprawnienia do wykonywania plików, spróbuj czegoś takiego:

chmod -x *.*

Mam nadzieję, że to pomoże

BigFoot
źródło
Jeśli używasz Bash, */można go również użyć do dopasowania katalogów.
Cristian Ciupitu
1
Proszę nie polecam analizowanials . Nie powiedzie się to nawet w najprostszych przypadkach, w których nazwy katalogów zawierają spacje.
terdon
@terdon, istnieje również Dlaczego nie analizować ls?
Cristian Ciupitu
@CristianCiupitu tak, wiem. Mój jest tam trzecią najbardziej pozytywną odpowiedzią :).
terdon
Okej, przepraszam i dziękuję za radę :)
BigFoot
0

Spróbuj tego:

find . -mindepth 1  -print0 | while IFS= read -r -d '' file; do
    if [ -d "$file" ]; then chmod 750 "$file";
    else chmod 640 "$file"; fi
done

Wyjaśnienie

  • -mindepth 1: To takie findprzyzwyczajenie pasuje do bieżącego katalogu ..
  • -print0: drukuje dane wyjściowe rozdzielone wartością zerową. To gwarantuje, że mamy do czynienia z plikami fi z nowymi liniami.
  • while IFS=: ustawienie IFSpustego ciągu powoduje wyłączenie podziału słów. Niezbędny w przypadku nazw plików / katalogów z białymi znakami.
  • read -r -d '': wczytuje każdy wiersz do, $fileale -rzapewnia, że ​​nie traktujemy \specjalnie (w przypadku, gdy niektóre są w twoich nazwach plików) i -d ''ustawia separator na ciąg zerowy, abyśmy findpoprawnie przeanalizowali dane wyjściowe i mogli poradzić sobie z nazwami plików zawierających nowe wiersze.
  • if [ -d "$file" ]; then chmod 750 "$file";: Jeśli $filejest to katalog ( [ -d "$file" ], ustaw jego uprawnienia na drwxr-x---.
  • else chmod 640 "$file"; fi: jeśli nie jest to katalog, ustaw je na -rw-r-----.
terdon
źródło
0
chmod -R u=rwX,g=rX,o= .

Wielkie litery Xoznaczają, że jest ustawiony tylko wtedy, gdy jest już ustawiony gdzie indziej. Ponieważ wszystkie katalogi są już wykonywalne dla użytkownika, będą one również dostępne dla grup. Ponieważ pliki nie są wykonywalne dla użytkownika, nie zostaną one również wykonane dla grup.

Korzystanie chmod +Xbędzie miało w przybliżeniu ten sam efekt, z tym wyjątkiem, że gdy daje uprawnienia do wykonywania, daje uprawnienia do wykonywania użytkownikowi, grupie i innym.

jornane
źródło
0

Dziękuję za odpowiedzi. Odkryłem, że aby przypisać uprawnienia do wykonywania tylko do katalogów, konieczne jest użycie Xpozwolenia na kapitał .

Polecenie wyglądałoby zatem następująco:

chmod -R a-rwx,u=rwX,g=rX .

http://www.manpagez.com/man/1/chmod/

(Znalezienie tego zajęło mi trochę czasu, więc chciałem się tym wszystkim podzielić. Teraz myślę, że to pytanie zostanie zaindeksowane w Google dla następnej osoby, która chce się dowiedzieć)

Daniel
źródło