UNIX izinlerini ve dosya türlerini anlama


68

Bugüne chmodkadar nasıl çalıştığımı hiç anlamadım Bana çok şey anlatan bir öğretici takip ettim.

Örneğin, üç farklı izin grubunuz olduğunu okudum:

  • sahip ( u)
  • grup ( g)
  • herkes ( o)

Bu üç gruba dayanarak şimdi şunu biliyorum:

  • Dosya kullanıcıya aitse, kullanıcı izinleri erişimi belirler.
  • Dosya grubu, kullanıcı grubuyla aynıysa, grup izni erişimi belirler.
  • Kullanıcı dosya sahibi değilse ve grupta değilse, diğer izin kullanılır.

Ayrıca aşağıdaki izinlere sahip olduğunuzu da öğrendim:

  • read ( r)
  • yazmak ( w)
  • execute ( x)

Yeni edindiğim bilgilerimi test etmek için bir dizin oluşturdum:

mkdir test

Sonra bazı testler yaptım:

chmod u+rwx test/
# drwx------
chmod g+rx test/
# drwxr-x---
chmod u-x test/
# drw-r-x---

Bir süre uğraştıktan sonra sanırım sonunda chmodbu komutu kullanarak izninizi ve yönteminizi belirledim.


Fakat...

Hala birkaç sorum var:

  • dBaşlangıçta ne anlama geliyor ?
  • İçerdiği yuvanın adı ve kullanımı nedir ve başka hangi değerleri tutabilir?
  • Bunu nasıl ayarlayabilir ve çözebilirim?
  • Bunun değeri nedir d? (Sadece 7 = 4 + 2 + 1 7 = 4 + 2 + 1 7 = 4 + 2 + 1 değerlerine sahip)
  • Neden insanlar bazen izinlerini belirlemek 0777yerine kullanırlar 777?

Fakat birden fazla soru sormamam gerektiğinden, bunu tek bir soruda sormaya çalışacağım.

Tüm Linux dağıtımları gibi UNIX tabanlı sistemlerde, izinlerle ilgili olarak, birinci kısım ( d) neyi temsil eder ve izinlerin bu kısmı için kullanımı nedir?


3
Lütfen bir dahaki sefere sadece bir soru sormaya çalışın, birden fazla soru genellikle referans vermek için kötüdür ve neredeyse hiçbir zaman aynı anda ele alınmaz.
Kiwy

1
@Kiwy Üzgünüm, aynı konuyla ilgili olduğu için böyle yapacağımı düşündüm. İsterseniz, sorumu referansını geliştirmek için sorumum için daha iyi bir başlık önerebilirsiniz.
Peter,

1
Bu arada, "d" nin değeri 040000 - bu ad altında başlık dosyalarında bulunabilir S_IFDIR. Dosya modunu ayarlarken kullanmazsınız, ancak stat()işlev aslında 040750 için değerini döndürür drwxr-x---.
Random832

2
@jamesqf Aslında, şimdi sekizlik kodların nasıl eşlendiğini anladığım için, bu şekilde düşünmek benim için daha basit.
HalosGhost

4
@Peter: aptalca soru yok - sadece öğrenmeyen aptallar çünkü sormaktan korkuyorlar.
mgarciaisaia

Yanıtlar:


117

Sorularınıza üç bölümden cevap vereceğim: dosya türleri, izinler ve çeşitli biçimlerde kullanım örnekleri chmod.

Dosya türleri

ls -lÇıktıdaki ilk karakter dosya türünü temsil eder; dbu bir dizin demek. Ayarlanamaz veya ayarlanamaz, dosyanın nasıl oluşturulduğuna bağlıdır. Dosya türlerinin tam listesini ls belgelerinde bulabilirsiniz ; rastlama ihtimalin olanlar

  • -: “Normal” dosya, dosya yazabilen herhangi bir programla oluşturulmuş
  • b: blok özel dosya, genellikle disk veya bölüm cihazları ile oluşturulabilir mknod
  • c: özel karakter dosyası, ayrıca oluşturulabilir mknod( /devörnekler için bakınız )
  • d: dizin, ile oluşturulabilir mkdir
  • l: sembolik link ile oluşturulabilir ln -s
  • p: isimli boru ile oluşturulabilir mkfifo
  • s: soket ile oluşturulabilir nc -U
  • D: Solaris / openindiana'daki bazı sunucu işlemlerinin yarattığı kapı .

