Jak utworzyć katalog i nadać uprawnienia w jednym poleceniu

108

Jak utworzyć katalog i nadać uprawnienia w jednym poleceniu w systemie Linux?

Muszę utworzyć wiele folderów z pełnymi uprawnieniami 777.

Polecenia

mkdir path/foldername
chmod 777 path/foldername 

Nie lubię tworzyć i nadawać uprawnień w dwóch poleceniach. Czy mogę to zrobić jednym poleceniem?

poorani
źródło
1
mkdir temp; chmod 777 tempto jedna linia. Możesz uczynić „temp” zmienną i zapisać ją jako polecenie bash. Czy to jest to, czego szukasz?
styfle
1
cześć @ white-rose, zobacz najnowszą odpowiedź, powinna to być odpowiedź zaakceptowana. bonus, łączy mkdir, chmod i chown w jednej kuli!
Costin Gușă

Odpowiedzi:

205

Według strony podręcznika man mkdir ...

mkdir -m 777 dirname
Alex
źródło
1
Czy możesz mi powiedzieć o opcji -m?
poorani
Opcja @Whiterose -m dotyczy trybu. Ustawia bity uprawnień dla nowo utworzonych katalogów na wartość określoną przez zmienną Mode. Zmienna Mode przyjmuje te same wartości co parametr Mode dla polecenia chmod, w postaci symbolicznej lub numerycznej.
TMKasun
15
mkdir -p -m jest zepsute, ponieważ tryb jest stosowany tylko do ostatniego katalogu we wpisanej ścieżce. Na przykład mkdir -p -m 707 jeden / dwa / trzy. Nawet jeśli wszystkie trzy katalogi są nowo utworzone, tylko ostatni będzie miał wymagane uprawnienia, a pozostałe - domyślne. install -d -m działa w ten sam sposób.
Wyświetlana nazwa
Oprócz problemu związanego z -ptym @DisplayName, o którym już wspomniano, istnieje jeszcze jeden. -mBędzie miała zastosowanie tylko wtedy, gdy katalog jest faktycznie utworzony. Jeśli już istnieje, jego tryb nie zostanie zmieniony. W zależności od kontekstu może to być dobre lub złe.
Adam Badura
1
mkdir -m777 katalog
Hugo Deiró
19
install -d -m 0777 /your/dir

powinien dać ci to, czego chcesz. Należy pamiętać, że każdy użytkownik ma prawo do dodawania i usuwania plików w tym katalogu.

Markus W. Mahlberg
źródło
1
bonus, możesz także dodać -g i / lub -o i możesz mieć mkdir, chmod i chown w jednym ujęciu!
Costin Gușă,
4
Jest uszkodzony. install -d -m 070 jeden / dwa / trzy. Nawet jeśli wszystkie trzy katalogi w ścieżce są nowo utworzone, tylko ostatni będzie miał ustawione wymagane uprawnienia. mkdir -p -m działa w ten sam sposób.
Wyświetlana nazwa
@DisplayName: który mimo wszystko ustawia prawidłowe uprawnienia dla three, przy czym domyślne uprawnienia są wystarczające dla ścieżki do niego.
Markus W Mahlberg
17

Gdy katalog już istnieje:

mkdir -m 777 /path/to/your/dir

Jeśli katalog nie istnieje, a chcesz utworzyć katalogi nadrzędne:

mkdir -m 777 -p /parent/dirs/to/create/your/dir
Pedro Trujillo
źródło
To da tylko pozwolenie 777 do ostatniego podkatalogu. Jak mogę to zrobić i udzielić pozwolenia 777 również wszystkim katalogom nadrzędnym?
Levi Johansen,
2
Nie mam na to odpowiedzi, ale wydaje mi się, że odpowiedź jest tutaj: stackoverflow.com/questions/3740152/ ...
Pedro Trujillo
Zauważ, że to polecenie ma rozwiązać ten problem „Jak utworzyć katalog i nadać uprawnienia w jednym poleceniu”. Myślę, że rozwiązanie twojego pytania będzie takie jak:find /your/dirs -type d -exec chmod 755 {} \;
Pedro Trujillo
10

IMO, installw takich sytuacjach lepiej jest użyć polecenia. Próbowałem utrzymać systemd-journaldsię przy ponownym uruchomieniu.

install -d  -g systemd-journal -m 2755 -v /var/log/journal
Badi
źródło
7

Możesz napisać prosty skrypt powłoki, na przykład:

#!/bin/bash
mkdir "$1"
chmod 777 "$1"

Po zapisaniu i włączeniu flagi pliku wykonywalnego można go uruchomić zamiast mkdir i chmod:

./scriptname path/foldername

Jednak odpowiedź Alexa jest znacznie lepsza, ponieważ generuje jeden proces zamiast trzech. Nie wiedziałem o tej -mopcji.

Delan Azabani
źródło
Dzięki delan .. Napisałem też to polecenie w skrypcie powłoki .. Ale chcę to zrobić w jednym poleceniu.
poorani
7

Aby rozwinąć i poprawić niektóre z powyższych odpowiedzi:

