Truy cập tập tin trong một thư mục mà không có sự cho phép x?


19

Tôi có một chút rắc rối để hiểu quyền thực thi nghĩa là gì đối với các thư mục. Tôi có hiểu chính xác rằng mọi thứ trong thư mục mà người dùng không có quyền x đều không thể truy cập được ngay cả khi những thứ trong thư mục cung cấp quyền cụ thể cho người dùng không?

Hoặc người dùng sẽ vẫn có quyền truy cập trực tiếp vào những thứ trong thư mục, nhưng đơn giản là không thể liệt kê những gì trong thư mục?

(Điều tôi thực sự cố gắng hiểu là mức độ an toàn của một thư mục khỏi sự truy cập từ những người dùng khác nếu họ không có quyền x cho nó.)

Câu trả lời:


20

x bit cho thư mục cũng được gọi là bit tìm kiếm. Trên thực tế, nó cho phép bạn truy cập vào các nút của các tệp được liệt kê trong thư mục. Vì vậy, nếu bạn muốn truy cập /home/user/foo/bar.txt thì bạn phải có quyền truy cập tìm kiếm trên mọi tổ tiên của bar.txt

Trích dẫn từ trang

Vì các thư mục không được sử dụng giống như các tệp thông thường, các quyền hoạt động hơi (nhưng chỉ một chút) khác nhau. Một nỗ lực để liệt kê các tệp trong một thư mục yêu cầu quyền đọc cho thư mục, nhưng không phải trên các tệp trong đó. Một nỗ lực để thêm một tập tin vào một thư mục, xóa một tập tin từ một thư mục hoặc để đổi tên một tập tin, tất cả đều yêu cầu quyền ghi cho thư mục, nhưng (có lẽ đáng ngạc nhiên) không cho các tập tin trong. Thực thi quyền không áp dụng cho các thư mục (một thư mục cũng không thể là một chương trình). Nhưng bit quyền đó được sử dụng lại cho các thư mục cho các mục đích khác.

Thực thi quyền là cần thiết trên một thư mục để có thể cd vào nó (nghĩa là để làm cho một số thư mục thư mục làm việc hiện tại của bạn).

Thực thi là cần thiết trên một thư mục để truy cập thông tin inode của các tập tin trong. Bạn cần điều này để tìm kiếm một thư mục để đọc các nút của các tệp trong đó. Vì lý do này, quyền thực thi trên một thư mục thường được gọi là quyền tìm kiếm thay thế.

Sự cho phép tìm kiếm là cần thiết trong nhiều tình huống phổ biến. Hãy xem xét lệnh cat / home / user / foo. Lệnh này rõ ràng yêu cầu quyền đọc cho tệp foo. Nhưng trừ khi bạn có quyền tìm kiếm trên các thư mục /, / home và / home / user, mèo không thể xác định vị trí inode của foo và do đó không thể đọc được! Bạn cần có quyền tìm kiếm trên mọi thư mục tổ tiên để truy cập vào nút của bất kỳ tệp (hoặc thư mục) nào và bạn không thể đọc tệp trừ khi bạn có thể truy cập vào nút của nó.

Xin vui lòng đọc thêm tại phần thư mục quyền.

Cập nhật: Leo đưa ra một câu hỏi rất hay. Nếu chúng ta biết inode thì chúng ta có thể truy cập một tệp từ một thư mục có x bit không được đặt không? Tôi tin rằng, chúng ta không thể làm như vậy. Tôi đã không kiểm tra nó bằng chương trình c mà chỉ sử dụng một số lệnh bash tiện dụng để xác nhận nó.

user@user-desktop:~/test$ ls -lart
total 12
drwxr-xr-x 49 user user 4096 2011-11-30 22:37 ..
drwxr-xr-x  3 user user 4096 2011-11-30 22:37 .
drwxr-xr-x  2 user user 4096 2011-11-30 22:38 level1
user@user-desktop:~/test$ ls -lart level1/
total 12
drwxr-xr-x 3 user user 4096 2011-11-30 22:37 ..
drwxr-xr-x 2 user user 4096 2011-11-30 22:38 .
-rw-r--r-- 1 user user    8 2011-11-30 22:38 file1
user@user-desktop:~/test$ stat level1
  File: `level1'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 808h/2056d  Inode: 95494       Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
Access: 2011-11-30 22:46:16.576702105 +0530
Modify: 2011-11-30 22:38:12.386701913 +0530
Change: 2011-11-30 22:46:08.876702102 +0530
user@user-desktop:~/test$ stat level1/file1 
  File: `level1/file1'
  Size: 8           Blocks: 8          IO Block: 4096   regular file