İzinler

chmod 0777Tüm izinleri tek bir chmoduygulamada, değişiklikleri u+vb. birleştirmek yerine kullanmak için ayarlamak için kullanılır. Dört basamağın her biri, bir izin kümesini temsil eden sekizli bir değerdir:

  • suid, sgidVe “yapışkan” (aşağıya bakınız)
  • Kullanıcı İzinleri
  • grup izinleri
  • “Diğer” izinleri

Sekizlik değer, izinlerin toplamı olarak hesaplanır:

  • “Oku” 4
  • “Yazmak” 2
  • “Yürüt” 1

İlk hane için:

  • suid4; Bu biti ayarlanmış olan ikili dosyalar sahiplerinin kullanıcısı olarak çalışır (genellikle root)
  • sgid2; bu bit kümesine sahip ikili dosyalar sahip grubu olarak çalışır (bu, yüksek puanların paylaşılabilmesi için oyunlar için kullanılırdı, ancak oyunlardaki güvenlik açıklarıyla birleştirildiğinde genellikle güvenlik riski taşır) ve bu bit kümesine sahip dizinlerde oluşturulan dosyalar varsayılan olarak dizin sahibinin sahibi grubu (bu, paylaşılan klasörler oluşturmak için kullanışlıdır)
  • “Yapışkan” (veya “sınırlı silme”) 1'dir; Bu bit setindeki dizinlerdeki dosyalar sadece sahipleri, direktörlerin sahipleri tarafından silinebilir veya root( /tmpbunun ortak bir örneğini görmek için).

Detaylar için chmodman sayfasına bakınız. Bunların hepsinde, kullanıcıların dosyalar üzerindeki izinlerini değiştirebilecek diğer güvenlik özelliklerini görmezden geldiğimi unutmayın (SELinux, ACL dosyaları ...).

Özel bitler, dosya türüne (normal dosya veya dizin) ve temel sisteme bağlı olarak farklı şekilde ele alınır. (Bu chmodkılavuzda bahsedilmektedir .) Bunu test etmek için kullandığım sistemde ( coreutilsbir ext4dosya sisteminde 8.23, Linux çekirdeği 3.16.7-ckt2 çalıştıran), davranış şu şekildedir. Bir dosya için, açıkça belirtilmediği sürece, özel bitler her zaman temizlenir chmod 0777, buna eşdeğerdir chmod 777ve her iki komut da özel bitleri temizler ve herkese dosya üzerinde tam izinler verir. Yürürlükte böylece bir dizin için özel bit tam dört basamaklı sayısal formu kullanarak temizlenir asla chmod 0777da eşdeğerdirchmod 777ancak bazı özel bitlerin olduğu gibi kalacağı için yanıltıcıdır. (Bu cevap bir önceki sürümü Yanlış anladın.) Kullanmak gerekir dizinleri özel bitleri temizlemek için u-s, g-sve / veya o-taçıkça veya negatif bir sayısal değer belirtin, böylece chmod -7000bir dizinde tüm özel bit silecektir.

Gelen ls -lçıkış, suid, sgidve “yapışkan” yerine görünür xgirişi: suidolduğu sveya Syerine kullanıcının ait x, sgidolup sveya Syerine grubun içinde xve “sabit” kalır tveya Tyerine başkalarının x. Küçük harf, hem özel bitin hem de yürütülebilir bitin ayarlandığını gösterir; büyük harf, yalnızca özel bitin ayarlandığını gösterir.

Chmod çeşitli şekilleri

