คัดลอกการอนุญาตไปยังแผนผังที่เหมือนกันบน linux / unix


22

ฉันมีต้นไม้ไฟล์ที่มีสิทธิ์ที่ถูกต้อง จากนั้นฉันมีต้นไม้ที่เหมือนกัน (filewise) เหมือนกัน (มีเนื้อหาไฟล์ต่างกันยาก) โดยมีการอนุญาตที่ไม่ถูกต้อง

ฉันจะถ่ายโอนเค้าโครงสิทธิ์จากต้นหนึ่งไปอีกต้นได้อย่างไร

คำตอบ:


8

มันสามารถทำได้ด้วยเปลือกบรรทัดต่อไปนี้:

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 จะมีสิทธิ์ในการซิงค์


1
นี่ถือว่าสถิตินั้นมีอยู่ ฉันพบว่าน่าเสียดายที่สถิติคำสั่งมักไม่ปรากฏ
พ.ค.

@ David ฉันไม่ทราบว่าระบบดังกล่าวขาดสถิติ แต่มันค่อนข้างเล็กน้อยที่จะใช้รุ่น "octal ls" ต่อไปนี้และรองรับวิธีแก้ปัญหาที่กำหนด: alias ols = "ls -la | awk '{k = 0; สำหรับ (i = 0; i <= 8; i ++) k + = ((substr (\ $ 1, i + 2,1) ~ / [rwx] /) * 2 ^ (8-i)); ถ้า (k) printf (\ "% 0o \", k); print} ' "
drAlberT

หยุดพักเมื่อเส้นทางใด ๆ ที่เกี่ยวข้องมีอักขระพิเศษประเภทใด (ช่องว่างเริ่มต้นด้วยขีดกลาง ฯลฯ )
n.st

31

ฉันเพิ่งเรียนรู้วิธีใหม่และง่าย ๆ ในการทำสิ่งนี้ให้สำเร็จ:

getfacl -R /path/to/source > /root/perms.acl

สิ่งนี้จะสร้างรายการที่มีสิทธิ์และความเป็นเจ้าของทั้งหมด

จากนั้นไปที่เหนือระดับหนึ่งปลายทางและคืนค่าสิทธิ์ด้วย

setfacl --restore=/root/perms.acl

เหตุผลที่คุณต้องเป็นระดับหนึ่งข้างต้นคือเส้นทางทั้งหมดใน perms.acl มีความเกี่ยวข้อง

ควรทำเป็นราก


นี่เป็นวิธีที่ง่ายและตรงไปตรงมาในการสำรองและกู้คืนสิทธิ์ อย่างไรก็ตามโปรดสังเกตว่าgetfaclและsetfaclไม่จำเป็นต้องมีอยู่ในทุกระบบ
the-wabbit

ถูกต้องหรือไม่ที่จะมี.acในคำสั่งแรกและ.aclครั้งที่สอง?
sfarbota

1
@sfarbota: ไม่มันเป็นตัวพิมพ์ผิด! ถูกต้องแล้ว ขอบคุณที่ชี้นำ
marlar

13

หากคุณมีแหล่งที่มาและปลายทางคุณสามารถซิงโครไนซ์สิทธิ์ของคุณด้วย rsync -ar --perms source/ dest

มันจะไม่ถ่ายโอนข้อมูลเพียงสิทธิ์ ...


1
ไม่, มันจะคัดลอกไฟล์หากการประทับเวลาแตกต่างกัน
yawniek

@yawniek The -rและ--permsซ้ำซ้อน แต่นี่ยังคงซิงค์ perms หากพวกเขาเป็นสิ่งเดียวที่แตกต่างกัน (ซึ่งเป็นสิ่งที่คุณพูดในคำถาม; ถ้าต้นไม้ไม่เหมือนกันจริง ๆ แล้วคุณไม่ควรบอกว่าพวกเขาเป็น)
Chris S

ตกลงฉันไม่ชัดเจนฉันหมายความว่าโครงสร้างต้นไม้เหมือนกัน
yawniek

12

สิ่งหนึ่งที่คุณสามารถทำได้คือใช้คำสั่ง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
...

1
ฉันสงสัยว่าอาร์กิวเมนต์ -printf เพื่อค้นหาเป็นส่วนขยายของ GNU หรือไม่ HP-UX find ไม่ได้มี
พ.ค.

1
แม้ว่าจะไม่มีตัวเลือก printf ในการค้นหา แต่ก็สามารถใช้ตัวเลือก ls (หรือที่แย่ที่สุดคือ pipe to xargs ls -l) และบันทึกในไฟล์ หนึ่งหรือสองนาทีของการค้นหาและแทนที่และหนึ่งจะมีสคริปต์กับ chmod สำหรับแต่ละไฟล์
mpez0

0

สองทาง:

  1. หากใช้งานได้กับแบรนด์ UNIX ของคุณ: cp -ax / src / dest
  2. หรือหากไม่ใช่นี่เป็นรุ่นพกพา: (cd / src && tar cpf -.) | (cd / dst && tar xpf -)

(ในกรณีหลัง / dst ต้องมีอยู่)

แก้ไข: ขอโทษฉันอ่านผิด ไม่ใช่สิ่งที่คุณถาม


เป็นมูลค่าการกล่าวขวัญว่า -a (สำหรับการเก็บถาวร) เป็นส่วนเสริมของ GNU กับ cp ฉันไม่เคยเห็นมันมาก่อนในระบบอื่น ๆ มันเป็นเพียงสั้น ๆ สำหรับ -dpR (ไม่มีการอ้างอิงซ้ำเรียกซ้ำรักษาสิทธิ์) ตัวเลือก R และ p ควรอยู่ใน cp รุ่นใด ๆ
theotherreceive

0

ฉันคิดว่าฉันจะเขียนสคริปต์ 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

ฉันเขียนสิ่งนี้ออกจากส่วนบนของหัวของฉันและยังไม่ได้ทดสอบ ดังนั้นตรวจสอบก่อนที่คุณจะปล่อยให้มันอาละวาด สิ่งนี้จะแก้ไขการอนุญาตในไดเรกทอรีที่มีอยู่เท่านั้น มันจะไม่เปลี่ยนการอนุญาตในไฟล์และจะไม่สร้างไดเรกทอรีที่ขาดหายไป


0

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

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

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

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