Rm neden salt okunur dosyaları kaldırabilir?


91

Bir dosya oluşturup izinlerini 444(salt okunur) olarak değiştirirsem, neden bu dosyayı rmkaldırabilirim?

Bunu yaparsam:

echo test > test.txt
chmod 444 test.txt
rm test.txt

... rmyazmaya karşı korumalı dosyayı kaldırmak isteyip istemediğimi soracak test.txt. Bunu umuyordum rmböyle bir dosyayı kaldıramazsınız ve ben yapmak zorunda kalacağını chmod +w test.txtilk. Ben yaparsanız rm -f test.txto zaman rmo salt okunur oluyor rağmen bile sormadan dosyayı kaldıracaktır.

Birileri netleşebilir mi? Ubuntu 12.04 / bash kullanıyorum.


Açıklama: Bu komutları root olarak değil normal kullanıcı olarak çalıştırıyorum.
Magnus

Yanıtlar:


104

Tüm rmihtiyaçlar ana dizinde yazma + yürütme iznidir. Dosyanın kendisinin izinleri ilgisizdir.

İşte izinler modelini benden daha net bir şekilde açıklayan bir referans :

Bir dosyanın verilerine erişme denemesi okuma izni gerektirir. Bir dosyanın verilerini değiştirme denemesi, yazma izni gerektirir. Bir dosyayı çalıştırma denemesi (bir program veya bir komut dosyası) yürütme izni gerektirir ...

Dizinler normal dosyalarla aynı şekilde kullanılmadığından, izinler biraz (ancak yalnızca biraz) farklı şekilde çalışır. Dosyaları bir dizinde listeleme girişimi, dizin içindeki okuma izinlerini gerektirir, ancak içindeki dosyaları içermez. Bir dizine dosya ekleme, bir dizinden bir dosyayı silme veya bir dosyayı yeniden adlandırma girişimi, dizinin tümü için yazma izni gerektirir, ancak (belki de şaşırtıcı şekilde) içindeki dosyalar için değil. Yürütme izni dizinlere uygulanmaz (bir dizin de program olamaz). Ancak bu izin biti, dizinler için başka amaçlar için tekrar kullanılır.

Bir dizinde içine cd yazabilmek için yürütme izni gerekir (yani, bir dizini geçerli çalışma dizininiz yapmak için).

İçindeki dosyaların "inode" bilgilerine erişmek için bir dizinde yürütme gereklidir. İçindeki dosyaların inode'larını okumak için bir dizinde arama yapmak için buna ihtiyacınız var. Bu nedenle, bir dizindeki yürütme iznine genellikle bunun yerine arama izni denir.


2
Öyleyse, chmod olmadan bazı dosyaların silinemediği / değiştirilemediği, ancak diğerlerinin özgürce yazılabilir olduğu bir dizin oluşturmak isteseydim, bu imkansız olurdu? 555 dizini chmod yapmak zorunda kalacağım ki bu, dizinde hiçbir dosyanın oluşturulamadığı veya değiştirilemediği anlamına gelir.
Magnus

3
@Magnus - Elbette, salt okunur dizinde yazılabilir bir çocuk dizini oluşturmanızı ve yazılabilir dosyalarınızı içinde saklamanızı engelleyen hiçbir şey yok. Alt dizinin kendisi silinemez, ancak içerikleri silinebilir.
ire_and_curses

7
Bir dizini yapışkan yapamazsınız, +tböylece insanlar dizine yazma erişimi olsa bile, o dizindeki dosyaları değiştiremez veya kaldıramazlar mı?
Shadur

3
@Magnus Kök erişiminiz varsa (sudo dahil), chattrdeğişken bayrağı bayraklara eklemek için kullanabilirsiniz . Değilse, o zaman ire_and_curses oldukça doğru.
James O'Gorman 19:12

6
Rm -f'yi kullanmamak sadece ayık olduğum sürece çalışır ... artı, yazdığım gerizekalı basık betiklerin ne yapabileceği veya yapamayacağı hakkında hiçbir fikrim yok
Magnus

53

Tamam, ire_and_curses hakkındaki yorumunuza göre, gerçekten yapmak istediğiniz şey bazı dosyaları değiştirilemez hale getirmektir. Bunu chattrkomutla yapabilirsiniz. Örneğin:

Örneğin

$ cd /tmp
$ touch immutable-file
$ sudo chattr +i immutable-file

$ rm -f immutable-file
rm: remove write-protected regular empty file `immutable-file'? y
rm: cannot remove `immutable-file': Operation not permitted

$ mv immutable-file someothername
mv: cannot move `immutable-file' to `someothername': Operation not permitted

$ echo foo > immutable-file 
-bash: immutable-file: Permission denied

Değişmez bir dosyaya hiçbir şey yapamazsınız - onu silemez, düzenleyemez, üzerine yazamaz, yeniden adlandırabilir, chmod veya chown veya başka bir şey yapamazsınız. Onunla yapabileceğiniz tek şey (unix izinleri izin veriyorsa) ve (root olarak) chattr -ideğişmeyen biti kaldırmaktır.

Tüm dosya sistemleri tüm özellikleri desteklemez. Değişmez AFAIK, tüm yaygın linux dosya sistemleri tarafından desteklenir (ext2 / 3/4 ve xfs dahil. Zfsonlinux şu anda özellikleri desteklememektedir)


3
bu arada yararlıdır. btw, root bile değişmez bir dosyayı değiştiremez veya silemez (önce değişmez niteliği çıkarmadan). Ayrıca btw, lsattröznitelikleri listelemek için kullanın .
kas

2
+1 - Nitelikleri unutmuştum ve bunun rmbenim
başıma gelmediği

2
Bu dosya sistemine özgüdür ve bu size çözdüğü daha fazla sorun getirebilir.
Stéphane Gimenez 19:12

4
@Magnus: Olası sorunlar arasında yedekleme (tüm yedekleme yardımcı programları öznitelikleri yedeklemeyecek - gerçekte çoğu olmaz) ve geri yükleme de dahil (geri dönüşümlü bir dosya içeren bir dizine geri yüklüyorsanız, bazı programlar bu dosyanın üzerine yazma yeteneğini değerlendirir) ölümcül bir hata ve iptal etme). Ayrıca, bir dosyayı değişmez yaptığınızı unutursanız ve neden silemediğinizi çözemediğinizi unutursanız, kendinize karışıklığa neden olabilirsiniz. 'İşlem izin verilmez' hata mesajı, bazı dosya sistemlerinde gördüğünüz aynı hata mesajıdır . potansiyel olarak tehlikeli aşırı reaksiyona yol açabilecek yolsuzluk.
kas

1
Sen edebilirsiniz (cp) değişmez bir dosyayı kopyalamak.
Ahtapot

0

Bu sorunun bir cevabı bir dosyayı sadece writeizinsiz olması durumunda dizinden silebileceğinizi iddia eder ! sadece dene! Bir dizine sadece writeizin verin ve silmeyi deneyin, yapamazsınız!
Eğer ikisine de ihtiyacım bir dizinin içinde bir dosyayı silmek için writeve executedizinde izni

Şimdi soruya geri dönelim: rmsizi kullanarak bir dosyayı silmek , sadece inode bilgilerini dizinden kaldırıyor, yani shreddingdiskten değilsiniz . Dosyanın inode bilgileri dizinde değilse, erişemezsiniz (ayrıca, ana dizinde listelenmediğinden göremezsiniz), yani sizin için silinir .
Böylece bir dizinden bir dosyayı silmek için dizinde izin verilir; bu dosyadaki izinler önemli değil

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.