Làm cách nào để thay đổi quyền Symlink?


8

Tôi có một vấn đề: Tôi cần thay đổi sự cho phép của symlink từ 777 thành 755 và tôi không biết tôi nên làm thế nào. Tôi đã thử sử dụng chmodlệnh nhưng nó không hoạt động. tôi muốn

lrwxrwxrwx  1 frosu  2016_cluj     5 Jul  4 13:53 test6 -> test0

đến

lrwxr-xr-x 1 frosu  2016_cluj     5 Jul  4 13:53 test6 -> test0

1
Se my trả lời dưới đây: Các quyền của symlink thường không được đánh giá. Việc bạn có thể thay đổi các bit này hay không tùy thuộc vào việc hệ điều hành của bạn có hỗ trợ POSIX.1-2008 hay không
vào

Câu trả lời:


16

Một số hệ thống hỗ trợ thay đổi sự cho phép của một liên kết tượng trưng, ​​một số khác thì không.

  • chmod - thay đổi chế độ tệp hoặc Danh sách điều khiển truy cập (OSX và FreeBSD , sử dụng -h)

    -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.

  • chmod - thay đổi bit chế độ tệp (Linux)

    chmodkhông bao giờ thay đổi quyền của các liên kết tượng trưng; cuộc gọi hệ thống chmod không thể thay đổi quyề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, chmod thay đổi quyền của tệp được trỏ. Ngược lại, chmod bỏ 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.

Vì tính năng này khác nhau, POSIX không đề cập đến khả năng này.

Từ các bình luận, ai đó gợi ý rằng một sự thay đổi gần đây đối với lõi core GNU cung cấp -htùy chọn này. Hiện tại, điều đó không xuất hiện trong mã nguồn cho chmod :

  while ((c = getopt_long (argc, argv,
                           ("Rcf ghi :: w :: x :: X :: s :: t :: u :: g :: o :: a ::, :: + :: = ::"
                            "0 :: 1 :: 2 :: 3 :: 4 :: 5 :: 6 :: 7 ::"),
                           long_options, NULL))

long_optionscó điều này:

static struct option const long_options[] =
{
  {"changes", no_argument, NULL, 'c'},
  {"recursive", no_argument, NULL, 'R'},
  {"no-preserve-root", no_argument, NULL, NO_PRESERVE_ROOT},
  {"preserve-root", no_argument, NULL, PRESERVE_ROOT},
  {"quiet", no_argument, NULL, 'f'},
  {"reference", required_argument, NULL, REFERENCE_FILE_OPTION},
  {"silent", no_argument, NULL, 'f'},
  {"verbose", no_argument, NULL, 'v'},
  {GETOPT_HELP_OPTION_DECL},
  {GETOPT_VERSION_OPTION_DECL},
  {NULL, 0, NULL, 0}
};

Quyền được thiết lập với chmod. Quyền sở hữu được thiết lập với chown. GNU coreutils (như BSD) hỗ trợ khả năng thay đổi quyền sở hữu của một liên kết tượng trưng. Đây là một tính năng khác, vì quyền sở hữu của một liên kết tượng trưng có liên quan đến việc người ta có thể sửa đổi nội dung của liên kết hay không (và trỏ nó đến một mục tiêu khác). Một lần nữa, điều này bắt đầu như một tính năng BSD (OSX, FreeBSD , v.v.), cũng được hỗ trợ với Linux (và Solaris , v.v.). POSIX nói về này tính năng :

-h
Đối với mỗi toán hạng tệp đặt tên một tệp có liên kết tượng trưng, ​​chown sẽ cố gắng đặt ID người dùng của liên kết tượng trưng. Nếu ID nhóm được chỉ định, đối với mỗi toán hạng tệp đặt tên tệp của liên kết tượng trưng loại, chown sẽ cố gắng đặt ID nhóm của liên kết tượng trưng.

Quá nhiều cho các công cụ dòng lệnh (và shell script). Tuy nhiên, bạn có thể viết tiện ích của riêng mình, sử dụng tính năng của POSIX không được đề cập trong phần thảo luận về chmodtiện ích:

int chmod(const char *path, mode_t mode);
int fchmodat(int fd, const char *path, mode_t mode, int flag);

Hàm sau thêm một tham số cờ , được mô tả như vậy:

Các giá trị cho cờ được xây dựng bằng HOẶC các cờ bao gồm bitwise từ danh sách sau, được xác định trong <fcntl.h>:

AT_SYMLINK_NOFOLLOW
Nếu đường dẫn đặt tên cho một liên kết tượng trưng, ​​thì chế độ của liên kết tượng trưng được thay đổi.

Đó là, mục đích của fchmodatviệc cung cấp các tính năng mà bạn đã hỏi về. Nhưng chmodtiện ích dòng lệnh được ghi lại (cho đến nay) chỉ về mặt chmod(không có tính năng này).

fchmodat, nhân tiện, dường như đã bắt đầu như một tính năng được ghi chép kém của Solaris, được các nhà phát triển Red Hat và GNU áp dụng mười năm trước, và được họ đề xuất để chuẩn hóa:

Theo Linux Programming Interface , vì 2.6.16, hỗ trợ Linux AT_SYMLINK_NOFOLLOWtrong các cuộc gọi: faccessat, fchownat, fstatat, utimensat, và linkatđược thực hiện trong 2.6.18 (cả khá "cũ": Năm 2006, theo OSNews ).

Tính năng này có hữu ích với bạn hay không, tùy thuộc vào hệ thống mà bạn đang sử dụng.


Trang người đàn ông của tôi nói rằng AT_SYMLINK_NOFOLLOW hiện không được triển khai.
Joshua

3

Sự cho phép đối với các liên kết tượng trưng không được đánh giá.

Trước đây, không có cách nào để thay đổi các bit cho phép đối với các liên kết tượng trưng.

Sau một thời gian, POSIX đã giới thiệu fchmodat()và tất cả các nền tảng hỗ trợ cuộc gọi này, có thể thay đổi các bit cho phép đối với các liên kết tượng trưng.

Đừng hy vọng điều này sẽ có hiệu ứng trên symlink.

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.