Mengapa saya tidak bisa mendaftar direktori dengan izin baca?

14

Saya membuat direktori ddan file fdi dalamnya. Saya kemudian memberi diri saya hanya membaca izin pada direktori itu. Saya mengerti ini seharusnya berarti saya dapat membuat daftar file (misalnya di sini ), tetapi saya tidak bisa.

will@wrmpb /p/t/permissions> ls -al
total 0
drwxr-xr-x   3 will  wheel  102  4 Oct 08:30 .
drwxrwxrwt  16 root  wheel  544  4 Oct 08:30 ..
dr--------   3 will  wheel  102  4 Oct 08:42 d
will@wrmpb /p/t/permissions> ls d
will@wrmpb /p/t/permissions>

Jika saya mengubah izin untuk menulis dan mengeksekusi, saya dapat melihat file.

will@wrmpb /p/t/permissions> chmod 500 d
will@wrmpb /p/t/permissions> ls d
f
will@wrmpb /p/t/permissions> 

Kenapa ini? Saya menggunakan MacOS.

Sunting: dengan mengacu pada jawaban @ ccorn, relevan bahwa saya menggunakan ikan dan type lsmemberikan yang berikut:

will@wrmpb /p/t/permissions> type ls
ls is a function with definition
function ls --description 'List contents of directory'
    command ls -G $argv
end
wrgrs
sumber
Duplikat tidak menjawab pertanyaan. Ini menyiratkan bahwa Anda dapat melakukan hal yang saya tunjukkan tidak dapat Anda lakukan. @ ccorn jawabannya sempurna.
wrgrs
Wow, masalah Ikan adalah bagian yang agak penting dari (awalnya) informasi yang hilang.
Stephen Kitt
Ya Anda benar, saya seharusnya menambahkannya, tetapi sepertinya hal yang sama akan terjadi di bash jika Anda alias ls='ls -G', yang saya pikir banyak orang lakukan.
wrgrs
Apakah untuk saya. Apakah Anda menggunakan MacOS? Mungkin ada pertanyaan lain di sini. Sunting: ya, saya mendapatkan perilaku yang berbeda di Linux.
wrgrs

Jawaban:

8

Beberapa persiapan, hanya untuk memastikan bahwa lstidak mencoba lebih banyak hal daripada yang seharusnya:

$ unalias ls 2>/dev/null
$ unset -f ls
$ unset CLICOLOR

Demonstrasi rizin direktori:

$ ls -ld d
dr--------  3 ccorn  ccorn  102  4 Okt 14:35 d
$ ls d
f
$ ls -l d
ls: f: Permission denied
$ ls -F d
ls: f: Permission denied

Dalam sistem file Unix tradisional, direktori hanyalah daftar pasangan (nama, nomor inode). Nomor inode adalah integer yang digunakan sebagai indeks ke dalam tabel inode filesystem tempat sisa file metadata disimpan.

The rizin pada direktori memungkinkan untuk daftar nama-nama di dalamnya, tetapi tidak untuk mengakses informasi yang tersimpan dalam tabel inode, yaitu, mendapatkan jenis file, panjang file, hak akses file dll, atau membuka file. Untuk itu Anda memerlukan xizin pada direktori.

Inilah sebabnya mengapa ls -l, ls -F, lsdengan output kode warna dll gagal tanpa xizin, sedangkan hanya lsberhasil.

The xizin saja memungkinkan akses inode, yang, diberi nama eksplisit dalam direktori tersebut, xmemungkinkan untuk mencari inode dan akses yang metadata direktori entri:

$ chmod 100 d
$ ls -l d/f
-rw-r--r--  1 ccorn  ccorn  0  4 Okt 14:35 d/f
$ ls d
ls: d: Permission denied

Oleh karena itu, untuk membuka file /a/b/c/fatau daftar metadata-nya, direktori /, /a, /a/b, dan /a/b/charus diberikan xizin.

Tidak mengherankan, membuat entri direktori memerlukan keduanya wdan xizin:

$ chmod 100 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 200 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 300 d
$ touch d/g
$

Wikipedia memiliki ikhtisar singkat dalam sebuah artikel tentang izin sistem file .

ccorn
sumber
Luar biasa. /bin/ls dmenunjukkan isinya untuk saya. Terima kasih!
wrgrs
OK, jadi itu masalah redefinisi (dengan -Guntuk keluaran berwarna, yang membutuhkan metadata, sehingga xperms). Karena itu persiapan saya dengan unalias lsdan unset CLICOLOR. Saya seharusnya menambahkan unset -f lsuntuk menghapus definisi fungsi seperti itu juga. Diedit.
ccorn
4

Untuk membaca direktori, Anda juga harus dapat melintasinya (x bit). Jadi, paling tidak Anda perlu rx agar direktori dapat mengaksesnya dengan cara apa pun.

Soruk
sumber
2
Tidak, kamu tidak; lsseharusnya masih dapat membuat daftar file dalam direktori, bahkan jika direktori tidak dapat dieksekusi.
Stephen Kitt
Anda dapat menonaktifkan izin baca. Anda kemudian akan dapat mengakses file tetapi tidak untuk daftar isi direktori.
Kusalananda
@ Kusalananda - poin bagus, memang saya menggunakan ini dari waktu ke waktu.
Soruk
@Stephen Kitt - Mungkin HARUS, tetapi implementasinya tidak.
Soruk
1
@ Koruk dan pertanyaannya tetap: mengapa tidak?
Stephen Kitt