Rm neden farklı bir kullanıcının sahipliğinde bir dosyayı silmek için izin veriyor?


52

Görevinden Neden rm salt okunur dosyaları kaldırabilirim? Bunun rmsadece dosyayı silmek için dizine yazma izni gerektirdiğini biliyorum . Ancak, sahibi ve grubu farklı olan bir dosyayı kolayca silebileceğimiz davranışı sindirmeyi zor buluyorum.

Aşağıdakileri denedim

mtk: kullanıcı adım
abc: yeni bir kullanıcı oluşturdu

$ ls -l file
-rw-rw-r-- 1 mtk mtk       0 Aug 31 15:40 file
$ sudo chown abc file
$ sudo chgrp abc file
$ ls -l file
-rw-rw-r-- 1 abc abc       0 Aug 31 15:40 file
$ rm file
$ ls -l file
<deleted>

Buna izin verilmemesi gerektiğini düşünüyordum. Bir kullanıcı yalnızca sahipligi altındaki dosyaları silebilmeli mi? Birisi neden buna izin verildiğine ışık tutabilir mi? ve bundan kaçınmanın yolu nedir? Sürpriz dosya silmelerine izin vermek için yalnızca üst dizinin yazma iznini kısıtlamayı düşünebilirim.

Yanıtlar:


100

Buna izin verilmesinin nedeni, bir dosyayı kaldırmanın aslında yaptığı şeyle ilgilidir. Kavramsal olarak, rmişi bir dizinden bir isim girişi kaldırmaktır. Dosyanın tek adıysa ve dosyanın işgal ettiği alanın ve alanın bu noktada kurtarılabildiği durumlarda dosyanın erişilememesi gerçeği neredeyse tesadüfidir. Sistemin çağırdığı rmkomutun çağırdığı isim unlinkbu gerçeği bile öne sürmektedir .

Ve, bir isim girişini bir dizinden kaldırmak temelde bu dizindeki bir işlemdir , bu yüzden bu dizin yazma izniniz olması gereken şeydir.


Aşağıdaki senaryo daha rahat hissettirebilir mi? Diyelim ki dizinler var:

/home/me    # owned and writable only by me
/home/you   # owned and writable only by you

Ve bana ait olan ve iki sabit bağlantısı olan bir dosya var:

/home/me/myfile
/home/you/myfile

Bu zor bağlantının /home/you/myfileilk başta oraya nasıl geldiğini boşver . Belki rootoraya koy.

Bu örneğin fikri, sabit bağlantıyı kaldırmanıza izin verilmesi gerektiğidir /home/you/myfile. Sonuçta, doldurmasını oluyor senin dizin. İçinde ne olup olmadığını kontrol edebilmelisin /home/you. Ve kaldırdığınızda /home/you/myfile, dosyayı gerçekten silmemiş olduğunuza dikkat edin. Bunun için yalnızca bir bağlantı kaldırdınız.


Yapışkan bit bir dosya (olarak görünüyor içeren dizinde ayarlanırsa unutmayın tiçinde ls), o zaman do (eğer dizini kendi sürece) silmek için izin verilmesi amacıyla dosyanın sahibi olmak gerekir. Yapışkan bit genellikle ayarlanır /tmp.


6
Dizindeki yapışkan bit ile, dosyayı kaldırabilmeniz için dosyayı değiştirebilmeniz gerekir. Yani, dosya sizinle aynı gruptaki bir başkasına aitse ve grup dosyaya yazabiliyorsa, dosyayı kaldırabilirsiniz. Sonuç: herkes bir dosyayı herkese açık yazma izni ile kaldırabilir. (Tabi ki dizini değiştirebilecek tüm konulara tabidir.)
Jonathan Leffler, 31.05.15

1
Sizi yanlış yorumluyor olabilirim ama o zaman -rw-rw-rw- 1 root root 0 Sep 1 11:11 /tmp/foobenim normal kullanıcım olarak kaldırabileceğimi söylemiyorum değil mi /tmp? Yine de yapamam.
Celada

4
Bağlantıyı , kullanıcının (dosyanın sahibi olmayan kullanıcının) oluşturduğunu varsayıyorsanız me/ yousenaryosunun daha net odaklanacağına inanıyorum . Zamirler kullanmak zor; Diyelim ki Al yaratıyor /home/al/file1ve Bob'a erişimi yürüten (ve belki de okuyan) erişimi /home/alolan dosyaya sıkı sıkıya bağlı /home/bob/als_file. Bob bir bağlantı çıkarmadan önlenmelidir o diye yarattı?   Ve Al’ın /home/bob/als_fileyazma erişimi olmadığı zamanları silmesine izin vermeli /home/bobmi? Bu yol kaosa yol açar.
Scott

2
@JonathanLeffler: Scott'ın örneğinin gösterdiği gibi, hayır, bağlantıyı kesmek ve kesmek , oyunda sert bağlantılar olduğunda aynı net sonucu vermez .
Kevin

6
@Kevin bence asıl nokta, eğer biri dosyaya yazma izni varsa, içeriğini imha edebilirse, o zaman onun da bağlantısını kaldırabilir (ayrıca dizine yazma izni de varsayar). Konuşma geçerli değil - dosyayı bir dizinden kaldırabilmek, içeriği başka bir dizinden erişilebilir olabileceğinden imha etmesi gerektiği anlamına gelmez. Bu yapışkan bit nasıl çalıştığını arkasındaki mantık budur.
Barmar

9

Bir dosyayı kaldırmak için dosyanın bulunduğu dizine yazmanız yeterlidir.

Bundan hoşlanmıyorsanız, chmod +t diryakın zamandaki bir işletim sistemindeyseniz (bu özellik SunOS'ta 1986 civarında tanıtıldı) , "yapışkan" bit'i ayarlayabilirsiniz .

Daha iyi taneli olmayı seviyorsanız, ZFS gibi modern bir ACL uygulaması olan bir dosya sistemine ihtiyacınız var. NTFS'ye dayalı standart NFSv4 ACL'leri, kullanıcı başına dosyaya özel silme izinleri için destek ve dizinler için "delete_child" izni içerir.


9
tBit eklemek için dizine sahip olmanız gerektiğini unutmayın. Ve dizinin sahibiyseniz, tbitin ayarlanıp ayarlanmadığına bakmaksızın dosyaları her zaman kaldırabilirsiniz . Bir dosyayı bir başkasının dizinine bağlarsanız, başkasının kaldırması için hazırlıklı olmalısınız. Alternatif olarak, önce sizin alt dizininizi oluşturabilir ve bunun yerine dosyanızı ekleyebilir, çünkü sahibi boş değilse bu alt dizeyi kaldıramaz.
Stéphane Chazelas

6
Durumu yanıltıcı şekilde tarif edersiniz. Teknik olarak, bir dosya bir dizinde değil; bunun yerine, bir dosyanın adı dizinde rmbulunur ve dizinde bir işlem değildir, dosyada değil. Son başvuru kaldırıldığında bir dosya kaldırılıyor, ancak teknik olarak bu bir yan etki.
reinierpost

0

Mantık, bir evinki ile aynıdır: Ev sahibi veya kiracı, misafirlerin kime ait olduğu önemli değil, hangi misafirlerin atılacağına karar verir. Ayrıca, başka bir evde bulunan (başka birisinin dizininde başka bir bağlantıya sahip olan) tahliye edilen konuk, dışarıdaki ölüme donmayacaktır.

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.