Yukarıda açıklanan davranış nedeniyle, tam dört basamağın chmodkullanılması kafa karıştırıcı olabilir (en azından kafam karıştı). İzin bitlerinin yanı sıra özel bitler de koymak istediğinizde kullanışlıdır; Aksi takdirde, bir dosyayı değiştirirseniz, bir dizini değiştirirseniz korunan bitler temizlenir. Yani chmod 2750en azından sgidve tam olarak almanızı sağlar u=rwx,g=rx,o=; ancak chmod 0750özel bitleri mutlaka temizlemeyiniz.

Metin komutları ( [ugo][=+-][rwxXst]) yerine sayısal modları kullanmak , muhtemelen daha çok bir alışkanlık ve komutun amacıdır. Sayısal modları kullanmaya alışınca, tam modun bu şekilde belirtilmesi genellikle daha kolaydır; Sayısal modları kullanarak izinleri düşünebilmek faydalıdır, çünkü diğer birçok komut bunları kullanabilir ( install, mknod...).

Bazı metin çeşitleri kullanışlı olabilir: Bir dosyanın herhangi biri tarafından yürütülebilmesini sağlamak istiyorsanız chmod a+x, diğer izinlerin ne olduğuna bakılmaksızın bunu yapacaksınız. Benzer şekilde, +Xyürütme iznini yalnızca yürütme izinlerinden biri önceden ayarlanmışsa veya dosya bir dizinse ekler; Bu, özel dava dosyaları v. dizinleri kullanmak zorunda kalmadan genel olarak izinleri geri yüklemek için kullanışlı olabilir. Bu nedenle, tüm dizinlere ve yürütülebilir dosyalara ve diğer tüm dosyalara chmod -R ug=rX,u+w,o=uygulanmaya eşdeğerdir .chmod -R 750chmod -R 640


Diğer cevaplar oldukça iyi olsa da, gerçekten bu soruyu cevaplamak için biraz zaman harcadınız. Teşekkürler.
Peter,

Açık * BSD dizinleri sgid, gerçek değerleri ne olursa olsun, bitleri her zaman ayarlanmış gibi davranır . FreeBSD'de suidbit sgid, altta yatan dosya sisteminin bunu desteklemesi ve bu suiddirseçeneğe monte edilmesi şartıyla, benzer şekilde (yani içinde oluşturulan dosyalar ve alt dizinler, dizininkiyle aynı dizinde olacaktır) sahip olacak şekilde yapılandırılabilir .
lcd047

" +Xyürütme iznini yalnızca yürütme izinlerinden biri önceden ayarlanmışsa veya dosya bir dizinse " ekler "teşekkür ederim @ stephen-kitt eksik " zaten ayarlandı " belgeleri gerçekten beni bir döngü için atıyordu!
Ryan Fisher

39

Bu nedenle, Linux'taki izinler çok önemlidir. Kısa bir açıklama yapmaya çalışacağım.

Bir dosya modunun parçaları için

Her Unix dosyası, dosyayı okuyabilir, yazabilir veya çalıştırabileceğinizi belirleyen bir dizi izne sahiptir. Ls -l komutunu çalıştırmak izinleri görüntüler. İşte böyle bir ekrana bir örnek:

-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile

Bir dosya modunun parçalarının görüntüsünü ekliyorum:

görüntü tanımını buraya girin

Yazı farklı olabilir. Örneğin:

  • d (dizin)
  • c (karakter cihazı)
  • l (sembolik bağlantı)
  • p (adlandırılmış yöneltme)
  • s (soket)
  • b (cihazı engelle)
  • D (kapı, Linux sistemlerinde yaygın değildir ancak taşınmıştır)

Tüm dizin için bazı izinler ayarlamak istiyorsanız, örneğin R niteliğini kullanabilirsiniz:

chmod -R 777 /some/directory/

Chmod 777 için 0777

chmodKomut genellikle ilk sıfır yapışkan / SGID / suid bit triplet değerini belirtir, giriş sekizlik olmasını bekler. Bununla birlikte, C'de, (oktal) 'a çevrileceği için bir fark 777yaratacaktır 01411, bu yüzden yapışkan bitin ayarlanması ( chmod(2)man sayfasına bakınız ), grup sahibi ve diğerleri için sahip ve çalıştırılabilir bit'in izinlerini okumak (oldukça garip bir kombinasyondur) .

