ฉันมีสองไฟล์ในไดเรกทอรี หนึ่งมีสิทธิ์ที่ถูกต้องและอื่น ๆ ไม่ได้ มีวิธีที่ฉันสามารถ "คัดลอก" ชุดของการอนุญาตจากไฟล์หนึ่งไปยังอีกไฟล์หนึ่งได้หรือไม่?
ฉันมีสองไฟล์ในไดเรกทอรี หนึ่งมีสิทธิ์ที่ถูกต้องและอื่น ๆ ไม่ได้ มีวิธีที่ฉันสามารถ "คัดลอก" ชุดของการอนุญาตจากไฟล์หนึ่งไปยังอีกไฟล์หนึ่งได้หรือไม่?
คำตอบ:
เวอร์ชัน GNU ของยูทิลิตีchmodสามารถคัดลอกโหมดจากไฟล์หนึ่ง ( RFile
) ไปยังอีกไฟล์หนึ่ง ( file
)
chmod --reference=RFile file
coreutils ของ GNUนั้นพบได้ในลีนุกซ์ส่วนใหญ่และ Cygwin, ในที่อื่น ๆ . การใช้งานchmodไม่ทั้งหมดให้ตัวเลือกนี้
--reference
ตัวเลือกที่จะรวมอยู่ในรุ่น GNU; OSX อาจใช้chmodที่มาพร้อมกับ BSD แทน OSX chmod ชาย : developer.apple.com/Mac/library/documentation/Darwin/Reference/...
cp -dpR <source-file> <dest-file>
เมื่อจะคัดลอกไฟล์ให้คัดลอกสิทธิ์เช่นเดียวกับ file.r
ฉันมากับสิ่งนี้:
find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh
มันไม่ได้เป็นหลักฐานกระสุน แต่ทำในสิ่งที่ฉันต้องการ
ลองนี้:
find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;
สิ่งนี้จะเกิดขึ้นซ้ำ ๆ และ chmod ทุกไฟล์หากสองไดเรกทอรีไม่ตรงกับไฟล์คุณจะเห็นข้อผิดพลาด "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว"
find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
คุณสามารถใช้getfacl
เพื่อดึงรายการเต็มของการอนุญาตไฟล์เจ้าของกลุ่มและ ACL เพิ่มเติม (รายการควบคุมการเข้าถึง)
$ getfacl filename.txt
# file: filename.txt
# owner: score
# group: score
user::rw-
group::---
other::---
หากคุณบันทึกผลลัพธ์นั้นลงในไฟล์ (เช่นacl.txt
) คุณสามารถกู้คืนจากรูปแบบนี้setfacl --restore acl.txt
ได้ หากคุณต้องการกู้คืนไฟล์เดียวและไฟล์นั้นมีชื่อไฟล์ที่แตกต่างจากต้นฉบับคุณจะต้องใช้setfacl --set-file acl.txt filename.txt
(โดยที่filename.txt
เป็นชื่อไฟล์ใหม่)
บันทึกการอนุญาตดั้งเดิมไปที่acl.txt
:
$ getfacl filename.txt > acl.txt
เขียนทับสิทธิ์ (สำหรับการสาธิตนี่เป็นเพียงเพื่อให้คุณเห็นว่าการกู้คืนในการทำงานขั้นตอนถัดไป)
$ chmod 777 filename.txt
$ sudo chown nobody:root filename.txt
$ ls -l filename.txt
-rwxrwxrwx 1 nobody root 0 Jan 8 14:24 filename.txt
ใช้setfacl
เพื่อกู้คืนสิทธิ์ที่ถูกต้องจากacl.txt
:
$ sudo setfacl --restore acl.txt
$ ls -l filename.txt
-rw------- 1 score score 0 Jan 8 14:24 filename.txt
ชื่อไฟล์นั้นนำมาจาก# file:
ความคิดเห็นที่สร้างขึ้นโดยgetfacl
ไม่จำเป็นต้องระบุในบรรทัดคำสั่ง
หากคุณต้องการกู้คืนการอนุญาตเหล่านั้นไปยังไฟล์อื่นคุณสามารถใช้--set-file
แทน--restore
ดังนี้:
$ setfacl --set-file acl.txt second_filename.txt
หากคุณเขียนทับการอนุญาตในบางไฟล์/usr
แต่คุณไม่ทราบว่าไฟล์ใดที่คุณเขียนทับคุณสามารถแก้ไขได้โดยการกู้คืนจากระบบอื่นที่มีการตั้งค่าคล้ายกัน
สิทธิ์การสำรองข้อมูลจากระบบการทำงาน (หมายเหตุ: getfacl
สร้างเส้นทางสัมพัทธ์ดังนั้นให้แน่ใจว่าคุณcd
ไปยังตำแหน่งที่สอดคล้องบนเครื่องทั้งสองเครื่อง)
# cd /
# getfacl -R usr > /root/acls.txt
คัดลอกดัมพ์ ACL ไปยังระบบด้วยสิทธิ์ที่เสียหาย
$ scp root@working-system:/root/acls.txt .
$ scp acls.txt root@broken-system:/root/
กู้คืนดัมพ์ ACL เพื่อเขียนทับสิทธิ์ที่ไม่สามารถใช้งานได้กับเครื่องที่ดีที่รู้จัก
# cd /
# setfacl --restore /root/acls.txt