777 niçin bir dosyadaki her şeye izin vermek için chmod'a atandı?


54

Bir röportajda neden bir dosya için tüm izinleri almak için 777'nin atandığını sordum. Neden 555 değil? Her şeyin bir nedeni olduğunu söyledi. Peki, 777'nin sebebi nedir? Neden başka bir numara yok? Bu sayının bir önemi var mı?



2
@ AvinashRaj'ın link yorumuna bakın ve bu örneğe uygulayın. "Neden?" hangi örneğe ve hangi amaca hizmet
ettiğine bağlı

1
Sayı 7'ye 5'in önemini mi, yoksa harf yerine neden sayı olduklarını mı soruyor?
Braiam

4
Bu harika bir röportaj sorusu; Çalmam gerekebilir.
Dijital Chris

5
Açıkçası, bu 777 değil, 0777 değil.
Ruslan

Yanıtlar:


129

Bunun nedenini aaa ya da 999 yerine 777 olmasının nedenini bulmaya çalışacağım .

İzinlerin aşağıdaki biçimde geldiğini unutmayın:

 u   g   o
rwx rwx rwx

burada u = kullanıcı, g = grup, o = diğer.

Şimdi, bu grupların her birini ikili olarak temsil ettiğinizi düşünün. 1 doğru, 0 yanlış.

Herkese tam erişim vermek istiyorsanız, aşağıdaki izinleri ikili sisteme atayın:

 u   g   o
rwx rwx rwx
111 111 111

Şimdi, eğer ikiliyi biliyorsanız, ikiliden ondalıkya dönüştürdüğünüzde, anladığınızı fark 111edeceksiniz 7.

Böylece, tam erişimi olarak temsil edebilirsiniz 777.

Not: Biz gerçekten ikiliden octata dönüşüyoruz. Aşağıdaki düzenlemeye bakınız.

Bu, diğer tüm erişim modları için de geçerlidir.

Örneğin, 555her 5birini ikiliye dönüştürerek ve yukarıdaki biçimde yazarak ne demek istediğinizi kolayca çözebiliriz . 5İkili olduğu 101için aşağıdaki izinlere sahibiz:

 u   g   o
r-x r-x r-x
101 101 101
 5   5   5

Benzer şekilde, kullanıcıya tüm izinleri vermek istiyoruz, ancak yalnızca diğer kişilerin okumasına izin veriyorsak, bir sayı gösterimi bulabiliriz.

 u   g   o
rwx r-- r--
111 100 100
 7   4   4

Şimdi, bunu biliyoruz 111ikilik biçimde 7ondalık ve 100ikilik biçimde 4ondalık. Böylece, izinler olacak 744.

Düzenle:

Teknik olarak, @ LưuVĩnhPhúc ve @Braiam tarafından vurgulandığı gibi, aşağıda açıklandığı gibi, ikiliden octata dönüşüyoruz. Ancak, <8 sayılarının ondalık ve sekizli gösterimleri aynıdır, bu nedenle 3 basamaklı veya daha küçük olan ikili sayılar için, hem ondalık hem de sekizli gösterimler aynıdır.

Sekizli sayılar olarak temsil edildiğinde, üçlü gruplara ayrılmak yerine ve her bir grupta ondalık dönüşüm yapmak için ikili yapmak yerine, üç grubun tümünü tek bir ikili sayı olarak bir araya getirebilir ve sekizliye dönüştürebilirsiniz.

Örneğin, işte bazı sekizli-sekizli dönüşümler:

0b111111111 == 0o777
0b101101101 == 0o555
0b111100100 == 0o744

İkili ve sekizli sayıları birbirinden ayırmak için "0b" ve "0o" hazırladığımı unutmayın.

Bununla oynamak isterseniz, bir terminal açın, koşun pythonve aşağıdaki komutlarla oynayın:

oct(0b111111111)
bin(0o555)

Bilgisayarın ilgilendiğiniz tabanı bilmesini sağlamak için numaralara "0b" veya "0o" yazmayı unutmayın.


17
Sadece bütünlük uğruna, sayıların biçimine kelimenin tam anlamıyla 8'in tabanı anlamına gelen sekizlik denir (0'dan başladıkları için 7 + 1 = 8'dir).
Braiam

3
davie: octal kolaydır çünkü aslında onaltılı gruplar dördüncü gibi üç bit gruplandırır. Ondalık 2 bir güç değildir, bu yüzden bitleri güzel bir şekilde gruplamaz.
Konerak

