“Umask” nedir ve nasıl çalışır?


190

Umask'ın dosya izinlerini kontrol eden bir şey olduğuna inanıyorum , ancak tam olarak anlamadım.

Çalıştırdıktan sonra umask 0644bir de terminalde , ben komut satırı metin editörü ile oluşturduğunuz dosyaları okuyamaz nano. Bu dosyanın izinlerinin 0022varsayılan olarak ayarlandığını fark ettim 0755.

Umask nasıl çalışır? Ben sadece gelen Umask ki her rakamını çıkarın düşündüm 0777, 7 - 6 = 1ve 7 - 4 = 3, bu yüzden izinleri olmasını bekliyoruz 0133, ama görünüşe göre bu durum böyle değil.

  1. Umask tam olarak nedir? "Linux noob" gibiyim gibi açıkla bana
  2. Umask ile nasıl hesaplarım?
  3. Umask için kullanım örnekleri nelerdir?

app_mode 666 rw- rw- rw- umask 644 --0 -00 -00 file_mode 022 --- -w- -w-
grabantot

Yanıtlar:


143

Umask, uygulamaların dosyalarda ayarlayamadığı bir dizi izin olarak işlev görür. İşlemler için bir dosya modu oluşturma maskesidir ve dizinlerin kendisi için ayarlanamaz. Çoğu uygulama, yürütme izinleri ayarlanmış dosyalar oluşturmaz, bu nedenle varsayılan olarak 666umask tarafından değiştirilen bir varsayılanı olur .

Umask'ı sahibinin okuma / yazma bitlerini ve diğerleri için okuma bitlerini çıkarması için ayarladığınızdan, 777uygulamalarda olduğu gibi varsayılan bir dosya izinlerinin alınmasına neden olur 133. Bu, sizin (ve diğerlerinin) dosyayı çalıştırabileceği ve başkalarının da yazabileceği anlamına gelir.

Dosyaların sahibinden başka biri tarafından okunmaması / yazılmaması / yürütülmemesini istiyorsanız 077, grup ve diğerleri için bu izinleri kapatmak gibi bir umask kullanmanız gerekir .

Buna karşılık, bir umask 000yeni oluşturulan dizinleri herkes için okunabilir, yazılabilir ve alçaltılabilir kılar (izinler olacaktır 777). Böyle bir umask oldukça güvensizdir ve umask'ı asla ayarlamamalısınız 000.

Ubuntu'daki varsayılan umask, 022yeni oluşturulan dosyaların herkes tarafından okunabildiği, ancak yalnızca sahibinin yazabileceği anlamına geliyordu:

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

Ubuntu Oneiric (11.10) 'dan başlayarak, varsayılan umask gevşetildi 002, bu da sahibinin grubuna yazma erişimini genişletti:

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

Umask görüntüleme ve değiştirme

Geçerli umask ayarınızı görüntülemek için bir terminal açın ve komutu çalıştırın:

umask

Geçerli kabuğun umask ayarını başka bir şeyle değiştirmek için, 077 deyin, run:

umask 077

Bu ayarın işe yarayıp yaramadığını test etmek için, yeni bir dosya oluşturabilir (varolan bir dosyanın dosya izinleri etkilenmez) ve dosyayla ilgili bilgileri gösterebilir, çalıştır:

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

Umask ayarı, aynı kabuktan başlatılan işlemlerle miras alınır. Örneğin, GEdit metin düzenleyicisini uçbirimde yürüterek başlatın ve geditgedit kullanarak bir dosyayı kaydedin. Yeni oluşturulan dosyanın terminaldeki ile aynı umask ayarından etkilendiğini fark edeceksiniz.

Kullanım örneği: çok kullanıcılı sistem

Birden fazla kullanıcı tarafından paylaşılan bir sistemdeyseniz, başkalarının ana dizininizdeki dosyaları okuyamaması tercih edilir. Bunun için bir umask çok faydalıdır. Şununla ~/.profileyeni bir satır düzenleyin ve ekleyin:

