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+x
sprawiłby , że plik byłby wykonywalny przez wszystkich. a+X
sprawiłby, że plik byłby wykonywalny przez wszystkich, JEŚLI byłby on wykonywalny przez kogokolwiek.
a+x
sprawiłoby, że każdy mógł przeszukiwać katalog. a+X
sprawił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+X
usunęł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+X
usuwał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.