1 EDIT

Linux izinleri hakkında başka bir resim buldum ve daha kolay anlamak için ekleyeceğim: UNIX dosya izinleri


5
777 vs 0777 hakkında yanılıyorsunuz. Her ikisi de sekizdir (bu durumda ondalık zaten bir anlam ifade etmez), ancak dört karakter biçiminde, ilk basamak özel bitleri ayarlar (yapışkan ve setuid).
orion

3
@orion Bazen doğrudur, örneğin C benzeri bir kodda chmod(777)koşmaya eşdeğerdir chmod 1411(yani, chmodargümanlı komut 1411).
Peterph

2
... ki, sistem çağrısı (veya ambalajı) ve aynı adı taşıyan ikili sistem için biraz kafa karıştırıcı olabilir.
Peterph

3
Python Master Race, 0 ile başlayan tüm "sayıları" yasaklayarak, kullanıcının onluktan başka bir şey, örneğin hex:, 0x1FFbinary: 0b111111111ya da octal: 'ı açık bırakmaya zorlamasını engelleyerek bu sorunu çözdü 0o777. PYTHON POWER
Nick T,

Resim kaynağı?
Kilim

10

dbir dizin olduğu anlamına gelir, eğer bir dosyanız -varsa ve bir link ise bir bulacaksınız l. Ayarlanamaz / ayarlanamaz.

0777'yi izin olarak kullanıyorsanız, sistemin her kullanıcısına / grubuna tam kontrol (okuma + yazma + çalıştırma) veriyorsunuz. Dizinlere / dosyalara erişemeyen kullanıcılarınız / gruplarınız olduğunda sorunları çözmenin tembel bir yoludur.

Örneğin, bir dizinin içeriğini listeler ve şunu alırsanız:

-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so

preloadable_libintl.so , kullanıcı köküne ve grup köküne ait bir dosyadır. Sahibi okuma ve yazma erişimi, grup sadece okuma erişimine sahip ve herhangi bir diğer kullanıcı okuma erişimine sahiptir. Bu 644 olarak çevrilebilir.

777 olarak değiştirirsem şöyle görünecek:

-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so


7

Burada sorumu cevapladıktan ve sonuç hakkında biraz araştırma yaptıktan sonra her şeyi çok iyi açıklayan bir makale buldum. Gelecekteki referanslar için bu makalenin bazı bölümlerini burada paylaşmak istiyorum.

İzinleri görüntüleme

Kullanmak için chmodbir dosya veya dizinin izinlerini değiştirmek için, öncelikle erişimin geçerli mod ne olduğunu bilmek gerekir. Terminaldeki bir dizinin içeriğini cdo dizine göre görüntüleyebilir ve sonra kullanabilirsiniz:

$ ls -l

-lKullanarak çünkü anahtarı önemlidir lsonsuz sadece dizinde dosya veya klasörleri adlarını görüntüler.

Ana dizimde kullanma örneği aşağıda verilmiştir ls -l:

total 128
drwxr-xr-x 2 peter users  4096 Jul  5 21:03 Desktop
drwxr-xr-x 6 peter users  4096 Jul  5 17:37 Documents
drwxr-xr-x 2 peter users  4096 Jul  5 13:45 Downloads
drwxr-xr-x 2 peter users  4096 Jun 24 03:36 Movies
drwxr-xr-x 2 peter users  4096 Jun 24 03:38 Music
drwxr-xr-x 2 peter users  4096 Jun 26 00:09 Pictures
-rw-r--r-- 1 peter users   354 Jul  6 17:15 chmodtest

Sütunlar ne anlama geliyor?

İlk sütun her dosyanın türüdür:

  • - normal bir dosyayı belirtir.
  • d bir dizini, yani diğer dosyaları veya klasörleri içeren bir klasörü belirtir.
  • p adlandırılmış bir boruya (aka FIFO) işaret eder.
  • l sembolik bir bağlantıyı gösterir.