umask 007

Bu umask değişikliğinin ~/.profileyürürlüğe girmesi için tekrar giriş yapmanız gerekiyor . Daha sonra, dünya için okuma, yazma ve yürütme bitlerini kaldırarak ana dizininizdeki dosyaların mevcut izinlerini değiştirmeniz gerekir. Bir terminal aç ve çalıştır:

chmod -R o-rwx ~

Bu umask ayarının sistemdeki tüm kullanıcılara uygulanmasını istiyorsanız, sistem genelindeki profil dosyasını adresinde düzenleyebilirsiniz /etc/profile.


3
Öyleyse, umasktaki rakamlar ne anlama geliyor? Neden 777grubun ve başkalarının yazamayacakları 077anlamına gelir , ancak yazamazlar ki?
HelloGoodbye

3
Ayrıca, umask ise 000, dosya izninin olacağını söylüyorsunuz 777. Varsayılan maskesi Yani 022, dosya izinleri olmamalı 755, yani karşılık gelen -rwxr-xr-xdeğil -rw-r--r--?
HelloGoodbye,

12
Kabul etmeliyim ki, bu açıklama bana yardımcı olduğundan daha fazla kafamı karıştırdı.
Connel Hooley

8
Not olduğunu Ubuntu'nun varsayılan umask 0002 olarak değiştirildi Bu cevap yayınlanmıştır sonra sadece bir ay.
Jeff Puckett

7
@HelloGoodbye umask ise 000izin yok kaldırılmayacak. gibi uygulamalar touchve nanovarsayılan dosyaları oluşturmak 666dosya izin kalacaktır böylece 666ancak bir umask'ı 022, böylece grubu ve diğerleri için yazma bitlerini kaldırır 666indirgenmiş olur 644aka -rw-r--r--düşünün mkdirmodunu oluşturmak hangi varsayılan 777bir Umask ile 022izinleri azaltacaktır755
Jeff Puckett

38

Kabul edilen cevabın iyi tartışmasına ek olarak, umask12.04 ve sonrasında nasıl yönetildiği ile ilgili olarak bazı noktalar daha eklemeye değer .

Umask ve pam_umask

Varsayılan umask şu an içinde /etc/login.defsve değil /etc/profile, resmi notun /etc/profileokuduğu gibi:

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

Pam_umaskaşağıda kısaca açıklanmıştır ve kullanıcının özel umask ayarını yerleştirmesi için varsayılan dosyanın hala olduğu söylenmelidir ~/.profile.

Pam_umaskUbuntu'nun operasyonunda çok önemli olan birçok PAM modülünden biridir ( apropos '^pam_'diğerlerinin sayfalarını bulmak için çalıştırın ). In manpage için pam_umasko belirtilmektedir

pam_umask, geçerli ortamın dosya modu oluşturma maskesini ayarlamak için bir PAM modülüdür. Umask, yeni oluşturulan dosyalara atanan varsayılan izinleri etkiler.

Varsayılan umask ile ilgili bir not

Varsayılan klasörler 022 iken bile varsayılan 775 izinleri ve varsayılan 664 izinleri ile oluşturulan dosyalar ile yeni klasörler $HOMEoluşturulabilir. Bu, ilk başta çelişkili ve açıklamaya değer.mkdirtouch

Varsayılan umask, Ubuntu'da 022 iken, bu bir durum değildir; çünkü /etc/login.defsbir koşulun gerçekleşmesi durumunda, umask'ın root olmayan kullanıcılar için 002 olmasını sağlayan bir ayar vardır (aşağıdaki alıntıya bakınız). Normal bir kurulumda, /etc/login.defsayarı içerir USERGROUPS_ENAB yes. Bu nedir

Uask gid ile aynı ise ve kullanıcı adı birincil ile aynıysa, umask grup bitlerinin kök olmayan kullanıcılar için aynı olmasını sağlar (örnekler: 022 -> 002, 077 -> 007). grup ismi.

