Bagaimana cara menghapus direktori tidak kosong yang tidak dimiliki oleh pengguna di Linux?

10

Jika direktori "foo" dimiliki oleh pengguna A dan berisi direktori "bar", yang dimiliki oleh root, pengguna A dapat menghapusnya dengan rmdir, yang logis, karena "foo" dapat ditulis oleh pengguna A.

Tetapi jika direktori "bar" berisi file lain yang dimiliki root, direktori tidak dapat dihapus, karena file di dalamnya harus dihapus terlebih dahulu, sehingga menjadi kosong. Tapi "bar" itu sendiri tidak dapat ditulisi, jadi tidak mungkin untuk menghapus file di dalamnya.

Apakah ada jalan lain? Atau, yakinkan saya sebaliknya mengapa itu perlu.

Alex B
sumber

Jawaban:

7

Interpretasi 1: direktori adalah subruang dari sistem file. Ini dapat dibagi lagi menjadi sub-ruang dengan membuat subdirektori di dalamnya. Pemilik direktori fooharus memiliki kontrol atas segala sesuatu di dalam ruang bagian dalam: foo/bar, foo/bar/qux, dll

Interpretasi 2: direktori adalah subruang dari sistem file. Setiap direktori dilampirkan ke beberapa direktori lain, yang disebut induknya. Pemilik direktori foomemiliki kendali atas semua yang ada di dalam subruang; Namun, untuk subdirektori foo/bar, pemilik foomemiliki kendali atas apakah bardapat dilampirkan footetapi tidak atas apa yang masuk bar: hanya pemilik yang barmemiliki kendali atas itu.

Bukti yang mendukung interpretasi 2: seperti yang telah Anda catat, cara izin berfungsi. Juga, fakta bahwa beberapa sistem file Unix memungkinkan direktori untuk dilampirkan ke lebih dari satu induk: ini disebut memiliki banyak tautan keras. (Memiliki banyak tautan keras adalah hal yang umum untuk file biasa, tetapi biasanya tidak disarankan atau dilarang untuk direktori terutama karena risiko membuat loop, di mana direktori adalah kakek neneknya sendiri yang N kali dihapus - sehingga Anda tidak dapat mendapatkannya dari root direktori, yang merupakan ekspektasi yang sangat umum. Ada juga masalah apa yang harus dilakukan jika direktori memiliki 0 tautan keras tetapi tidak kosong: karena direktori tersebut tidak terikat, Anda ingin menghapusnya, tetapi apa yang Anda lakukan dengan isi?)

Bukti yang mendukung interpretasi 1: dalam praktiknya, direktori memiliki orang tua tunggal dan karenanya membentuk struktur pohon. Dan Anda tidak dapat mengakses foo/bar/quxkecuali jika Anda memiliki izin foojuga pada bar(juga, kecuali bahwa ada cara yang agak tidak jelas untuk diberi akses bartanpa diberi akses ke foo). Jadi level atas memang penting.

Pada catatan yang lebih praktis, dalam situasi Anda, pengguna A dapat melakukannya

sampah mkdir
mv foo / bar sampah /
rmdir foo
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Ini adalah jawaban yang bagus (rec'ed), tetapi ketidakkonsistenan yang tampak tetap membuat saya frustasi. Dan sementara contoh praktis memindahkan bar ke sampah berhasil, kami memiliki direktori bernama sampah yang tidak dapat dihapus. Saya punya masalah yang sama, kecuali bahwa itu adalah pengguna A dan pengguna B, di mana B terjebak sesuatu di direktori yang dimiliki oleh A, yang ingin dihapus A.
Paul Hooper
Ini adalah penjelasan yang baik, tetapi contoh di akhir menggunakan mvuntuk menghindari masalah tidak bekerja untuk saya di Raspbian (belum mencoba sistem lain). Selanjutnya, setelah meneliti masalah ini, saya belum melihat penggunaan mvsebagai solusi yang disebutkan di tempat lain. Memang, berdasarkan pemahaman saya tentang cara kerja izin, masuk akal bahwa mvgagal ketika saya mencobanya. Apakah saya melewatkan sesuatu? Atau apakah fungsi ini mungkin berubah? @Gilles @PaulHooper
fvgs
@ fvgs Tidak ada yang berubah, tetapi situasi Anda mungkin memiliki izin yang berbeda dari ini. Saya menyarankan Anda mengajukan pertanyaan baru (di Unix & Linux daripada Server Fault karena pertanyaan ini mungkin akan dianggap di luar topik jika ditanya di SF sekarang) dan berikan semua detail situasi Anda.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles Bisakah Anda mengarahkan saya ke beberapa dokumentasi, referensi, atau menyebutkan perilaku yang Anda uraikan mv? Saya dapat menggunakan mvuntuk mengganti nama direktori bar. Berarti mvberhasil selama saya tidak mencoba untuk memindahkan bilah di luar direktori saat ini atau ke direktori lain. Tetapi contoh yang Anda berikan (yang memindahkan bilah direktori) tidak berfungsi untuk saya (izin ditolak). Apakah contoh yang Anda berikan mengasumsikan kondisi spesifik selain yang ditentukan dalam pertanyaan?
fvgs
@ fvgs Contoh saya tidak memindahkan bardirektori, tetapi memindahkannya ke direktori yang Anda miliki. garbagebisa di mana saja di sistem file yang sama, tidak harus saudara kandung foo.
Gilles 'SANGAT berhenti menjadi jahat'
0

Satu-satunya cara untuk mengatasi hal ini adalah dengan menggunakan setgid atau setuid pada direktori induk atau menggunakan ACL.

Setel direktori setgid dengan

chmod g+s foo

Setel ACL default dengan

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

Ini menetapkannya sebagai ACL default di jalur ini. Anda harus memasang sistem file yang berisi lintasan ini dengan opsi acl!

Sekarang katakan padaku mengapa kamu pikir kamu menginginkan ini.

wzzrd
sumber
Masalahnya adalah konsistensi. Tidak ada yang menghentikan saya menghapus file atau direktori kosong yang dimiliki oleh pengguna lain di direktori yang saya miliki, tetapi jika itu tidak kosong, saya dikunci untuk menghapus direktori saya sendiri.
Alex B
Jika itu masalahnya, saya akan menggunakan salah satu opsi yang saya berikan. Mereka akan bekerja dengan baik untuk Anda.
wzzrd
Saya sering menggunakan banyak akun di desktop saya (salah satunya adalah akun "non-root utama"). Saya juga bisa mendapatkan situasi seperti itu ketika make installmulai dari root mulai membangun sesuatu.
Vi.
setgid pada direktori induk tidak membantu. Setelah dilakukan sebagai root cd ~user && mkdir qqq && touch qqq/qqqsaya tidak bisa menghilangkan qqq dari pengguna oleh chmod g+s .dan rm -Rf qqq.
Vi.
Mmh Itu mungkin masalah umask. Jika direktori Anda adalah 775, itu disetgid dan umask Anda adalah 0002, maka file dapat ditulis untuk grup dan karenanya dapat dilepas untuk Anda. Tapi, benar, itu tidak berfungsi dengan umask 0022 (yang sebagian besar adalah default). Seharusnya mengatakan itu. Sudahkah Anda menguji opsi acl?
wzzrd