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)
chmod
khô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 -h
tù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))
và long_options
có đ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ề chmod
tiệ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 fchmodat
việc cung cấp các tính năng mà bạn đã hỏi về. Nhưng chmod
tiệ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_NOFOLLOW
trong 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.