ฉันมีต้นไม้ไฟล์ที่มีสิทธิ์ที่ถูกต้อง จากนั้นฉันมีต้นไม้ที่เหมือนกัน (filewise) เหมือนกัน (มีเนื้อหาไฟล์ต่างกันยาก) โดยมีการอนุญาตที่ไม่ถูกต้อง
ฉันจะถ่ายโอนเค้าโครงสิทธิ์จากต้นหนึ่งไปอีกต้นได้อย่างไร
ฉันมีต้นไม้ไฟล์ที่มีสิทธิ์ที่ถูกต้อง จากนั้นฉันมีต้นไม้ที่เหมือนกัน (filewise) เหมือนกัน (มีเนื้อหาไฟล์ต่างกันยาก) โดยมีการอนุญาตที่ไม่ถูกต้อง
ฉันจะถ่ายโอนเค้าโครงสิทธิ์จากต้นหนึ่งไปอีกต้นได้อย่างไร
คำตอบ:
มันสามารถทำได้ด้วยเปลือกบรรทัดต่อไปนี้:
D1=foo; D2=foo2; for entry in $(find $D1 -exec stat -f "%N:%Mp%Lp" {} \;); do $(echo $entry | sed 's#'$D1'#'$D2'#' | awk -F: '{printf ("chmod %s %s\n", $2, $1)}') ; done
เพียงตั้งค่าที่เหมาะสมสำหรับตัวแปร D1 และ D2 ชี้ไปที่ไดเรกทอรีต้นทางและปลายทางเรียกใช้และ dirs จะมีสิทธิ์ในการซิงค์
ฉันเพิ่งเรียนรู้วิธีใหม่และง่าย ๆ ในการทำสิ่งนี้ให้สำเร็จ:
getfacl -R /path/to/source > /root/perms.acl
สิ่งนี้จะสร้างรายการที่มีสิทธิ์และความเป็นเจ้าของทั้งหมด
จากนั้นไปที่เหนือระดับหนึ่งปลายทางและคืนค่าสิทธิ์ด้วย
setfacl --restore=/root/perms.acl
เหตุผลที่คุณต้องเป็นระดับหนึ่งข้างต้นคือเส้นทางทั้งหมดใน perms.acl มีความเกี่ยวข้อง
ควรทำเป็นราก
getfacl
และsetfacl
ไม่จำเป็นต้องมีอยู่ในทุกระบบ
.ac
ในคำสั่งแรกและ.acl
ครั้งที่สอง?
หากคุณมีแหล่งที่มาและปลายทางคุณสามารถซิงโครไนซ์สิทธิ์ของคุณด้วย
rsync -ar --perms source/ dest
มันจะไม่ถ่ายโอนข้อมูลเพียงสิทธิ์ ...
-r
และ--perms
ซ้ำซ้อน แต่นี่ยังคงซิงค์ perms หากพวกเขาเป็นสิ่งเดียวที่แตกต่างกัน (ซึ่งเป็นสิ่งที่คุณพูดในคำถาม; ถ้าต้นไม้ไม่เหมือนกันจริง ๆ แล้วคุณไม่ควรบอกว่าพวกเขาเป็น)
สิ่งหนึ่งที่คุณสามารถทำได้คือใช้คำสั่งfindเพื่อสร้างสคริปต์ด้วยคำสั่งที่คุณต้องการคัดลอกสิทธิ์ นี่คือตัวอย่างด่วนคุณสามารถทำสิ่งต่างๆได้มากมายด้วยตัวเลือก printf ต่างๆรวมถึงรับเจ้าของ id กลุ่มและอื่น ๆ
$ find /var/log -type d -printf "chmod %m %p \n" > reset_perms
$ cat reset_perms
chmod 755 /var/log
chmod 755 /var/log/apt
chmod 750 /var/log/apache2
chmod 755 /var/log/fsck
chmod 755 /var/log/gdm
chmod 755 /var/log/cups
chmod 2750 /var/log/exim4
...
สองทาง:
(ในกรณีหลัง / dst ต้องมีอยู่)
แก้ไข: ขอโทษฉันอ่านผิด ไม่ใช่สิ่งที่คุณถาม
ฉันคิดว่าฉันจะเขียนสคริปต์ Perl เพื่อทำ สิ่งที่ต้องการ:
#!/usr/bin/perl -nw
my $dir = $_;
my $mode = stat($dir)[2];
my $pathfix = "/some/path/to/fix/";
chmod $mode, $pathfix . $dir;
จากนั้นทำสิ่งนี้:
cd /some/old/orig/path/ ; find . -type d | perlscript
ฉันเขียนสิ่งนี้ออกจากส่วนบนของหัวของฉันและยังไม่ได้ทดสอบ ดังนั้นตรวจสอบก่อนที่คุณจะปล่อยให้มันอาละวาด สิ่งนี้จะแก้ไขการอนุญาตในไดเรกทอรีที่มีอยู่เท่านั้น มันจะไม่เปลี่ยนการอนุญาตในไฟล์และจะไม่สร้างไดเรกทอรีที่ขาดหายไป
ฉันมากับสิ่งนี้:
find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh
มันไม่ได้เป็นหลักฐานกระสุน แต่ทำในสิ่งที่ฉันต้องการ