ฉันจะตั้งค่าการอนุญาตซ้ำ ๆ บน dir (โดยเปิดใช้งาน ACL) ได้อย่างไร


24

ตัวอย่างเช่นฉันต้องการให้เพื่อนร่วมงานของฉันเขียนเพื่อเข้าถึงไดเรกทอรีบางอย่าง สมมติว่าไดเรกทอรีย่อยในนั้นมีสิทธิ์การเข้าถึง 775 ไฟล์ 664 และมีไฟล์ปฏิบัติการใน dir - 775

ตอนนี้ฉันต้องการเพิ่มสิทธิ์การเขียน ด้วย chmod ฉันสามารถลองสิ่งที่ชอบ

chmod o+w -R mydir/

แต่นั่นก็ไม่เจ๋งเพราะฉันไม่ต้องการทำให้โลกเขียนได้ - ฉันต้องการให้สิทธิ์การเข้าถึงแก่ผู้ใช้บางคนเท่านั้นดังนั้นฉันจึงต้องการใช้ ACL แต่มีวิธีง่ายๆในการตั้งค่าการอนุญาตเหล่านั้นหรือไม่ ตามที่ฉันเห็นฉันต้องจัดการอย่างน้อยสามกรณี (dirs, ไฟล์, ไฟล์เรียกทำงาน) แยกจากกัน:

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 {} \;

ดูเหมือนว่าจะมีโค้ดบรรทัดจำนวนมากสำหรับงานง่าย ๆ มีวิธีที่ดีกว่า?

คำตอบ:


40

setfaclมีตัวเลือกซ้ำ ( -R) เช่นchmod:

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

มันยังอนุญาตให้ใช้Xสิทธิ์capital-x ซึ่งหมายถึง:

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

ดังนั้นการทำสิ่งต่อไปนี้ควรได้ผล:

setfacl -R -m u:colleague:rwX .

(ราคาทั้งหมดมาจากman setfaclสำหรับacl-2.2.52ตามที่จัดส่งมาพร้อมกับ Debian)


4
setfacl ไม่มีสถานะ '-R' ใน FreeBSD 9
Aaron C. de Bruyn

6
ถ้าอย่างนั้นก็ดีที่ OP ติดแท็กคำถามของพวกเขาในชื่อ [linux]
umläute

คิดถึงว่า ;)
Aaron C. de Bruyn

สิ่งนี้นำไปใช้กับไฟล์ / โฟลเดอร์ใหม่ที่สร้างขึ้นภายในภายหลังโดยอัตโนมัติหรือไม่?
ปริศนา

ตรวจสอบหน้า man สำหรับ setfacl เวอร์ชั่นของคุณ ตัวเลือกที่ไม่ทำงานตามที่คาดว่าจะได้รวมอยู่ใน-X setfacl 2.2.49
phyatt

5

ตามที่กล่าวไว้โดยumläuteคำสั่งที่setfacl -Rมีตัวพิมพ์ใหญ่ "X" เป็นวิธีที่จะไปเช่น:

setfacl -R -m u:colleague:rwX .

อย่างไรก็ตามสำหรับผู้ที่ต้องการนำ ACL กลับมาใช้ใหม่อีกครั้ง (เช่นเช่น "ใช้การอนุญาตซ้ำบนไดเรกทอรีย่อย" ใน Windows)

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

คำสั่งที่สามารถ splited 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/')

โปรดทราบว่าไวยากรณ์<( something )คือการทดแทนกระบวนการซึ่งเฉพาะสำหรับทุบตี คุณอาจต้องสร้างไฟล์ชั่วคราวหากคุณใช้เชลล์อื่น


-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 อยากรู้อยากเห็นทำไมไม่?
Shadur

ความคิดเห็นทั้งหมดเป็นลิงค์ ติดตามและค้นหา
muru

หากคุณต้องการใช้วิธีการนี้find /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
sibaz

1
อย่าใช้มัน $(find /data -mindepth 0 -type d)จะไม่ส่งคืนผลลัพธ์ทีละบรรทัดมันจะบัฟเฟอร์ผลลัพธ์ทั้งหมด หากมีช่องว่างในบรรทัดคุณจะได้รับการบันทึกที่ไม่ถูกต้องใน$iตัวแปร
Gnought
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.