การตั้งค่า ACL ต่างกันในไดเร็กทอรีและไฟล์


15

ฉันต้องการที่จะตั้งค่าสิทธิ์เริ่มต้นสำหรับการใช้ไฟล์ร่วมกันเพื่อให้ทุกคนที่สามารถทั้งหมดของไดเรกทอรีและเพื่อให้ไฟล์ที่สร้างขึ้นใหม่ทั้งหมดที่มีrwxrw

ทุกคนที่เข้าถึงการแชร์นี้อยู่ในกลุ่มเดียวกันดังนั้นจึงไม่เป็นปัญหา

ฉันได้ดูการทำเช่นนี้ผ่าน ACLs โดยไม่ต้องเปลี่ยนงานของผู้ใช้ทั้งหมดและเช่น นี่คือคำเชิญปัจจุบันของฉัน:

setfacl -Rdm g:mygroup:rwx share_name
setfacl -Rm g:mygroup:rwx share_name

ปัญหาของฉันคือว่าในขณะที่ฉันต้องการทั้งหมดของที่สร้างขึ้นใหม่ไดเรกทอรีย่อยที่จะrwxฉันเพียงต้องการสร้างขึ้นใหม่ไฟล์rwจะเป็น

ใครบ้างมีวิธีที่ดีกว่าเพื่อให้ได้ผลลัพธ์ที่ต้องการ มีวิธีการตั้งค่า ACLs ในไดเรกทอรีแยกต่างหากจากไฟล์ในหลอดเลือดดำที่คล้ายchmod +xกับ vs. chmod +X?

ขอบคุณ

คำตอบ:


12

เป็นจุด Gilles ออกสิทธิ์เริ่มต้นระบุสิทธิ์สูงสุดพื้นแทนsetfacl umaskดังนั้นไฟล์ที่สร้างขึ้นใหม่จะเป็นrwถ้าแอปพลิเคชันที่สร้างไฟล์นั้นถามเป็นพิเศษว่าไฟล์นั้นจะสามารถเรียกใช้งานได้

$ mkdir test
$ touch test/oldfile
$ getfacl test/oldfile
# file: test/oldfile
# owner: myuser
# group: myuser
user::rw-
group::r--
other::r--

$ setfacl -m d:g:mygroup:rwx test
$ touch test/newfile
$ getfacl test/newfile
# file: test/newfile
# owner: myuser
# group: myuser
user::rw-
group::r-x                         #effective:r--
group:mygroup:rwx                  #effective:rw-
mask::rw-
other::r--

สังเกต perms ที่มีประสิทธิภาพข้างต้น (มีเพียงไม่กี่โปรแกรมที่จะขอให้ตั้งค่าบิตเรียกใช้งานบนไฟล์ที่สร้างเช่นgccสำหรับไฟล์ที่เรียกใช้งานได้และcpหากไฟล์ที่ถูกคัดลอกนั้นสามารถเรียกใช้งานได้)

หรือคุณหมายถึงว่าคำสั่ง setfacl แรกทำงานตามที่คุณต้องการ แต่คำสั่งที่สองไม่ใช่ กล่าวอีกนัยหนึ่งคุณต้องการแก้ไขการอนุญาตในไฟล์เก่าตรวจสอบให้แน่ใจว่าไดเรคทอรีสามารถสำรวจได้โดยไม่ต้องให้สิทธิ์การใช้งานไฟล์ปกติอื่น ๆ

เวอร์ชันของฉันsetfaclอนุญาตXเหมือนที่คุณต้องการเช่น:

setfacl g:mygroup:rwX

$ setfacl --version
setfacl 2.2.49
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ find test -ls
107513    4 drwxr-xr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-r--r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxr-xr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ setfacl -Rm g:somegroup:rwx test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rwxr--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ setfacl -Rm g:somegroup:rwX test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rw-r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir

หากเวอร์ชันของคุณsetfaclไม่รองรับนั้นทำไมไม่ใช้find?

เขียนทับสิทธิ์ตั้งค่าเป็น rw สำหรับไฟล์และ rwx สำหรับ dirs

$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)

ตั้งค่าสิทธิ์ mygroup ACL ตามการอนุญาตกลุ่มที่มีอยู่

$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)

คุณอาจต้องการตรวจสอบว่ารูปแบบกลุ่มให้สิทธิ์ที่มีประสิทธิภาพ ถ้าไม่คุณจะต้องเปิดใช้งานด้วย:

$ find . -type d -exec chmod g+rwX '{}' ';'

4

สำหรับผู้อ่านในอนาคตเพื่อใช้setfaclกับไฟล์ / โฟลเดอร์ที่มีอยู่โดยไม่ต้องเพิ่มบิตเรียกใช้ลงในไฟล์ของคุณการแก้ปัญหาคือส่วนหนึ่งของคำตอบของ@ Mikel นี้ :

setfacl รุ่นของฉันอนุญาตให้ X เหมือนกับที่คุณต้องการเช่น:

setfacl g:mygroup:rwX

ข้อความที่ตัดตอนมาที่เกี่ยวข้องจากsetfaclเอกสาร :

สนาม perms คือการรวมกันของตัวละครที่บ่งบอกถึงสิทธิ์: อ่าน (R), การเขียน (w), รัน (x), ดำเนินการเฉพาะในกรณีที่ไฟล์เป็นไดเรกทอรีหรือมีอยู่แล้วมีผู้ได้รับอนุญาตสำหรับผู้ใช้บางส่วน (X)


2

เท่าที่ฉันเข้าใจ Linux ACL setfacl -Rdm g:mygroup:rwx share_nameทำสิ่งที่คุณต้องการ การทดสอบ:

umask 007
mkdir foo
chgrp mygroup foo
chmod 2700 foo
setfacl -d -m group:mygroup:rwx foo
setfacl -m group:mygroup:rwx foo
touch foo/data
echo '#!/bin/ls' >foo/exec
chmod +x foo/exec

จากนั้นเป็นผู้ใช้อื่นในกลุ่มmygroup:

$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec

เกิดอะไรขึ้น?

$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx                 #effective:rw-
mask::rw-
other::---

ACL ที่มีประสิทธิภาพสำหรับmygroupเป็นผลลัพธ์ของ and'ing ACL_GROUPรายการสำหรับmygroup( rwx) ด้วยรายการ ACL_MASK ( rw-)

ACL (5) หน้าคนอธิบายการคำนวณนี้ภายใต้“การเข้าถึงขั้นตอนวิธีการตรวจสอบ” ไม่ได้อธิบายวิธีการACL_MASKสร้างรายการ แต่ในทางปฏิบัติสิ่งที่ถูกต้องน่าจะเกิดขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.