Najpierw sprawdzę stronę podręcznika mkdir dla GNU Coreutils 8.26 - zawiera ona informacje o opcji '-m' i '-p' (można też podać odpowiednio --mode = TRYB i --parents ):

... ustaw tryb pliku [s] (jak w chmod), a nie a = rwx - umask

... bez błędu, jeśli istnieje, w razie potrzeby utwórz katalogi nadrzędne

Moim zdaniem stwierdzenia są niejasne i niejasne. Ale zasadniczo mówi, że możesz utworzyć katalog z uprawnieniami określonymi przez „chmod notację numeryczną” (ósemki) lub możesz przejść „w drugą stronę” i użyć / your umask.

Uwaga dodatkowa: mówię „w drugą stronę”, ponieważ wartość umask jest dokładnie tym, na co wygląda - maską , ukrywaniem / usuwaniem uprawnień, a nie ich „przyznawaniem”, jak w przypadku numerycznej notacji ósemkowej chmod.

Możesz wykonać polecenie wbudowane w powłokę, umaskaby zobaczyć, jaka jest twoja 3-cyfrowa umask; dla mnie to jest 022. Oznacza to, że kiedy wykonam mkdir yodirectoryw danym folderze (powiedzmy, mahome) i statto, otrzymam wyjście podobne do tego:

               755                   richard:richard         /mahome/yodirectory
 #          permissions                 user:group      what I just made (yodirectory),
 # (owner,group,others--in that order)                 where I made it (i.e. in mahome)
 # 

Teraz, aby dodać trochę więcej o tych ósemkowych uprawnieniach. Kiedy tworzysz katalog, "twój system" bierze domyślne uprawnienia katalogu "[co ma zastosowanie do nowych katalogów (jego wartość powinna 777)] i uderza w maskę yo (u), skutecznie ukrywając niektóre z tych uprawnień". Moja jest umask 022 - teraz jeśli my „odjąć” 022 z 777 (technicznie odjęcie jest oversimplication i nie zawsze poprawne - jesteśmy rzeczywiście wyłączenie trwałej ondulacji lub maskować je ing) ... mamy 755 jak stwierdzono (lub „stat” ) wcześniej.

Możemy pominąć `` 0 '' przed trzycyfrowymi ósemkami (więc nie muszą być czterocyfrowe), ponieważ w naszym przypadku nie chcieliśmy (a raczej nie wspomnieliśmy) o żadnych bitach stickybit, setuidach lub setgidach (możesz zajrzeć do tych, przy okazji, mogą być przydatne, ponieważ zamierzasz 777). Innymi słowy, 0777 implikuje (lub jest równoważne) 777 (ale 777 niekoniecznie jest równoważne 0777 - ponieważ 777 określa tylko uprawnienia, a nie setuids, setgids itp.)

Teraz, aby zastosować to do twojego pytania w szerszym znaczeniu - masz (już) kilka opcji. Wszystkie powyższe odpowiedzi działają (przynajmniej według moich coreutils). Ale możesz (lub prawdopodobnie napotkasz) problemy z powyższymi rozwiązaniami, gdy chcesz stworzyć podkatalogi (katalogi zagnieżdżone) z 777 uprawnieniami naraz. W szczególności, jeśli wykonam następujące czynności w mahome z umaską 022:

mkdir -m 777 -p yodirectory/yostuff/mastuffinyostuff
# OR (you can swap 777 for 0777 if you so desire, outcome will be the same)
install -d -m 777 -p yodirectory/yostuff/mastuffinyostuff

Otrzymam trwałą 755na oba yodirectoryi yostufftylko 777na mastuffinyostuff. Wygląda więc na to, że umaskto wszystko, co zostało uderzone yodirectoryi yostuff... aby to obejść, możemy użyć podpowłoki:

( umask 000 && mkdir -p yodirectory/yostuff/mastuffinyostuff )

i to wszystko. 777 perms dla yostuff, mastuffinyostuff i yodirectory.

YenForYang
źródło
7

możesz użyć następującego polecenia, aby utworzyć katalog i nadać uprawnienia w tym samym czasie

mkdir -m777 path/foldername 
Omer Gafar
źródło
1
nie ma spacji między -m a 777
Omer Gafar
1

Nie rób: mkdir -m 777 -p a/b/c ponieważ to ustawi uprawnienia tylko 777do ostatniego katalogu, c; a i b zostaną utworzone z domyślnymi uprawnieniami z Twojej umaski.

Zamiast tworzyć nowe katalogi z uprawnieniami 777, uruchom je mkdir -pw podpowłoce, w której nadpisujesz umask:

(umask u=rwx,g=rwx,o=rwx && mkdir -p a/b/c)

Zauważ, że nie zmieni to uprawnień, jeśli którekolwiek z a, b i c już istnieją.

John Mellor
źródło
Tak, jeśli zdasz 4-cyfrową umaskę, wiodąca cyfra zawsze musi wynosić zero (chociaż możesz ją pominąć). Może to być dla symetrii z chmod, gdzie pierwsza cyfra ósemkowa ustawia bity setuid, setgid i sticky, ale jeśli tak, jest to raczej bezcelowe, ponieważ umask nie pozwala na ich ograniczenie.
John Mellor