Co je "umask" a jak to funguje?

160

Věřím, že umask je něco, co řídí oprávnění k souborům , ale zcela nerozumíte.

Po spuštěníumask 0644 v terminálu , nemohu číst soubory, které jsem vytvořil, pomocí textového editoru příkazového řádku nano. Všiml jsem si, že oprávnění tohoto souboru jsou nastavena na0022 namísto výchozí0755.

Jak funguje umask? Myslel jsem, že bych mohl odstranit každou číslici v umasku z0777,7 - 6 = 1 a7 - 4 = 3, takže očekávám, že oprávnění budou0133, ale zdá se, že tomu tak není.

  1. Co je přesně umask? Vysvětlete mi to, jako bych byl "Linux noob"
  2. Jak vypočítám pomocí funkce umask?
  3. Co jsou případy použití pro umask?
dané Lekensteyn 22.05.2011 22:42

5 odpovědí

125

Umask působí jako soubor oprávnění, které aplikace nemohou nastavit na soubory. Je to maska ​​pro vytváření souborů pro procesy a nemůže být nastavena pro samotné adresáře. Většina aplikací by nevytvořila soubory s nastavenými oprávněními pro spouštění, takže by měly výchozí hodnotu666, která je pak změněna pomocí umasku.

Jakmile nastavíte umask pro odebrání bitů čtení a zápisu pro vlastníka a čtení bitů pro ostatní, výchozí hodnota jako777 v aplikacích by vedla k tomu, že oprávnění souboru budou133. To by znamenalo, že byste mohli (a jiní) spustit soubor a ostatní by mu mohli napsat.

Chcete-li, aby soubory nebyly čteny / zapisovány / spouštěny nikým jiným než vlastníkem, měli byste použít umask jako077 pro vypnutí těchto oprávnění pro skupinu & další.

Naproti tomu umask000 vytvoří nově vytvořené adresáře čitelné, zapisovatelné a sestupné pro všechny (oprávnění budou777). Takový umask je vysoce nejistý a nikdy byste neměli nastavit umask na000.

Výchozí umask na Ubuntu je022, což znamená, že nově vytvořené soubory jsou čitelné všemi, ale mohou být zapisovatelné pouze vlastníkem:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw-r--r-- 1 user user 0 Apr  1 19:15 new-file-name

Zobrazení a úprava umasku

Chcete-li zobrazit aktuální nastavení umasku, otevřete terminál a spusťte příkaz:

umask

Chcete-li změnit nastavení umask aktuálního shellu na něco jiného, ​​řekněme 077, spusťte:

umask 077

Chcete-li otestovat, zda toto nastavení funguje nebo ne, můžete vytvořit soubor nový (neovlivní se oprávnění souboru existujícího souboru) a zobrazovat informace o souboru:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw------- 1 user user 0 Apr  1 19:14 new-file-name

Nastavení umask je děděno procesy spuštěnými ze stejného shellu. Spusťte například textový editor GEdit spuštěnímgedit v terminálu a uložte soubor pomocí gedit. Všimnete si, že nově vytvořený soubor je ovlivněn stejným nastavením umasku jako v terminálu.

Použití: systém pro více uživatelů

Pokud jste v systému, který sdílí více uživatelů, je žádoucí, aby ostatní nemohli číst soubory ve vašem domovském adresáři. Za to je velmi užitečné umask. Upravte~/.profile a přidejte nový řádek:

umask 007

Musíte se znovu přihlásit, aby se změna umask v~/.profile projevila. Dále je třeba změnit stávající oprávnění souborů souborů ve vašem domovském adresáři odstraněním bitů pro čtení, zápis a spouštění pro svět. Otevřete terminál a proveďte:

chmod -R o-rwx ~

Pokud chcete, aby toto nastavení umask bylo aplikováno všem uživatelům v systému, můžete upravit profilový soubor na adrese/etc/profile.

    
odpověděl ajmitch 22.05.2011 22:59
35

Kromě dobré diskuse v přijaté odpovědi stojí za to přidat ještě několik bodů oumask s odkazem na to, jak je spravováno v 12.04 a dále.

Umask a pam_umask

