2009-02-24 68 views
91

Tôi có một loạt các tập lệnh và ứng dụng chạy dài đang lưu trữ kết quả đầu ra trong một thư mục được chia sẻ giữa một vài người dùng. Tôi muốn một cách để đảm bảo rằng mọi tệp và thư mục được tạo trong thư mục được chia sẻ này sẽ tự động có quyền truy cập u=rwxg=rwxo=r.Đặt quyền mặc định cho các tệp và thư mục con mới được tạo trong thư mục trong Linux?

Tôi biết rằng tôi có thể sử dụng umask 006 ở đầu các tập lệnh khác nhau của mình, nhưng tôi không thích cách tiếp cận đó khi nhiều người dùng viết tập lệnh của chính họ và có thể quên tự đặt umask.

Tôi thực sự chỉ muốn hệ thống tệp đặt các tệp và thư mục mới được tạo với quyền nhất định nếu nó nằm trong một thư mục nhất định. Đây có phải là ở tất cả có thể?

Cập nhật: Tôi nghĩ nó có thể được thực hiện với POSIX ACLs, sử dụng các chức năng mặc định ACL, nhưng đó là tất cả một chút trên đầu của tôi vào lúc này. Nếu ai cũng có thể giải thích cách sử dụng ACL mặc định thì có lẽ nó sẽ trả lời câu hỏi này một cách độc đáo.

+1

POSIX ACL là tốt, tuy nhiên 60% máy tốt mà bạn gặp sẽ không bật chúng cho các hệ thống tệp nhất định, tùy thuộc vào phân phối. Dưới đây là một giới thiệu rất tốt và ví dụ: http://www.suse.de/~agruen/acl/linux-acls/online/ –

+1

Bạn có nghĩa là cùng một tài liệu tôi liên kết :) Tôi đã không có một thay đổi để đọc nó nhưng cảm ơn cho người đứng đầu về vấn đề sẵn có. –

+1

Liên kết trong nhận xét của Tim Post dường như đã chết, nhưng nhờ vào Internet Archive, tôi có thể xem và xác minh rằng http://www.vanemery.com/Linux/ACL/POSIX_ACL_on_Linux.html chứa cùng một tài liệu chính xác. Tôi sẽ chỉnh sửa câu hỏi để cập nhật liên kết. – rmunn

Trả lời

70

Để có được quyền sở hữu, bạn có thể thiết lập các nhóm bit setuid trên thư mục với

chmod g+rwxs dirname 

này sẽ đảm bảo rằng các tập tin được tạo ra trong thư mục được sở hữu bởi nhóm. Sau đó, bạn phải đảm bảo mọi người chạy với umask 002 hoặc 007 hoặc một cái gì đó có tính chất đó --- đây là lý do tại sao Debian và nhiều hệ thống Linux khác được định cấu hình với các nhóm người dùng theo mặc định.

Tôi không biết cách nào để ép buộc quyền bạn muốn nếu umask của người dùng quá mạnh.

+20