2
Her iki durumda da aynı numarayı alıyorsunuz. Sanırım birisinin ondalık dönüşüm için bir ikiliyi, ikili dönüşümden sekizli dönüşüm için anlaması daha muhtemel. Ayrıca, sayıların ondalık değil, gerçekten sekizlik olduğunu açıklığa kavuşturmak için bir bölüm ekledim.
daviewales,

3
7ondalık ve oktalde aynıdır - ancak 777değildir. Saygısız bitlerden söz ederken, fark yaratır.
Sam Dufel

2
Sadece önemsiz aşkına 7, Tanrı'nın Numarası ve varsayılan izinleri 777bazen kök olarak adlandırılan kök kullanıcı olarak adlandırılır.
eyoung100

16

Dosya izni anlamına gelir 4, dosya izni anlamına gelir 2ve dosya izin anlamına gelir anlamına gelir 1.

Yani bunun toplamı 7.

Şimdi 777 nedir: Birincisi 7, dosya sahibinin, dosya sahibinin okuduğunu, doğru okuduğunu ve yürütmekte olduğunu gösterir.

İkincisi 7, dosyanın ait olduğu grup içindir, grubun tüm okuma, yazma ve yürütme iznine sahip olduğu anlamına gelir.

Üçüncüsü 7, başkalarının izni içindir.

Eğer dosya iznini verirseniz, 555o zaman dosya owner, group and otherssadece readve executeizin not writeiznine sahiptir, çünkü okuma izni 4 demektir ve 1'ini çalıştırınız.5


Grup nedir ve diğer izinler nelerdir? Cevap için teşekkürler.
cehennem

Lütfen grup ve diğer izinler için bu bağlantıya bakın , bunlar sizin grubunuzda olmayan ya da sizin grubunuzda olmayan herhangi bir başkası için uygulanacaktır
Prakash V Holkar

7

En iyi cevap olarak pek fazla kelime değil:

Her dosya 3 izin seçeneğine sahiptir: oku, yaz ve çalıştır. Bunlardan hiçbirini, bunlardan birini, bunlardan ikisini veya bunların hepsini seçebilirsiniz.

C (3,0) + C (3,1) + C (3,2) + C (3,3) = 8

1 + 3 + 3 + 1 = 8

Yani, toplamda 8 kombinasyon var; İzinler için 8 seçenek. 0'dan sayma, son sayı 7'dir (0'dan 7'ye). Yani, sayılarla temsil edilen, tüm seçenekler:

0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)

Üç sayı vardır, çünkü sipariş [kullanıcı izinleri] [grup izinleri] [diğer izinler].

Yani, 777, her üç grubun da okuma, yazma ve izinlere sahip olduğu anlamına gelir.


Ayrıca (dolaylı olarak ilişkili olduğu için bu bölümü mutlaka okumak zorunda değilsiniz), çünkü alaka düzeyinin önemli olduğunu düşünüyorum: Neden read3 sayısı yerine 4 sayısı?

0 - nothing
1 - execute
2 - write
3 - read
4 - execute + read (1 + 3)
5 - write + read (2 + 3)
6 - execute + write + read (3 + 2 + 1)
7 - ????? no way to get this with the 3 basic options (and we are missing execute + write)

Tüm olasılıklar için benzersiz kombinasyonlar elde etmenin tek yolu, temel seçenekler için 2 güçten geçmektir. 2 0 = 1 (yürütme), 2 1 = 2 (yazma), 2 2 = 4 (okuma) ve 4. temel bir seçenek olsaydı, 2 3 = 8 olarak numaralandırılırdı write. Önceki seçenekler listelenmiştir (sadece bir seçenek, çünkü o sadece bir seçenek execute). readönceki seçeneklerin tüm kombinasyonları listelenene kadar listelenmedi (yine bir seçenek, çünkü iki seçenekli sadece bir kombinasyon var - execute+ write). execute+ write+readÜç izinden iki seçenek olduğundan, önceki tüm kombinasyonlar listelenene kadar listelenmemiş. Liste, bu şekilde devam eder, ne kadar temel seçenek olursa olsun. Örnek olarak, 4 temel seçenekle (4 seçenek ve 2 4 = 16 olduğundan toplam 16 kombinasyon olacağını da bildiğimize dikkat edin ):

