Làm thế nào để quyền tập tin áp dụng cho symlink?


93

Giả sử bạn có cấu trúc này:

+ directory
-- file1
-- file2
-- file3 -> /tmp/file3

file3là một liên kết đến một file3nơi khác trên hệ thống.

Bây giờ hãy nói tôi chmod 777thư mục và tất cả nội dung bên trong nó. Liệu tôi file3trong /tmpnhận những điều khoản? Ngoài ra, giả sử chúng ta có cùng hoàn cảnh nhưng ngược lại.

/tmp/file3 -> /directory/file3

Nếu tôi áp dụng các quyền trên tệp được liên kết đến, làm thế nào để ảnh hưởng đến liên kết?


Quyền chỉ ảnh hưởng đến tệp chứ không phải symlink.
baraboom

Câu trả lời:


90

Nó phụ thuộc vào cách bạn gọi chmodvà nền tảng bạn đang chạy.

Ví dụ, trên một hệ thống Linux, man chmodnói điều này:

chmod không bao giờ thay đổi quyền của các liên kết tượng trưng; các chmod cuộc gọi hệ thống không thể thay đổi điều khoản của họ. Đây không phải là một vấn đề vì quyền của các liên kết tượng trưng không bao giờ được sử dụng. Tuy nhiên, đối với mỗi liên kết tượng trưng được liệt kê trên dòng lệnh, chmodsẽ thay đổi quyền của tệp được trỏ tới. Ngược lại, chmodbỏ qua các liên kết tượng trưng gặp phải trong quá trình duyệt thư mục đệ quy.

Tuy nhiên, trên máy Mac, chmod có thể được sử dụng để sửa đổi các quyền của liên kết tượng trưng bằng các tùy chọn như thế này (từ man chmod):

-h Nếu tệp là một liên kết tượng trưng, ​​hãy thay đổi chế độ của chính liên kết đó thay vì tệp mà liên kết trỏ đến.

Ví dụ, giả sử bạn đang sử dụng máy Linux trong phần còn lại của câu trả lời này.

Nếu trong trường hợp đầu tiên bạn chạy chmod -R 777 directoryđể thay đổi đệ quy các quyền, mục tiêu liên kết sẽ không bị ảnh hưởng, nhưng nếu bạn làm vậy chmod 777 directory/*, nó sẽ.

Nếu bạn thay đổi trực tiếp các quyền trên mục tiêu liên kết, các quyền đó sẽ được thực hiện (vì như trang man và baraboom nói, các quyền liên kết thực tế không được sử dụng cho bất cứ điều gì).


Nhật ký kiểm tra để minh họa:

$ mkdir dir && touch dir/file{1,2} /tmp/file3 && ln -s {/tmp,dir}/file3
$ ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 dir/file1
-rw-r--r-- 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

$ chmod -R 777 dir && ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 /tmp/file3
-rwxrwxrwx 1 user group  0 2011-06-27 22:02 dir/file1
-rwxrwxrwx 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

$ chmod 700 dir/* && ls -l dir/* /tmp/file3
-rwx------ 1 user group  0 2011-06-27 22:02 /tmp/file3
-rwx------ 1 user group  0 2011-06-27 22:02 dir/file1
-rwx------ 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

2
Đó là một bất ngờ cho tôi quá. Câu hỏi tiếp theo: ai làm quyền trên symlink nghĩa là ai?
Edward Falk

Các quyền liên kết tượng trưng @EdwardFalk không hạn chế vì mọi thứ cần có thể đi qua nó để có được các quyền từ tệp được liên kết.
Rời

5

Cả hai câu trả lời của baraboom và peth đều đúng: Các bit cho phép trên chính các liên kết tượng trưng là không liên quan (ngoại trừ macOS; xem bên dưới) và thay đổi quyền trên liên kết tượng trưng - bằng chmodcông cụ dòng lệnh hoặc bằng lệnh chmod()gọi hệ thống - sẽ chỉ hoạt động như nếu nó được thực hiện chống lại mục tiêu của liên kết tượng trưng.

Để trích dẫn mô tả cuộc gọi hệ thống symlink () của SUSv4 / POSIX.1-2008 :

Các giá trị của các bit chế độ tệp cho liên kết tượng trưng được tạo là không xác định. Tất cả các giao diện được chỉ định bởi POSIX.1-2008 sẽ hoạt động như thể luôn luôn có thể đọc được nội dung của các liên kết tượng trưng, ​​ngoại trừ giá trị của các bit chế độ tệp được trả về trong trường st_mode của cấu trúc stat là không xác định.

Ở đây, không xác định được, rời khỏi phòng giải thích cho mỗi lần thực hiện. Cụ thể:

  • Trên Linux (được thử nghiệm bằng ext4fs), stat()trả về st_mode=0777, bất kể ô nào là khi liên kết tượng trưng được tạo; ls -ldo đó luôn luôn hiển thị lrwxrwxrwxcho các liên kết tượng trưng.
  • Trên macOS (HFS) và FreeBSD (cả UFS và ZFS), một liên kết tượng trưng có sự cho phép riêng của nó: chmod -hLệnh được lưu ý ở trên có thể thay đổi quyền liên kết này (trong nội bộ sử dụng lchown()lệnh gọi hệ thống không phải POSIX để đạt được điều này) và stat()hệ thống cuộc gọi trả về giá trị này cho st_mode.

Các liên kết tượng trưng trên Linux và FreeBSD luôn có thể được theo dõi, như được chỉ định bởi POSIX. Đặc biệt, trên FreeBSD, điều này có nghĩa là chế độ tệp của liên kết tượng trưng hoàn toàn không ảnh hưởng đến kiểm soát truy cập.

Mặt khác, macOS hơi phá vỡ POSIX. Mặc dù liên kết tượng trưng có thể được theo sau bất kể quyền đọc của nó, readlink()không thành công với EACCES(Quyền bị từ chối) nếu người dùng không có quyền đọc:

$ sudo ln -shf target symlink
$ sudo chmod -h 444 symlink
$ ls -l symlink
lr--r--r--  1 root  staff  1 Mar 14 13:05 symlink -> target
$ sudo chmod -h 000 symlink
$ ls -l symlink

ls: symlink: Permission denied
l---------  1 root  staff  1 Mar 14 13:05 symlink
$ echo kthxbye > target
$ cat symlink
kthxbye

(Lưu ý rằng -> targetphần bị thiếu trong đầu ra từ ls -llệnh thứ hai , và phần đó cat symlinkvẫn thành công và in nội dung của targettệp ngay cả khi người dùng không có quyền đọc symlink.)

NetBSD rõ ràng cung cấp một tùy chọn gắn kết đặc biệt có tên symperm, nếu được đặt, gây ra các quyền đọc / thực thi liên kết tượng trưng để kiểm soát readlink()và truyền tải liên kết.


-1
  1. thả tập tin liên kết (sau khi đảm bảo nó không được sử dụng bởi bất kỳ quy trình nào)
  2. đặt umask sao cho 777-umask = quyền truy cập tệp được yêu cầu
  3. tạo tập tin liên kết một lần nữa

3
Làm thế nào để trả lời câu hỏi này?
jww
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.