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ı?
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ı?
Yanıtlar:
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 111
edeceksiniz 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, 555
her 5
birini ikiliye dönüştürerek ve yukarıdaki biçimde yazarak ne demek istediğinizi kolayca çözebiliriz . 5
İkili olduğu 101
iç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 111
ikilik biçimde 7
ondalık ve 100
ikilik biçimde 4
ondalık. Böylece, izinler olacak 744
.
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 python
ve 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.
7
ondalık ve oktalde aynıdır - ancak 777
değildir. Saygısız bitlerden söz ederken, fark yaratır.
777
bazen kök olarak adlandırılan kök kullanıcı olarak adlandırılır.
Dosya izni anlamına gelir 4
, dosya izni anlamına gelir 2
ve 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, 555
o zaman dosya owner, group and others
sadece read
ve execute
izin not write
iznine sahiptir, çünkü okuma izni 4 demektir ve 1'ini çalıştırınız.5
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.
read
3 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)
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.
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.