Bundan sonraki harfler izinlerdir, bu ilk sütun en çok ilgileneceğimiz şeydir. İkincisi, bir dosyada kaç tane bağlantı bulunduğunu, güvenle yok sayabileceğimizi gösterir. Üçüncü sütunun iki değeri / adı vardır: Birincisi (benim örneğimde 'peter'), dosyanın sahibi olan kullanıcının adıdır. İkinci değer (örnekte 'kullanıcılar'), sahibinin ait olduğu gruptur (Gruplar hakkında daha fazla bilgi edinin).

Bir sonraki sütun, dosya veya dizinin bayt cinsinden büyüklüğü ve bundan sonraki bilgiler, dosyanın veya dizinin en son değiştirildiği tarih ve saat ve elbette dosya veya dizinin adıdır.

İzinlerin anlamı

İlk üç harf, birinciden sonra -veya dsahibinin sahip olduğu izinlerdir. Sonraki üç harf gruba uygulanan izinlerdir. Son üç harf, herkes için geçerli olan izinlerdir.

Her üç harften oluşan küme r wve oluşur x. rdaima birinci konumda, wdaima ikinci konumda ve xdaima üçüncü konumdadır. rokuma izni, wyazma izni ve xyürütme iznidir. -Bu harflerden birinin yerine kısa çizgi ( ) varsa , izin verilmez ve harf varsa o zaman verilir.

Klasörler

Klasörlerde mod bitleri şöyle yorumlanabilir:

  • r (oku) verilen dizinin içindekiler tablosunu okuyabilme,
  • w(write) verilen dizinin içindekiler tablosunu yazabilme (yeni dosyalar, klasörler oluşturma; mevcut dosyaları, klasörleri yeniden adlandırma, silme) ve eğer yalnızca çalıştırma biti ayarlanmışsa (yaz) anlamına gelir. Aksi takdirde, bu izin anlamsızdır.
  • x (yürütme), verilen dizine cd komutuyla ve erişim dosyalarına, söz konusu dizindeki klasörlere girme yeteneğini ifade eder.

Chmod komutunu kullanarak izinleri değiştirme

chmodLinux ve diğer Unix benzeri işletim sistemlerinde bir komuttur. Bir dosya veya dizinin izinlerini (veya erişim modunu) değiştirmenize olanak sağlar.

İzinleri iki farklı şekilde değiştirebilirsiniz: - Metin tabanlı chmod - Sayı tabanlıchmod

Metin yöntemi

Bir dosyanın izinlerini veya erişim modlarını değiştirmek için, terminalde chmod komutunu kullanırız. Komutun genel yapısı aşağıdadır:

chmod who=permissions filename

Bir dizi harften herhangi birinin kim olduğu ve her biri kime izin vereceğinizi gösterir. Bunlar aşağıdaki gibidir:

u - The user that owns the file.
g - The group the file belongs to.
o - The other users i.e. everyone else.
a - all of the above - use this instead of having to type ugo.

Daha önce tarif edildiği gibi izinleri aynıdır ( r, wve x).

Chmod komutu, = yerine + veya - kullanarak varolan bir kümeden izinleri eklememize ve çıkarmamıza izin verir. Bu aslında izinleri yeniden yazmak yukarıdaki komutları, farklıdır (yani bir izni değiştirmeye r--için rw-hala eklemeleri gerektiğini ryanı sıra wsonra =içinde chmodkomuta. Eğer dışarı kaçırdıysanız r, bu uzak alacağını rolarak izin = ile kullanılırlar. + ve - kullanarak - şu anki izinler grubunu ekleyerek veya alarak bunları engelleyin).

Sayı yöntemi

chmod ayrıca sayıları kullanarak izinleri de ayarlayabilirsiniz.

Sayı kullanmak, üç sahibin, grubun ve diğerlerinin izinlerinin tümünü aynı anda düzenlemenizi sağlayan başka bir yöntemdir. Kodun bu temel yapısı şudur:

chmod xxx file/directory

