Làm cách nào để tôi đặt quyền đệ quy trên một thư mục (đã bật ACL)?


24

Ví dụ, tôi muốn cung cấp cho các đồng nghiệp của tôi quyền truy cập vào thư mục nhất định. Giả sử rằng các thư mục con trong đó có quyền truy cập 775, tệp 664 và cũng có một số tệp thực thi trong thư mục - 775.

Bây giờ tôi muốn thêm quyền ghi. Với chmod, tôi có thể thử một cái gì đó như

chmod o+w -R mydir/

Nhưng điều đó không hay, vì tôi không muốn làm cho dir có thể ghi được trên thế giới - tôi chỉ muốn cấp quyền truy cập cho một số người dùng nhất định, vì vậy tôi muốn sử dụng ACL. Nhưng có một cách dễ dàng để thiết lập các quyền đó? Như tôi thấy, tôi cần giải quyết ít nhất ba trường hợp (thư mục, tệp, tệp thực thi):

find -type d -exec setfacl -m u:colleague:rwx {} \;
find -type f -executable -exec setfacl -m u:colleague:rwx {} \;
find -type f \! -executable -exec setfacl -m u:colleague:rw {} \;

Có vẻ như khá nhiều dòng mã cho một nhiệm vụ đơn giản như vậy. Có cách nào tốt hơn?

Câu trả lời:


39

setfaclcó một tùy chọn đệ quy ( -R) giống như chmod:

  -R, --recursive
      Apply operations to all files and directories recursively. This
      option cannot be mixed with `--restore'.

nó cũng cho phép sử dụng quyền capital-x X, có nghĩa là:

  execute only if the file is a directory or already has
  execute permission for some user (X)

Vì vậy, làm như sau nên làm việc:

setfacl -R -m u:colleague:rwX .

(tất cả các dấu ngoặc kép là từ man setfaclcho acl-2.2.52 như vận chuyển với Debian)


4
setfacl không có cờ '-R' trong FreeBSD 9
Aaron C. de Bruyn

6
sau đó thật tốt khi OP gắn thẻ câu hỏi của họ là [linux]
umläute

Bỏ lỡ điều đó. ;)
Aaron C. de Bruyn

Điều này có tự động áp dụng cho các tập tin / thư mục mới được tạo trong vòng sau đó không?
Bí tích

Kiểm tra trang man cho phiên bản setfacl của bạn. Tùy chọn -Xkhông hoạt động như mong đợi được bao gồm trong setfacl 2.2.49.
phyatt

4

Như được đề cập bởi umläute, lệnh setfacl -Rcó chữ hoa "X" là cách để đi, như:

setfacl -R -m u:colleague:rwX .

Tuy nhiên, đối với những người cần áp dụng lại ACL (nghĩa là "áp dụng lại quyền trên thư mục con" à Windows).

find . -mindepth 1 | xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')

Lệnh đó có thể được chia để tránh lỗi như thế nào setfacl: foobar: Only directories can have default ACLs.

find . -mindepth 1 -type d| xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')
find . -mindepth 1 -type f| xargs -n 50 setfacl -b --set-file=<(getfacl . | grep -v '^default:' | sed -e 's/x$/X/')

Lưu ý rằng cú pháp <( something )Thay thế quy trình , dành riêng cho bash. Bạn có thể cần tạo một tệp tạm thời nếu bạn sử dụng shell khác.


-1
for i in $(find /data -mindepth 0 -type d)
do setfacl -m  u:zabbix:r-x $i
    echo "ACL rules set for "$i
done


@muru Vì tò mò, tại sao không?
Shadur

Toàn bộ nhận xét là một liên kết. Thực hiện theo nó và tìm hiểu.
muru

Nếu bạn muốn sử dụng phương pháp này, hãy sử dụngfind /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
sibaz

1
Đừng sử dụng nó. $(find /data -mindepth 0 -type d)sẽ không trả về kết quả theo từng dòng, nó sẽ đệm toàn bộ kết quả. Nếu có một khoảng trắng trong một dòng, bạn sẽ nhận được một bản ghi không chính xác trong $ibiến.
Gniber
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.