Điều này không thực sự cung cấp giải pháp - anh ấy hỏi về quyền không sở hữu và cách duy nhất để thực hiện điều đó là [với ACL] (http://stackoverflow.com/a/13906099/165673) – Yarin

+2

"... thực hiện chắc chắn mọi người đều chạy với umask 002 hoặc 007 hoặc một cái gì đó có tính chất đó "- đó là một chút căng ... Làm thế nào để bạn thực hiện Postfix, Dovecot, Clam và Spam Assassin tất cả làm điều này? – jww

+1

Phần '+ s' làm gì? Cảm ơn. –

4

Rất xấu, nhưng bạn có thể sử dụng lệnh setfacl để đạt được chính xác những gì bạn muốn.

Trên máy Solaris, tôi có tệp chứa các thẻ cho người dùng và nhóm. Thật không may, bạn phải liệt kê tất cả những người sử dụng (ít nhất là tôi không thể tìm thấy một cách để làm việc này bằng cách khác):

user::rwx 
user:user_a:rwx 
user:user_b:rwx 
... 
group::rwx 
mask:rwx 
other:r-x 
default:user:user_a:rwx 
default:user:user_b:rwx 
.... 
default:group::rwx 
default:user::rwx 
default:mask:rwx 
default:other:r-x 

Tên file acl.lst và điền vào tên người dùng thực sự của bạn thay vì user_X .

Bây giờ bạn có thể thiết lập những ACL vào thư mục của bạn bằng cách phát hành các lệnh sau:

setfacl -f acl.lst /your/dir/here 
+0

bạn có thể bỏ danh sách người dùng nếu họ là thành viên của cùng một nhóm và chỉ sử dụng quyền của nhóm không? –

+0

Tôi đã tự hỏi mình cùng một câu hỏi. Đã được một thời gian kể từ khi tôi thiết lập điều này. Nhưng mỗi khi tôi có một người dùng mới (trong cùng nhóm với những người khác), tôi quên cập nhật danh sách và tôi sẽ nhận được khiếu nại về người dùng mới không thể ghi/xóa tệp. Vì vậy, câu trả lời là: Không, bạn không thể. – innaM

54

Dưới đây là làm thế nào để làm điều đó bằng ACL mặc định, ít nhất là trong Linux.

Trước tiên, bạn có thể cần bật hỗ trợ ACL trên hệ thống tệp của bạn. Nếu bạn đang sử dụng ext4 thì nó đã được kích hoạt. Các hệ thống tệp khác (ví dụ: ext3) cần được gắn kết với tùy chọn acl. Trong trường hợp đó, hãy thêm tùy chọn vào số /etc/fstab của bạn.Ví dụ, nếu thư mục nằm trên hệ thống tập tin gốc của bạn:

/dev/mapper/qz-root / ext3 errors=remount-ro,acl 0 1 

Sau đó đi ngược lại nó:

mount -oremount/

Bây giờ, sử dụng lệnh sau để thiết lập ACL mặc định:

setfacl -dm u::rwx,g::rwx,o::r /shared/directory 

Tất cả các tệp mới trong /shared/directory giờ đây sẽ nhận được các quyền mong muốn. Tất nhiên, nó cũng phụ thuộc vào ứng dụng tạo tệp. Ví dụ, hầu hết các tập tin sẽ không được thực thi bởi bất cứ ai từ đầu (tùy thuộc vào chế độ đối số để mở (2) hoặc tạo (2) cuộc gọi), giống như khi sử dụng umask. Một số tiện ích như cp, tarrsync sẽ cố gắng giữ quyền của (các) tệp nguồn sẽ che giấu ACL mặc định của bạn nếu tệp nguồn không thể ghi nhóm.

Hy vọng điều này sẽ hữu ích!

+0

Dường như điều này vẫn đòi hỏi phải có 'umask' đúng cho tất cả người dùng. =/http://unix.stackexchange.com/questions/71743/using-setfacl-to-allow-group-members-to-write-to-any-file-in-a-directory –

+1

@techtonik Như tôi đã viết, nó phụ thuộc vào ứng dụng tạo tệp. Ví dụ: nếu bạn sử dụng 'cp' thì nó sẽ cố gắng sao chép quyền của tệp nguồn. Thậm chí không có 'umask' giúp khi sử dụng' cp'. Tôi đã nhìn thấy cùng một vấn đề với 'tar'. Xem [câu hỏi này] (http://serverfault.com/questions/183800/why-does-cp-not-respect-acls). – pelle

+0

@techtonik Tôi đã thêm một câu về điều này trong câu trả lời của tôi ngay bây giờ. – pelle

2

trong shell script của bạn (hoặc .bashrc), bạn có thể sử dụng somthing như:

umask 022

umask là một lệnh xác định các thiết lập của một mặt nạ điều khiển như thế nào cho phép tập tin được thiết lập cho các tập tin mới được tạo ra.

+0

Điều này không đúng vì umask giới hạn các quyền mà nó không thể thêm quyền – ACV

Các vấn đề liên quan