Xxx, her bir basamağın 1 ila 7 arasında bir sayı olabileceği 3 basamaklı bir sayı olduğunda, ilk basamak sahibi izinlerine uygulanır, ikinci basamak grubun izinlerine uygulanır ve üçüncü basamak diğerlerinin izinlerine uygulanır.

Bu sayı notasyonunda, r, w ve x değerleri kendi sayı değerlerine sahiptir:

r=4
w=2
x=1

Üç basamaklı bir sayı bulmak için, sahip, grup ve kullanıcının hangi izinlere sahip olmasını istediğinizi düşünmeniz ve ardından değerlerini toplamalısınız. Örneğin, bir dizinin sahibine okuma-yazma ve yürütme izinlerini vermek istediğimi, gruplandırmayı ve diğer herkesin yalnızca okuma ve yürütme izinlerini almasını istediğimi söyleyin. Bunun gibi sayısal değerlerle karşılaşacaktım:

Owner: rwx = 4+2+1=7
Group: r-x = 4+0+1=5 (or just 4+1=5)
Other: r-x = 4+0+1=5 (or just 4+1=5)

Final number = 755

$ chmod 755 filename

Bu, aşağıdakileri kullanmanın eşdeğeridir:

chmod u=rwx filename
chmod go=rx filename

Çoğu klasör / dizin, sahibine okuma ve yazma ve yürütme izni verecek şekilde 755 olarak ayarlanmıştır, ancak herkese yazmayı reddeder ve dosyalar normalde 644'tür; Çalıştırılamayan dosyalar için x izinlerinin bulunmadığına dikkat edin - burada da aynı şey geçerli.


Sadece başka bir makaleden metin kopyalamak - en azından - kaba. Belki de bir telif hakkı ihlalidir. Yalnızca kopyalanmıyorsa veya gerçekten küçük parçalar kullandıysanız (adil kullanım nedeniyle telif hakkı dostu) lütfen en azından referans / alıntı yaptığınız makaleye bir bağlantı ekleyin.
Kilim

0

D sorular için

Bu size Unix dosya tipini bildirir. Varsayılan olarak Unix sadece 3 dosya tipine sahiptir. Onlar:

  • - - Düzenli dosya
  • d - Dizin dosyası
  • Özel dosya (5 alt tip ile):
    • b - Blok dosyası
    • c - Karakter cihaz dosyası
    • p - Adlandırılmış boru dosyası veya sadece boru dosyası
    • l - Sembolik bağlantı dosyası
    • s - Soket dosyası

Buradan daha fazla bilgi edinin: Linux / Unix'teki dosya türleri ayrıntılı olarak açıklandı

0777 vs 777

Yapışkan bit belirtildi veya belirtilmedi. Bir dizinin yapışkan biti ayarlandığında, dosya sistemi bu tür dizinlerdeki dosyaları özel bir şekilde ele alır; Yapışkan bit kümesi olmadan, dizinin yazma ve yürütme izinlerine sahip herhangi bir kullanıcı, dosyanın sahibinden bağımsız olarak, içerdiği dosyaları yeniden adlandırabilir veya silebilir.

0777 777 dosya izinlerini ve yapışkan bit'i 0'a ayarlar - özel mod yok.

777 Yapışkan bit'i değiştirmeden 777 dosya izni veriyor.

Devamını oku: yapışkan parça ve chmod


2
Daha iyi: ama yine de diğer cevapların henüz kapsamadığı hiçbir şey
sunmuyor

1
(1) Üç temel dosya tipi vardır: düz dosyalar, dizinler ve her şey. Ne? Bunu nereden alıyorsun? Şeylerin büyük şemasında, düz dosyalar ve dizinler oldukça benzerdir. Adlandırılmış kanallar ve sembolik bağlar, düz dosyalara ve dizinlere, cihaz dosyalarına veya soketlere nazaran daha benzerdir. (2) chmod 777Setuid, setgid ve yapışkan parçaları temizlemiyor mu sanıyorsun ? Dene.
G-Man

Unix 7 dosya tipine sahip, 3 değil.
wjandrea
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.