Tại sao tôi không thể liệt kê một thư mục có quyền đọc?


14

Tôi đã tạo một thư mục dvà một tập tin fbên trong nó. Sau đó tôi chỉ cho phép mình đọc quyền trên thư mục đó. Tôi hiểu điều này có nghĩa là tôi có thể liệt kê các tệp (ví dụ ở đây ), nhưng tôi không thể.

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>

Nếu tôi thay đổi quyền để viết và thực thi, tôi có thể xem tệp.

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

Tại sao lại thế này? Tôi đang sử dụng MacOS.

Chỉnh sửa: với tham chiếu đến câu trả lời của @ ccorn, có liên quan rằng tôi đang sử dụng cá và type lsđưa ra những điều sau:

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

Bản sao không trả lời câu hỏi. Nó ngụ ý rằng bạn có thể làm điều mà tôi chứng minh là bạn không thể. Câu trả lời của @ ccorn là hoàn hảo.
wrgrs

Wow, điều Cá là một phần khá quan trọng của (thông tin ban đầu) còn thiếu.
Stephen Kitt

Vâng, bạn đã đúng, tôi nên thêm nó, nhưng có vẻ như điều tương tự sẽ xảy ra trong bash nếu bạn alias ls='ls -G', điều mà tôi nghĩ nhiều người làm.
wrgrs

Có cho tôi. Bạn có trên MacOS không? Có lẽ có một câu hỏi khác ở đây. Chỉnh sửa: vâng, tôi có hành vi khác nhau trên Linux.
wrgrs

Câu trả lời:


8

Một số chuẩn bị, chỉ để đảm bảo rằng lskhông thử nhiều thứ hơn mức cần thiết:

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

Trình diễn quyền của rthư mục:

$ 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

Trong các hệ thống tập tin Unix truyền thống, một thư mục chỉ đơn giản là một danh sách các cặp (tên, số inode). Số inode là một số nguyên được sử dụng làm chỉ mục vào bảng inode của hệ thống tệp nơi phần còn lại của siêu dữ liệu tệp được lưu trữ.

Quyền rtrên một thư mục cho phép liệt kê các tên trong đó, nhưng không truy cập vào thông tin được lưu trong bảng inode, nghĩa là lấy loại tệp, độ dài tệp, quyền tệp, v.v. hoặc mở tệp. Cho rằng bạn cần sự xcho phép trên thư mục.

Đây là lý do tại sao ls -l, ls -F, lsvới sản lượng mã màu vv thất bại mà không cần xsự cho phép, trong khi một chỉ lsthành công.

Chỉ xriêng quyền cho phép truy cập inode, nghĩa là được đặt tên rõ ràng trong thư mục đó, xcho phép tra cứu inode của nó và truy cập siêu dữ liệu của mục nhập thư mục đó:

$ 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

Vì vậy, để mở một tập tin /a/b/c/fhoặc danh sách siêu dữ liệu của nó, các thư mục /, /a, /a/b, và /a/b/cphải được cấp xphép.

Không có gì đáng ngạc nhiên, việc tạo các mục thư mục cần cả hai wxquyền:

$ 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 có một tổng quan ngắn gọn trong một bài viết về quyền hệ thống tập tin .


Kinh ngạc. /bin/ls dhiển thị nội dung cho tôi Cảm ơn!
wrgrs

OK, do đó, đây là một vấn đề xác định lại (với -Gđầu ra được tô màu, cần siêu dữ liệu, do đó cho phép x). Vì vậy, sự chuẩn bị của tôi với unalias lsunset CLICOLOR. Tôi nên đã thêm unset -f lsđể loại bỏ bất kỳ định nghĩa chức năng như vậy là tốt. Đã chỉnh sửa.
ccorn


4

Để đọc một thư mục bạn cũng cần có khả năng duyệt qua nó (bit x). Vì vậy, tối thiểu bạn cần rx cho một thư mục để có thể truy cập nó theo bất kỳ cách nào.


2
Không, bạn không; lsvẫn có thể liệt kê các tệp trong thư mục, ngay cả khi thư mục không thể thực thi được.
Stephen Kitt

Bạn có thể để lại quyền đọc. Sau đó, bạn sẽ có thể truy cập các tệp nhưng không liệt kê nội dung của thư mục.
Kusalananda

@Kusalananda - điểm tốt, thực sự tôi sử dụng điều này theo thời gian.
Soruk

@Stephen Kitt - Có thể nó NÊN, nhưng việc thực hiện là không.
Soruk

1
@Soruk và vì vậy câu hỏi vẫn còn: tại sao không?
Stephen Kitt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.