Výchozí umask je nyní v/etc/login.defs a ne v/etc/profile, jako oficiální poznámka v/etc/profile reads:

# The default umask is now handled by pam_umask.
# See pam_umask(8) and /etc/login.defs.

Pam_umask je stručně vysvětleno níže a mělo by se říci, že výchozí soubor uživatele, který má umístit své vlastní nastavení umasku, je stále~/.profile.

Pam_umask je jeden z mnoha důležitých modulů PAM , které jsou zásadní v operaci Ubuntu (spusťteapropos '^pam_' a najděte stránky pro ostatní). V manpage propam_umask je třeba poznamenat, že

  

pam_umask je modul PAM pro nastavení masky pro vytváření režimu souborů v aktuálním prostředí. Umask ovlivňuje          výchozí oprávnění přiřazená nově vytvořeným souborům.

Poznámka k výchozím hodnotám umask

Nové složky v$HOME mohou být vytvořeny pomocímkdir s výchozími 775 oprávněními a soubory vytvořenými stouch s výchozími oprávněními 664, i když je výchozí umask 022. Zdá se, že to je nejprve rozporuplné a stojí za to vysvětluje.

Zatímco výchozí umask je v Ubuntu 022, není to celý příběh, jelikož existuje nastavení v/etc/login.defs, které dovoluje umasku být 002 pro uživatele bez root, pokud je splněna podmínka (viz výňatek níže) . Při běžné instalaci obsahuje/etc/login.defs nastaveníUSERGROUPS_ENAB yes. To je to, co

  

Umožňuje nastavit bity skupiny umask tak, aby byly stejné jako vlastní bity    (příklady: 022 -> 002, 077 -> 007) pro uživatele bez root, pokud je uid    stejný jako gid a uživatelské jméno je stejné jako jméno primární skupiny.

Proto vidíte následující sstat, když je vytvořen nový adresář smkdir v jednom uživatelském systému, jako je mine (uid a gid jsou stejné):

Access: (0775/drwxrwxr-x)  Uid: ( 1000/username)   Gid: ( 1000/username)

Další informace naleznete v tématuman pam_umask a Ubuntu se zpracovává online .

    
odpověděl user76204 02.04.2013 02:16
30

To je docela staré, ale stojí za zmínku. Vypočítat pro umask, na rozdíl od oprávnění systému souborů. Osmičkové umasky jsou vypočteny pomocí bitového AND neúrovňového doplnění argumentu pomocí bitové NOT. Osmičková notace jsou následující:

Octal value : Permission
0 : read, write and execute
1 : read and write
2 : read and execute
3 : read only
4 : write and execute
5 : write only
6 : execute only
7 : no permissions

Poté můžete vypočítat nastavení správných předpokladů umask:

$ umask 077
$ mkdir dir1
$ touch file
$ ls -ld dir1 file

drwx------ 2 amrx amrx 4096 2011-03-04 02:05 dir1
-rw------- 1 amrx amrx    0 2011-03-04 02:05 file

Výpočet konečného oprávnění pro soubory

Jednoduše odečtete umask ze základních oprávnění, abyste určili konečné oprávnění pro soubor takto:

666 – 022 = 644
  • Soubor oprávnění k souboru:666
  • hodnota umask:022
  • odečíst získat oprávnění nového souboru(666-022):644 (rw-r–r–)

Výpočet konečného povolení pro adresáře

Můžete jednoduše odečíst umask ze základních oprávnění, abyste určili konečné oprávnění pro adresář takto:

777 – 022 = 755
  • Povolení adresáře:777
  • hodnota umask:022
  • Odpočítávání pro získání oprávnění nového adresáře(777-022):755 (rwxr-xr-x)
odpověděl amrx 06.04.2016 10:27
25

Ostatní odpověděli, že velmi dobře vysvětlili pojetí umaskingu a proč je to nutné. Dovolte mi přidat dva centy a dát vám matematický příklad o tom, jak jsou oprávnění skutečně vypočítána.

Za prvé, "maska" neznamená "odečíst", v aritmetickém smyslu - není zapůjčena ani nesena, za druhé,umask je maska; není to číslo, které se má odečíst.

Za třetí, maska ​​vypne oprávnění. Jsou-li již vypnuté,umask nezmění oprávnění,

