Thay đổi quyền cho một liên kết tượng trưng


37

Tôi có một liên kết tượng trưng với các quyền này:

lrwxrwxrwx 1 myuser myuser       38 Aug 18 00:36 npm -> ../lib/node_modules/npm/bin/npm-cli.js*

Liên kết tượng trưng nằm trong kho lưu trữ .tar.gz. Bây giờ khi tôi giải nén tệp lưu trữ tar.gz bằng maven, symlink không còn hợp lệ. Do đó, tôi đang cố gắng xây dựng lại liên kết tượng trưng. Đầu tiên tôi tạo symlink bằng ln nhưng làm cách nào để đặt quyền tương tự như symlink gốc?

Câu trả lời:


59

Bạn có thể tạo một liên kết tượng trưng mới và di chuyển nó đến vị trí của liên kết cũ.

ln -s <new_location> npm2
mv -f npm2 npm

Điều đó sẽ bảo vệ quyền sở hữu liên kết. Ngoài ra, bạn có thể sử dụng chownđể đặt quyền sở hữu liên kết theo cách thủ công.

chown -h myuser:myuser npm

Trên hầu hết các hệ thống, quyền symlink không thành vấn đề. Khi sử dụng symlink, quyền của các thành phần của đích symlink sẽ được kiểm tra. Tuy nhiên, trên một số hệ thống họ làm vấn đề. MacOS yêu cầu quyền đọc trên liên kết readlinksympermtùy chọn gắn kết của NetBSD buộc các quyền kiểm tra liên kết kiểm tra đọc và truyền tải. Trên các hệ thống đó (và người thân của chúng, bao gồm FreeBSD và OpenBSD), có một -htùy chọn tương đương chmod.

chmod -h 777 npm

1
Tôi vừa gặp vấn đề về quyền với các liên kết tượng trưng trên máy chủ CentOS 6.8. Các liên kết tượng trưng có chủ sở hữu: nhóm gốc: root. Khi chủ sở hữu và nhóm được thay đổi thành người dùng sở hữu thư mục họ đang ở, như thể hiện trong câu trả lời này, vấn đề cấp phép đã biến mất.
Cú đêm

Chỉ cần cung cấp một sự làm rõ. Để thay đổi quyền sở hữu hoặc quyền trên một liên kết tượng trưng, ​​cờ -h sẽ ảnh hưởng đến tệp liên kết thay vì tệp bị hủy đăng ký.
UltimaWeapon

12

Khi bạn cố gắng sử dụng chmodđể đặt quyền của liên kết, thực tế bạn làm là đặt quyền của mục tiêu của liên kết. Quyền của liên kết là vô nghĩa.


2
Điều gì xảy ra nếu ai đó thay đổi liên kết thành mã độc? Mã ban đầu thậm chí có thể là một cái gì đó mà root chỉ có thể truy cập. Ví dụ trong tập lệnh crontap.
aliqandil

@aliqandil Nói chung, người dùng có thể xóa và tạo lại bất kỳ tệp nào trong thư mục mà họ có quyền truy cập ghi. Trong bash, đối với một tệp test-rw-rw-r-- root root, rm testtôi nhận được lời nhắc rm: remove write-protected regular empty file 'test'?Giải pháp là đặt các tệp nhạy cảm trong các thư mục mà người dùng có quyền truy cập chỉ đọc.
AnOccasionalCashew

5

Khi bạn có một liên kết như:

link -> foo/bar

và muốn thay đổi nó thành:

link -> new/target

Có hai trường hợp để xem xét:

  1. foo/barkhông phải là một thư mục hoặc không tồn tại hoặc bạn không có quyền truy cập tìm kiếm foo. Sau đó

    ln -s new/target link
    

    sẽ thất bại vì linkđã tồn tại, nhưng bạn có thể khắc phục điều đó bằng cách sử dụng tiêu chuẩn:

    ln -fs new/target link
    
  2. foo/barlà một thư mục (và bạn có quyền tìm kiếm foođể có thể xác định đó foo/barlà một thư mục). Trong trường hợp đó, khi bạn làm:

    ln -s new/target link
    

    hoặc là

    ln -fs new/target link
    

    Điều đó được hiểu là tạo ra một targetliên kết tượng trưng mới trong linkthư mục ( linklà một thư mục vì đó là một liên kết tượng trưng đến foo/barthư mục). Vì vậy, bạn thực sự sẽ tạo ra một:

    foo/bar/target -> new/target
    

    Để khắc phục điều đó, GNU lncó một -Ttùy chọn cho tên liên kết luôn được coi là tên liên kết và không phải là thư mục để tạo (các) liên kết trong. Vì vậy, với GNU ln:

    ln -fsT new/target link
    

    sẽ làm việc. Giống như trước đây, nó sẽ xóa linkliên kết ban đầu và tạo lại liên kết với new/targettư cách là mục tiêu (và quá trình 'euid và egid là chủ sở hữu).

    GNU lncũng có một -ntùy chọn. Nó hoạt động như -Tngoại trừ khi linkthực sự là một thư mục thực sự trong trường hợp đó nó vẫn sẽ tạo liên kết tượng trưng bên trong thư mục đó (thay vì thất bại với một lỗi).

    Có thể, tùy chọn tốt nhất của bạn là xóa liên kết trước và sau đó tạo lại liên kết:

    rm -f link && ln -s new/target link
    

Trên hầu hết các hệ thống, quyền trên symlink bị bỏ qua và thường được sửa thành rwxrwxrwx.

Trên các hệ thống có quyền truy cập symlink (như OS / X nơi bạn cần quyền đọc đối với symlink để có thể giải quyết mục tiêu của nó), nói chung có một cách để thay đổi chúng ( chmod -htrên OS / X).

Quyền sở hữu, trong khi như trên không liên quan đến quyền truy cập vào tệp được chỉ ra bởi symlink trên hầu hết các hệ thống, có thể có một số mức độ liên quan khác ghi tbit của thư mục mẹ hoặc hạn ngạch ... ) và có một lệnh tiêu chuẩn để thay đổi nó:

chown -h user[:group] the-link
chgrp -h group the-link

0

Nếu bạn thực sự cần thay đổi quyền liên kết tượng trưng (thường là vô nghĩa, như được viết trong các câu trả lời khác), tôi đã thành công với việc sử dụng -Rtùy chọn chown:

chown -R myuser:mygroup link

Nếu -Rkhông được sử dụng, các quyền không được thay đổi.


Điều đó sẽ hoạt động với GNU chown-Rngụ ý -Pở đó, tuy nhiên điều đó không được bảo đảm và sẽ không hoạt động trong một số triển khai chown khác. Cách tiêu chuẩn để thay đổi quyền sở hữu symlink là với -htùy chọn. Tôi vừa cập nhật câu trả lời được chấp nhận không chính xác.
Stéphane Chazelas
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.