Unix: มีวิธี "คัดลอก" ไฟล์หรือการอนุญาตไดเรกทอรีหรือไม่?


14

ฉันมีสองไฟล์ในไดเรกทอรี หนึ่งมีสิทธิ์ที่ถูกต้องและอื่น ๆ ไม่ได้ มีวิธีที่ฉันสามารถ "คัดลอก" ชุดของการอนุญาตจากไฟล์หนึ่งไปยังอีกไฟล์หนึ่งได้หรือไม่?

คำตอบ:


15

เวอร์ชัน GNU ของยูทิลิตีchmodสามารถคัดลอกโหมดจากไฟล์หนึ่ง ( RFile) ไปยังอีกไฟล์หนึ่ง ( file)

chmod --reference=RFile file

coreutils ของ GNUนั้นพบได้ในลีนุกซ์ส่วนใหญ่และ Cygwin, ในที่อื่น ๆ . การใช้งานchmodไม่ทั้งหมดให้ตัวเลือกนี้


หืม ... ดูเหมือนว่านี่น่าจะใช้ได้ แต่ไม่รองรับ Mac OS X? มีฉันเท่านั้นที่ได้รับตัวเลือกที่ผิดกฎหมาย ...
Svish

2
chmodไม่ใช่คำสั่งbash builtin มันเป็นยูทิลิตี้แยกต่างหากที่มีอยู่ในหลายยูนิกซ์ --referenceตัวเลือกที่จะรวมอยู่ในรุ่น GNU; OSX อาจใช้chmodที่มาพร้อมกับ BSD แทน OSX chmod ชาย : developer.apple.com/Mac/library/documentation/Darwin/Reference/...
นักต้มตุ๋น Quixote

อย่างไรก็ตาม, คุณอาจพิจารณาติดตั้งเวอร์ชัน GNU ผ่าน MacPorts
Jeremy L

เพียงแค่คิดว่ามันจะมีประโยชน์ที่จะกล่าวถึงที่นี่ว่าcp -dpR <source-file> <dest-file>เมื่อจะคัดลอกไฟล์ให้คัดลอกสิทธิ์เช่นเดียวกับ file.r
LawrenceC

1

ฉันมากับสิ่งนี้:

find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh

มันไม่ได้เป็นหลักฐานกระสุน แต่ทำในสิ่งที่ฉันต้องการ


0

ลองนี้:

find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;

สิ่งนี้จะเกิดขึ้นซ้ำ ๆ และ chmod ทุกไฟล์หากสองไดเรกทอรีไม่ตรงกับไฟล์คุณจะเห็นข้อผิดพลาด "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว"


find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
Rick Sanchez

chmod: ล้มเหลวในการรับคุณลักษณะของ '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1': ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว chmod: ล้มเหลวในการรับคุณสมบัติของ '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1 / 111.txt ': ไม่มีไฟล์หรือไดเรกทอรี chmod: ล้มเหลวในการรับคุณสมบัติของ' /home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/222.txt ': ไม่ chmod ไฟล์หรือไดเรกทอรีดังกล่าว: ล้มเหลวในการรับคุณลักษณะของ '/home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/333.txt': ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
Rick Sanchez

ทดสอบใน 2 โฟลเดอร์: test1 และ test2 แต่ละไฟล์มีไฟล์เดียวกัน 111/222 / 333.txt ที่มีสิทธิ์ต่างกัน test1 มีค่าเริ่มต้น test2 มีการอนุญาต 777 รายการ นี่คือข้อผิดพลาดที่ฉันได้รับ
Rick Sanchez

0

คุณสามารถใช้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เป็นชื่อไฟล์ใหม่)

ขั้นตอน

  1. บันทึกการอนุญาตดั้งเดิมไปที่acl.txt:

    $ getfacl filename.txt > acl.txt
    
  2. เขียนทับสิทธิ์ (สำหรับการสาธิตนี่เป็นเพียงเพื่อให้คุณเห็นว่าการกู้คืนในการทำงานขั้นตอนถัดไป)

    $ 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
    
  3. ใช้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แต่คุณไม่ทราบว่าไฟล์ใดที่คุณเขียนทับคุณสามารถแก้ไขได้โดยการกู้คืนจากระบบอื่นที่มีการตั้งค่าคล้ายกัน

  1. สิทธิ์การสำรองข้อมูลจากระบบการทำงาน (หมายเหตุ: getfaclสร้างเส้นทางสัมพัทธ์ดังนั้นให้แน่ใจว่าคุณcdไปยังตำแหน่งที่สอดคล้องบนเครื่องทั้งสองเครื่อง)

    # cd /
    # getfacl -R usr > /root/acls.txt
    
  2. คัดลอกดัมพ์ ACL ไปยังระบบด้วยสิทธิ์ที่เสียหาย

    $ scp root@working-system:/root/acls.txt .
    $ scp acls.txt root@broken-system:/root/
    
  3. กู้คืนดัมพ์ ACL เพื่อเขียนทับสิทธิ์ที่ไม่สามารถใช้งานได้กับเครื่องที่ดีที่รู้จัก

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