Saya memiliki folder dengan -wx
izin yang dipanggil folder1
dan folder lain di dalamnya disebut folder2
dengan rwx
izin.
Saya mencoba menghapus folder1
menggunakan perintah ini:
rm -r folder1
Tapi saya mendapat kesalahan berikut:
rm: cannot remove 'folder1': Permission denied
Alasan saya pikir saya mendapatkan kesalahan ini adalah karena rm
program harus terlebih dahulu mendapatkan konten folder1
(dapatkan nama file dan folder di dalamnya folder1
) agar dapat menghapus konten itu (karena Anda tidak dapat menghapus file) atau folder tanpa mengetahui namanya saya pikir), dan kemudian rm
program dapat menghapus folder1
sendiri.
Tetapi karena folder1
tidak memiliki read
izin, maka rm
program tidak bisa mendapatkan kontennya, dan karenanya tidak bisa menghapus kontennya, dan karena tidak bisa menghapus kontennya, maka tidak bisa menghapus kontennya.
Apakah saya benar?
sumber
Jawaban:
Saya pikir analisis Anda benar: Anda tidak dapat menghapus direktori karena tidak kosong, dan Anda tidak dapat mengosongkannya karena Anda tidak dapat melihat isinya.
Saya baru saja mencobanya:
Ketika saya menulis "Anda", saya maksudkan program apa pun yang Anda jalankan.
rm -r
Perintah Anda pertama-tama melihat itufolder1
adalah direktori, jadi ia mencoba menemukan isinya untuk mengosongkannya, tetapi gagal karena izin baca yang hilang, kemudian mencoba untuk menghapusnya tetapi gagal karena tidak kosong. "Izin ditolak" menyesatkan; Saya pikir "Direktori tidak kosong" (sepertirmdir
laporan) akan lebih sesuai.)sumber
Directory not empty
dalam kasus ini karena tidak akan tahu itu kosong atau tidak. Anda masih akan mendapatkan kesalahan yang sama ketika mencoba menghapus direktori kosong yang belum Anda baca izinnya. (Juga, tolong abaikan komentar saya sebelumnya, saya tidak punya topi berpikir saya pada).rmdir
mampu melaporkan "Direktori tidak kosong". Dan jika Anda membaca tes saya, Anda akan melihat bahwa itu menerima untuk menghapusfolder1
direktori, tanpa izin baca , setelah saya mengosongkannya.Permission denied
ketika mencobarm -r folder1
ketika itu kosong. Saya menggunakan OpenBSD, bukan Linux.-r
digunakan, setiap entri direktori (kecuali untuk.
dan..
) harus dihapus seolah-olah mereka adalah operan filerm -r
. Tampaknya seolah-olah GNUrm
hanya melakukanrmdir()
pada direktori jika itu tidak dapat dibaca, karena itu tidak akan memiliki cara untuk mendapatkan isinya.Agar penghapusan terjadi, sistem harus dapat membaca konten dan mengidentifikasi apa yang harus dihapus.
Saya sudah mencoba mensimulasikan apa yang Anda coba:
Jika kami mencoba menghapus tanpa izin baca itu gagal:
Dalam strace untuk dua upaya perbedaannya adalah bahwa isi direktori tidak dapat dibaca (getdents):
Dengan izin baca:
Untuk menyimpulkan bahkan jika Anda memiliki direktori dan memiliki bit yang dapat dieksekusi, Anda masih perlu izin baca sehingga Anda dapat melihat isinya dan menghapus folder. Ini tidak sama untuk sebuah file.
sumber
Yah, saya tidak punya reputasi yang cukup untuk mengomentari jawaban oleh ttaran7, jadi sepertinya itu adalah jawaban. Pilihan saya juga tidak dapat dilihat oleh publik, karena reputasi yang rendah. Saya memilih jawaban itu untuk benar-benar menyertakan jejak panggilan sistem, bukan hanya spekulasi.
Untuk menjawab pertanyaan OP: Ya, alasan Anda benar: Anda diblokir karena gagal membaca direktori
Saya menjalankan jejak yang sama dengan apa yang telah mereka (ttaran7) lakukan karena saya curiga alasan yang sama:
rm
Panggilan akan gagal setelah gagal membaca direktori dan itu akan menjadi akhir dari itu, tidak ada kesempatan untuk mengeluh tentang direktori yang kosong. Setelah melihat kedua jejak yang saya ambil, saya perhatikan bahwa panggilan sistem dibuat untuk mencoba memutuskan tautan nama file yang disediakan:Lihatlah baris ke-4:
unlinkat
... yang gagal karena direktori TIDAK kosong. Sekarang itulah yang saya anggap sebagai perilaku tak terduga, faktanya ia mencoba menghapus direktori sama sekali, meski tidak memiliki izin baca.sumber