0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)
8 - love
9 - execute + love (1 + 8)
10 - write + love (2 + 8)
11 - execute + write + love (1 + 2 + 8)
12 - read + love (4 + 8)
13 - execute + read + love (1 + 4 + 8)
14 - write + read + love (2 + 4 + 8)
15 - execute + write + read + love (1 + 2 + 4 + 8)

6
Unix dosya izin bitleri için ikili ve daha da önemlisi, sekizlik sayı sistemini kaynak olarak tanıyamadığından bu cevap tamamen kötüdür . (Yeterince komik, 3 ya da 4 değiller… 6
yaşındalar

1
Taban, önemsizdir, 111, 7'dir; İzinlerin 111 mi yoksa 7 mi olduğunu söylemem önemli değil çünkü aynı değerde. İlgili matematiği göstermek için örneklerin basitliği için ondalık kullandım. İkili ikili kullanabilirdim, ama matematik o kadar kolay gözükmüyordu. Bazların birbirleriyle çevrilmesinin ne önemi var?
Daniel Ward,

4

İzini tamamen kaçıran benzer cevaplara şaşırdım.

İhtiyaç duyulan 3 sınıfı belirledikten sonra okuma, yazma ve yürütme. Dosya sistemini yönetmek için gereken alanı en aza indirmek için sekizli (3 bit) ile gittiler .


3

Her nedense, UNIX tasarımcıları dosya izinleri için OCTAL numaralarını kullanmaya karar verdi . Bildiğiniz gibi, bir basamaklı sekizlik sayı için maksimum değer 7'dir. Bir kullanıcı erişimi, bir grup erişimi ve bir dünya erişimi için bir sekizlik basamak neredeyse her şey için yeterlidir. Maksimum 3 basamaklı sekizli sayı 777'dir ve yalnızca "herkese / her şeye erişimi" ifade ettiği anlamına gelir.


Bunun iyi bir açıklama olduğunu sanmıyorum. UNIX tasarımcıları ondalık sayılara sahip olabilir ve yine de 9 yerine (maksimum ondalık basamak olarak) 7 erişim yerine en fazla 7 erişim gösterebilirdi . 7 "additively" Hiç hiçbir hakları için sıfırdan başlayarak tek ikili rakam izin erişime dayalı numaralar mümkün olan en yüksek tek haneli başlayan mümkündür ne dayalı "eksiltici" seçilmiş, ancak değildir.
VEYA Mapper

En başta “bir sebepten ötürü” yazdığımı farkettim ... - Niçin OP sorusu olmadığı için, NEDEN octal sayılarını seçtikleri hakkında daha derin bir açıklama yapmak istemedim. Soru, 777'nin neden tüm izinleri verdiği idi.
DejanLekic

Burada neden sekizlik rakamlar seçtikleri önemli değil. Anlatmak maksimum hakları sayı 7 ile temsil edilmektedir sebebi olduğudur değil 7 maksimum sekizlik sayı olur o.
VEYA Mapper,

2

Günümüzde hepimiz bir bayt 8 bit olduğunu biliyoruz : Bu on yıllardır evrensel olarak kabul edilmiştir. Ancak bu her zaman böyle değildi ve Unix (Linux'a birçok yönden ilham veren), halen tartışıldığı bir dönemde yazıldı. Özellikle, 6 bit bayt veya 8 bit bayt kullanan sistemlere taşınabilir olması gerekiyordu. Bunu yazanların bazıları tartışmanın bir tarafındaydı, diğerleri ise diğer tarafındaydı.

İlgili bir notta, Base-2 (binary) değerleri yazmak için çok uygun bir gösterim değildir. Günümüzde, çoğu programcı bunun yerine Base-16 (onaltılık) kullanan daha kompakt bir gösterim yazmaktadır . 16, tam olarak dört biti bir onaltılık basamağa toplayabileceğiniz bir tabandan yeterince büyüktür: örneğin, ikili dosyadaki "0000" onaltılık aralıkta 0x0'dır (bu "0x" yapmak üzere olduğunuzu not etmenin yaygın bir yoludur) onaltılık bir sayı yazın), "1111" 0xF (veya ondalık sayıda 15) iken. Gerçekten sadece ikilik saymak suretiyle tek bir onaltılık rakam kullanarak dört bitlik olası bir kombinasyon yazabilirsiniz ve konumsal aritmetik işler nedeniyle onu biriktirebilirsiniz: iki onaltılık rakam sekiz bitlik olası herhangi bir kombinasyonunu kodlayabilir, sadece sayarak, vb. Böylece 8 bitlik insanlar bunu sevdi.

6 bitlik millet bunu yapmanın kendi yollarına sahipti, ancak Base-16'yı kullanmak yerine Base-8'i (sekizlik) kullandılar. Onaltılık ile benzer avantajlara sahiptir: üç bitin herhangi bir pozisyonunu sekiz haneli bir basamağa kaydedebilir ve rakamları benzer şekilde biriktirebilirsiniz. 8 bitlik milletlerin bir bayt için iki onaltılık rakam kullandığı gibi, 6 bitlik millet bir bayt için iki sekizlik rakam kullandı. Artık çok fazla octal görmüyorsunuz, ancak tipik olarak baştaki bir sıfır ile belirtildi: örneğin, "111" sekizlikte 07'dir.

Şimdi, bunların Unix izinleriyle ne ilgisi var? Unix söz konusu olduğunda, bir dosyayla yapabileceğiniz üç şey vardır: onu okuyabilir, yazabilir veya bir program olarak çalıştırabilirsiniz. Bunu izinlerle sınırlandıracaksanız, her biri için biraz ihtiyacınız var: birinin yapmasına izin verilen şeyler için açın ve birisinin yapmasına izin verilmeyen şeyler için bırakın. İzlenen üç şey olduğundan, üç bit gerekir ve Unix bunu üç satır boyunca takip ettiğinden (sahip, grup ve herkes) toplam dokuz bit gerekir.

Hat boyunca bir noktada, muhtemelen 6-bit kamptaki birisi- “Hey, bunun için sekizli rakamlar kullanabiliriz” dedi . Ve bu çok uygun bir gösterim olarak ortaya çıktı: üç sekizlik basamak, bit alanlarının olası her bir kombinasyonunu kodlamak için yeterli. Bunu yapmaya karar verdiklerinde, 777'nin kaderi (ve 000'ler) mühürlendi, çünkü bu sayılar bitleri nasıl düzenlediklerine bakılmaksızın aynı olacaktı, ancak diğer tüm sayılar için de önemliydi, bu yüzden bunu yapmaya karar verdiler.

İzinleri üç bitlik alanlara yerleştirdiler: başlangıçta okumak, ortada yazmak ve sonunda çalıştırmak. Sonra tarlaları kendileri düzenlediler: başlangıçtaki sahip, ortadaki grup ve sondaki diğerleri. Bunu yaptıklarında, geri kalan sayıları belirlemek için tek yapmaları gereken sayılır.

3-bitlik alanlar olduklarından, her bir sekizli basamağın alanlardan birini kontrol ettiğini söyleyebilirsiniz : birinci hane sahibi izinlerini, ikinci hane grubu grup izinlerini ve üçüncü hane diğer izinleri kontrol eder. Bu nedenle, 777 (111 111 111) herkes için tüm izinlerdir, 700 (111 000 000) ise sadece sahipler için tüm izinlerdir. Diğer kombinasyonlar da yaygındır: 666 (110 110 110) herkes için okur / yazar ancak yürütülmez), 555 (101 101 101) herkes için okur / yürütür, fakat yazmaz (400, 100 000 000) sadece sahibi için ve başkaları için erişim yok.