Předpokládejme například, že musíte odhalit077 ze systémových výchozích hodnot pro soubory, které jsou666 a adresářů, které jsou777.

Příkaz, který použijete, je

umask 077

(odhalte hodnotu v binární,000 111 111)

Co tato odmítnutí udělá, vypne libovolné z prvních šesti LSB (nejméně významných bitů), pokud jsou1 a pokud se některý z nich již vypne, nezmění.

Zde se vypočítá konečné povolení:

file permisison 666 = 110 110 110 
unmask value    077 = 000 111 111
will result in, 600 = 110 000 000

Sledujte, jak se hodnoty110 změnily na000.

Podobně,

directory permission 777 = 111 111 111 
unmask value         077 = 000 111 111
will result in,      700 = 111 000 000
    
odpověděl Sufiyan Ghori 05.06.2016 16:09
9

Základní koncept:

Jste-li jako většina lidí a nechápete, co se hekta "osmičkových umasků vypočítají pomocí bitového AND nepravého doplnění argumentu pomocí bitových NOT" znamená to moje jednoduché vysvětlení :

Nejprve si přemýšlejte o tom, co je "maska". Maska něco zablokuje. Zamyslete se nad maskovací páskou. V tomto případě je umask jako maskovací páska k blokování / zakázání oprávnění při vytváření nového souboru nebo adresáře.

Výchozí oprávnění při vytváření nového adresáře jeoctal 777 (111 111 111) a nový soubor jeoctal 666 (110 110 110). Nastavili jsme umask na blokování / zakázání určitých oprávnění.

  • Maskovací bit1 znamená blokovat / deaktivovat toto oprávnění (vložte maskující pásku přes tento bit).
  • Kousek masky0 umožní povolení projít (bez překrývání této bitové pásek).

Takžeoctal 022 (000 010 010) mask znamená zakázatgroup write aothers write a povolit všechny ostatní oprávnění projít.

Výpočet:

Zde je příklad výpočtu nového souboru (výchozí oprávnění 666) s 022 umask:

  perm mask result
----------------------------
u 1    0    1 (pass through)
  1    0    1 (pass through)
  0    0    0 (pass through)
----------------------------
g 1    0    1 (pass through)
  1    1    0 (disable)
  0    0    0 (pass through)
----------------------------
o 1    0    1 (pass through)
  1    1    0 (disable)
  0    0    0 (pass through)

Takže tak skončíte s výsledkem 644, když vytvoříte nový soubor.

Jednodušší způsob:

Ale pokud se vám spíše zaměňují výpočty inverzní masky, je snadnější používat symbolický zápis umasku. Když používáte tuto metodu, pak právě zadáte bity předávání namísto bitů masky.

  • umask u=rwx,g=rx,o=rx znamená povolení procházet prouser rwx,group rx,other rx. Což znamená zakázatgroup w,others w. Pokud spustíte tento příkaz a pak zkontrolujeteumask, dostanete022.
  • umask u=rwx,g=,o= znamená povolení projítuser rwx. Což znamená zakázat přístup progroup aothers. Pokud spustíte tento příkaz a pak zkontrolujeteumask, dostanete077.

Výpočet bonusu:

Pokud skutečně chtěli pochopit, co jsou "osmičkové umasky vypočteny pomocí bitové AND nepravého doplnění argumentu pomocí bitových NOT" , je zde několik logických tabulek, které mohou pomoci prokázat. Nezapomeňte, že bit masky1 znamená zakázat,0 znamená projít.

perm mask result
----------------
0    1    0     (mask 1 always disables)
1    1    0     (mask 1 always disables)
0    0    0     (mask 0 passes through)
1    0    1     (mask 0 passes through)

Pokud vytvoříte tabulku sNOT(mask), teď je to jen jednoduchá logikaAND!

perm NOT(mask) result
---------------------
0    0         0     (mask 1 always disables)
1    0         0     (mask 1 always disables)
0    1         0     (mask 0 passes through)
1    1         1     (mask 0 passes through)

Takže vzorec pro něj je:result = perm AND (NOT mask)

    
odpověděl wisbucky 04.04.2017 00:30