Bu nedenle , benim gibi tek bir kullanıcı sisteminde statyeni bir klasör oluşturulduğunda aşağıdakileri görüyorsunuz mkdir(uid ve gid aynıdır):

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

Daha fazla bilgi için bkz man pam_umask. Ubuntu çevrimiçi sayfaları .


İkinci bölümün bir şeyleri kaçırmış gibi görünüyor? (USERGROUP_ENABLE?) Güncellenmiş bilgiler için +1
Lekensteyn

2
@Lekensteyn Garip, yeterince ayar /etc/login.defskesinlikle USERGROUPS_ENAB yeskontrol ettikten sonra. Bu dosyanın sözdizimi biraz sıra dışı.

Dosyayı ve kaynağı kontrol ettim ve haklısın, bu (ve diğer bazı) ayarları kafa karıştırıcı olarak "_ENAB" olarak adlandırılıyor.
Lekensteyn

33

Bu oldukça eski, ama bu söylemeye değer. Umask değerini hesaplamak için, dosya sistemi izinlerinden farklı olarak. Sekizlik boşluklar, bitsel NOT kullanarak, argümanın düzensiz tamamlayıcısının bitsel AND değeri üzerinden hesaplanır. Sekizlik notasyonlar aşağıdaki gibidir:

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

Öyleyse, umask uygun önceliklerini ayarlamak için hesaplayabilirsiniz:

$ 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

Dosyalar İçin Son İzni Hesaplama

Aşağıdaki şekilde dosyanın son iznini belirlemek için umask'ı temel izinlerden çıkarabilirsiniz:

666 – 022 = 644
  • Dosya tabanı izinleri: 666
  • umask değeri: 022
  • Yeni dosyanın izinlerini almak için çıkarma (666-022):644 (rw-r–r–)

Rehberlerin Nihai İzinlerinin Hesaplanması

Dizinin son iznini belirlemek için, umask'ı temel izinlerden çıkarmak için aşağıdaki adımları uygulayabilirsiniz:

777 – 022 = 755
  • Dizin temel izinleri: 777
  • umask değeri: 022
  • Yeni dizinin izinlerini almak için çıkarın (777-022):755 (rwxr-xr-x)

3
Nihai izinlerin nasıl hesaplandığını sanmıyorum, peki ya maskeleme değeri ise bu durumda 077nasıl çıkarırsınız 666-077?
Sufiyan Ghori

5
@SufiyanGhori Baron'un açıklaması dosya izni için tamamlanmadı. Sizin durumunuzda ve gelecekteki bir hesaplamada, hatırlanması kolay, bunları şu şekilde çıkarmayı aklınızda bulundurmalısınız: 6-0 6-7 6-7, eğer bu üçün sonucu -1 ise, o zaman 0 olsun. kesin sonuç 600 var
Huy.PhamNhu 28:16

1
@ Huy.PhamNhu Bu da doğru değil. 666 ve 033 umask izniyle kesinlikle 633 elde edemezsiniz.
maaartinus

7
Hayır hayır hayır. Umask değerini hesaplamak için çıkarma işlemini kullanamazsınız (belirli değerlerle çalışır, ancak hepsi değil). Umask'ı "bitleri devre dışı bırak" olarak düşünmelisiniz. Sufiyan ve Wisbucky'nin diğer cevaplarına bakınız.
wisbucky

33

Diğerleri cevap verdi, umasking kavramını ve neden gerekli olduğunu çok iyi açıkladılar. İki kuruşumu ekleyeyim ve izinlerin gerçekte nasıl hesaplandığı konusunda size matematiksel bir örnek vereyim.

Her şeyden önce, “Maske”, aritmetik anlamda “çıkarma” anlamına gelmez - ödünç veya taşıma yoktur, ikincisi, umaskmaskedir; çıkartılacak bir sayı değil.

Üçüncüsü, maske izin bitlerini kapatır. Zaten kapalıysa, umaskizinlerde değişiklik yapmaz,

Örneğin, var olan 077dosyalar 666ve dizinler için sistem varsayılanlarından maske kaldırmak zorunda olduğunuzu varsayalım 777.

