Linux'ta kullanıcının sahip olmadığı boş olmayan bir dizin nasıl kaldırılır?


10

"Foo" dizini A kullanıcısına aitse ve root'a ait bir "bar" dizini içeriyorsa rmdir, "foo" A kullanıcısı tarafından yazılabilir olduğundan, A kullanıcısı basitçe kaldırabilir .

Ancak "bar" dizini başka bir kök sahibi dosya içeriyorsa, dizin kaldırılamaz, çünkü içindeki dosyaların önce kaldırılması gerekir, bu nedenle boş olur. Ancak "bar" ın kendisi yazılabilir değildir, bu nedenle içindeki dosyaları kaldırmak mümkün değildir.

etrafında yol var mı? Ya da beni neden gerekli olduğuna ikna et.

Yanıtlar:


7

Yorum 1: Bir dizin, dosya sisteminin bir alt uzayıdır. İçinde alt dizinler oluşturarak alt alanlara da alt bölümlere ayrılabilir. Dizinin sahibinin fooaltuzaydan içindeki her şey üzerinde kontrol sahibi olmalıdır: foo/bar, foo/bar/quxvb

Yorum 2: bir dizin, dosya sisteminin bir alt uzayıdır. Her dizin, üst dizini adı verilen başka bir dizine eklenir. Dizinin sahibi fooaltuzay içindeki her şeyi kontrol edebilir; bununla birlikte, bir alt dizin foo/bariçin sahibinin fooeklenip bareklenemeyeceği, fooancak içeriye girilip geçmeyeceği üzerinde kontrolü vardır bar: sadece sahibinin barbunun kontrolü vardır.

Yorum 2 lehine kanıt: belirttiğiniz gibi, izinlerin çalışma şekli. Ayrıca, bazı Unix dosya sistemlerinin bir dizinin birden fazla üst öğeye eklenmesine izin vermesi: buna birden çok sabit bağlantı denir. (Düzenli dosyalar için birden çok sabit bağlantıya sahip olmak yaygındır, ancak genellikle dizinin kendi büyükbaba veya büyükanne N kez kaldırıldığı döngüler oluşturma riski nedeniyle genellikle cesaret kırılır veya yasaklanır - böylece kökten erişemezsiniz. Bir dizin 0 sabit bağlantıya sahip ancak boş değilse ne yapacağınız sorunu da vardır: dizin eklenmemiş olduğundan silmek istersiniz, ancak onunla ne yaparsınız? içindekiler?)

Yorum 1 lehine kanıt: Uygulamada, dizinlerin tek bir ebeveyni vardır ve bu nedenle bir ağaç yapısı oluştururlar. Ve erişemiyor foo/bar/quxüzerinde yürütme iznine sahip olmadıkça foosıra sıra bar(iyi, erişim verilecek biraz karanlık yolları olduğunu haricinde barerişim hakkı olmadan foo). Üst seviyeler önemlidir.

Daha pratik bir notta, sizin durumunuzda A kullanıcısı

mkdir çöp
mv foo / bar çöpü /
rmdir foo

1
Bu harika bir cevap (geri alındı), ancak görünen tutarsızlık beni rahatsız ediyor. Çubuğu çöpe taşımanın pratik örneği işe yarasa da, çöp olarak adlandırılamayan bir dizine bırakılıyoruz. Bu aynı sorunu var, ancak A kullanıcısı ve B kullanıcısı, B'nin A'nın kaldırmak istediği A'nın sahip olduğu bir dizine bir şey takması dışında.
Paul Hooper

Bu iyi bir açıklama, ancak sonunda mvsorunu aşmak için kullanılan örnek Raspbian'da benim için çalışmıyor (başka hiçbir sistemde denemedim). Dahası, bu sorunu araştırdıktan sonra, mvbaşka hiçbir yerde bahsedilen bir çözüm olarak kullanıldığını görmedim . Gerçekten, izinlerin nasıl çalıştığına dair anlayışım temelinde, mvdenediğimde başarısız olmanın anlamı var. Bir şey mi kaçırıyorum? Yoksa bu işlev belki de değişti mi? @Gilles @PaulHooper
fvgs

@fvgs Hiçbir şey değişmedi, ancak durumunuz bundan farklı izinlere sahip olabilir. Yeni bir soru sormanızı öneririm ( bu soru şimdi SF'de sorulmuşsa muhtemelen konu dışı olarak düşünüleceğinden Sunucu Hatası yerine Unix ve Linux'ta ) ve durumunuzun tüm ayrıntılarını vermenizi öneririz.
Gilles 'SO- kötü olmayı bırak'

@Gilles Lütfen tarif ettiğiniz davranışla ilgili bazı belgelere, referanslara veya sözlere işaret edebilir misiniz mv? mvBar dizinini yeniden adlandırmak için kullanabiliyorum . Bunun anlamı, mvsürece ben geçerli dizinin veya başka bir dizine çubuğu dışında hareket etmeye kalkma olarak başarılı olur. Ancak verdiğiniz örnek (bir dizini yukarı doğru hareket ettirir) benim için çalışmıyor (izin reddedildi). Verdiğiniz örnek, soruda belirtilenler dışındaki belirli koşulları varsayar mı?
fvgs

@fvgs Örneğim barbir dizini yukarı taşımaz , sahibi olduğunuz bir dizine taşır. garbageaynı dosya sisteminde herhangi bir yerde olabilir, bir kardeş olması gerekmez foo.
Gilles 'SO- kötü olmayı bırak'

0

Bunun tek yolu, üst dizinde bir setgid veya setuid kullanmak veya bir ACL kullanmaktır.

Setgid dizinini

chmod g+s foo

Üzerinde varsayılan bir EKL ayarlayın

setfacl -d -R -m g:group:rwx foo

Bu, bu yolu varsayılan ACL olarak ayarlar. Bu yolu içeren dosya sistemini acl seçeneğiyle bağlamanız gerekir!

Şimdi bana bunu neden istediğini söyle.


Sorun, tutarlılık. Hiçbir şey, sahip olduğum bir dizindeki başka bir kullanıcının sahip olduğu bir dosyayı veya boş bir dizini silmemi engellemiyor, ancak boş değilse, kendi dizinimi silmem için kilitliyim.
Alex B

Bu durumda, sağladığım seçeneklerden birini kullanırdım. Sizin için iyi çalışırlar.
wzzrd

Sık sık masaüstümde birden fazla hesap kullanıyorum (bunlardan biri "kök olmayan" hesap). make installKökten bir şeyler inşa etmeye başladığında da böyle bir durum elde edebilirim .
Vi.

Üst dizindeki setgid yardımcı olmaz. Root olarak yapılması Sonra cd ~user && mkdir qqq && touch qqq/qqqben kullanıcıdan tarafından qqq'ait kurtulmak edemez chmod g+s .ve rm -Rf qqq.
Vi.

Mmh. Muhtemelen o zaman umask bir mesele. Dizininiz 775 ise, setgid ve umask değeriniz 0002 ise, dosyalar grup için yazılabilir ve bu nedenle sizin için çıkarılabilir. Ancak, doğru, umask 0022 (çoğunlukla varsayılan) ile çalışmaz. Bunu söylemeliydim. ACL seçeneğini test ettiniz mi?
wzzrd
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.