Device: 808h/2056d  Inode: 60775       Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
Access: 2011-11-30 22:38:19.846701917 +0530
Modify: 2011-11-30 22:38:16.366701915 +0530
Change: 2011-11-30 22:38:16.366701915 +0530
user@user-desktop:~/test$ chmod -x level1
user@user-desktop:~/test$ stat level1/file1 
stat: cannot stat `level1/file1': Permission denied
user@user-desktop:~/test$ ls -lart level1/
ls: cannot access level1/..: Permission denied
ls: cannot access level1/.: Permission denied
ls: cannot access level1/file1: Permission denied
total 0
-????????? ? ? ? ?                ? file1
d????????? ? ? ? ?                ? ..
d????????? ? ? ? ?                ? .
user@user-desktop:~/test$ cat level1/file1
cat: level1/file1: Permission denied
user@user-desktop:~/test$ find . -inum 95494
./level1
user@user-desktop:~/test$ find . -inum 60775
user@user-desktop:~/test$ find ./level -inum 60775
find: `./level': No such file or directory
user@user-desktop:~/test$ find ./level1 -inum 60775

2
Vì vậy, nếu tôi có số inode của một tập tin / thư mục trong một thư mục mà không có quyền tìm kiếm, tôi có thể truy cập nó miễn là quyền của nó cho phép không? (Lấy số inode mà không thể làm stat là khá khó mặc dù tôi cho là vậy.)
Leo

@Leo Tôi tin rằng, chúng ta không thể làm như vậy. Tôi đã cập nhật câu trả lời. Nếu bạn có một c c nhỏ, vui lòng kiểm tra và cho chúng tôi biết.
Amey Jah

1
@AmeyJah, Thật ra, tôi cá là bạn có thể. Xem xét những gì xảy ra khi bạn cứng liên kết một tệp đến thư mục khác mà bạn có quyền. Cùng một nút, nhưng sau đó bạn có thể đọc nó. Nói cách khác, quyền đọc không phụ thuộc vào hệ thống tra cứu tất cả các thư mục mà inode có thể thuộc và xem nếu chúng có bit x. Câu trả lời tuyệt vời mặc dù. Cảm ơn rất nhiều.
user1477

@AmeyJah ls , stat , v.v ... sử dụng stat (2), v.v ... Chỉ trong trường hợp bạn chưa biết bây giờ. Tôi có thể viết một chương trình C nhưng bài kiểm tra của bạn thực hiện mọi thứ mà chương trình sẽ hiển thị mặc dù chắc chắn rằng nó có thể làm được nhiều hơn điểm giống nhau: nó sử dụng các tòa nhà chọc trời (phần 2). Các cuộc gọi thư viện (phần 3) ở mức cao hơn các tòa nhà nhưng không thay đổi bất cứ điều gì (ví dụ: remove (3) sử dụng rmdir (2) cho các thư mục và hủy liên kết (2) cho các tệp).
Pryftan

5

Vì bạn đang yêu cầu thư mục:

đọc có nghĩa là: đọc nội dung, tức là liệt kê chúng với ls.

viết có nghĩa là: viết vào giám đốc. tức là tạo tập tin hoặc thư mục con.

thực hiện có nghĩa là: nhập vào thư mục đó.

quyền đọc và thực thi có thể là một chút khó khăn cho các thư mục.

Chẳng hạn, nếu bạn có quyền đọc nhưng không thực thi, bạn có thể liệt kê nội dung của thư mục nhưng không thể thả vào đó. Ngoài ra, bạn không thể liệt kê các tập tin hoặc thư mục cụ thể mặc dù bạn biết tên của nó.

Nếu bạn có quyền thực thi nhưng không đọc, bạn có thể thả vào đó nhưng không thể liệt kê trực tiếp các tệp. Nhưng, nếu bạn biết tên của các tập tin hoặc thư mục, bạn có thể liệt kê chúng.


2
Nếu bạn đã đọc quyền nhưng không thực thi, bạn có thể liệt kê (ls) nội dung của thư mục nhưng không thể truy cập (cat) các tệp trong đó. Nếu bạn có quyền thực thi nhưng không đọc và bạn biết tên của các tệp bạn có thể truy cập (cat) chúng.
dash17291

2

Quyền thực thi trên các thư mục có nghĩa là:

Khả năng cd vào thư mục này và truy cập các tệp trong thư mục này.

Nếu bạn không có xquyền trong thư mục của bạn, bạn không thể:

  • Nhập vào thư mục (ví dụ cd:)
  • Không thể truy cập bất kỳ tập tin trong thư mục này (ngay cả khi bạn biết tên).

Thí dụ:

$ ls -ld testdir
drw------- 2 xxxxxx xxxxxx 14 2011-11-29 19:38 testdir

$ cd testdir
bash: cd: testdir: Permission denied

$ cat testdir/a
cat: testdir/a: Permission denied

$ chmod 700 testdir
$ cat testdir/a
Some text.

Đọc Linux Confusion Confusion pt 2 để có một giới thiệu tốt về chủ đề này.

Điều duy nhất mà sự xcho phép dường như không ngăn cản được là truy cập vào tên của các tệp trong thư mục đó.

Thí dụ:

$ ls -ld testdir
drw------- 2 xxxxxx xxxxxx 14 2011-11-29 19:38 testdir

$ ls testdir
ls: cannot access testdir/a: Permission denied
ls: cannot access testdir/b: Permission denied
a  b
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.