Kullanacağınız komut,

umask 077

(İkili cinsinden maskelenme değeri, 000 111 111)

Bu maskenin yapacağı şey, eğer varsa, ilk altı LSB'den (en az önemli bit) 1herhangi birini kapatacak ve eğer zaten kapalıysa değişiklik yapmayacak.

Nihai iznin nasıl hesaplandığı:

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

Her iki 110değerin de nasıl değiştiğini gözlemleyin 000.

Benzer şekilde,

directory permission 777 = 111 111 111 
unmask value         077 = 000 111 111
will result in,      700 = 111 000 000

7
Cevap bu olmalı!
Abdelouahab

@SufiyanGhori Öyleyse, umask 177(001 111 111) eğer öyleyse ilk 7 en az önemli bit'i kapatır1
Kasun Siyambalapitiya 20:17

bu doğru @KasunSiyambalapitiya
Sufiyan Ghori 20:17

1
formül de öyleresult = file permission & (!umask)
Eric Hodgins

1
@EricHodgins: Evet, kesinlikle.
Amit Naidu

14

Temel kavram:

Eğer çoğu insan gibiyseniz ve "sekizlik ölümlerin bitsel olarak VE argümanının tamamlayıcı bitini kullanarak bittal NOT kullanılarak hesaplandığı" halterinin ne anlama geldiğini anlamıyorsanız , işte basit açıklama:

Her şeyden önce, bir "maske" ne olduğunu düşünün. Bir maske bir şeyi engeller. Maskeleme bandını düşünün. Bu durumda umask, yeni bir dosya veya dir oluştururken izinleri engellemek / devre dışı bırakmak için maskeleme bandı gibidir.

Yeni bir dizin oluştururken varsayılan izinler octal 777 (111 111 111)ve yeni bir dosya octal 666 (110 110 110). Umask'ı belirli izinleri engellemeye / devre dışı bırakmaya ayarladık.

  • Maske biti, 1bu izni engellemek / devre dışı bırakmak anlamına gelir (maskeleme bandını bu bitin üzerine yerleştirin).
  • Bir maske biti 0, iznin geçmesine izin verir (o biti maskeleme bandı yok).

Yani bir octal 022 (000 010 010)maske devre dışı bırakmak için anlamı group writeve others writeve diğer tüm izinler geçmesine izin verir.

Hesaplama:

022 umask ile yeni bir dosya için (varsayılan 666 izin) örnek bir hesaplama:

  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)

Demek yeni bir dosya oluşturduğunuzda 644'ün sonucunu böyle çıkardınız.

Daha kolay yol:

Fakat eğer ters maske hesaplamaları sadece sizi şaşırtıyorsa, sembolik umask gösterimini kullanmanın daha kolay bir yolu vardır. Bu yöntemi kullandığınızda, yalnızca maske bitleri yerine geçiş bitlerini siz belirlersiniz.

  • umask u=rwx,g=rx,o=rxaraçlar için geçmesine olanak user rwx, group rx, other rx. Hangi devre dışı ima group w, others w. Bu komutu çalıştırırsanız kontrol edin umask, alırsınız 022.
  • umask u=rwx,g=,o=için geçiş izni vermek demektir user rwx. Bu da groupve için tüm erişimi devre dışı bırakır others. Bu komutu çalıştırırsanız kontrol edin umask, alırsınız 077.

Bonus hesaplama:

Eğer "sekizlik boşlukların bitsel VE bağımsız değişken tamamlayıcı bit kullanarak biti NOT ile hesaplandığını" ne anlama geldiğini anlamak istiyorsanız , burada göstermeye yardımcı olabilecek bazı mantık tabloları yer almaktadır. Unutmayın, bir maske biti 1devre dışı bırakmak, 0geçer demek.

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)

Masayı birlikte yaparsanız NOT(mask), şimdi sadece basit bir ANDmantıksal tablo!

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)

Yani bunun için formül: result = perm AND (NOT mask)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.