Bu yüzden 777 tüm izinleri ifade ediyor. Bu günlerde, Unix ve soyundan gelenlerin hala birkaç başka haberi olsa da, insanların oktal kullanması en popüler nedendir. Örneğin od, veya Octal Dump, bir dosyanın ikili dökümlerini sekizli biçimde almanın bir yoludur (adı verilen onaltılık bir kuzeni vardır xxd, ancak bu kadar iyi bilinmez ve her yerde kullanılamaz). Aynı zamanda bazı programlama dillerinde önde gelen sıfırlara dikkat etmeniz gerektiğinin nedeni de budur; çünkü bunlar gerçekten niyetimiz olmadığında sekizlik olarak rakamlar yazmayı düşündüğünüzü düşünebilirler.


her şeyden önce linux oluşturulduğunda (yaklaşık 1992) 8-bit 6-bit tartışmalar YOL sona ermişti.
Ahmed Masud

1
Tarihsel bağlamda 8-bit / 6-bit öğelerini sağladım. Linux bu tartışmanın sona ermesinden çok sonra yaratıldı, doğru, ancak Unix'ten ilham aldığından dolayı, bu tartışmadan benzer şekilde etkilendi. Bu yüzden tarihsel bağlamı tanıtmanın iyi bir fikir olacağını düşündüm.
The Spooniest
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.