Sao chép quyền vào cây giống hệt nhau trên linux / unix


22

tôi có một cây các tập tin với sự cho phép chính xác. sau đó tôi có một cây giống hệt (filewise) (với nội dung tệp khác nhau khó khăn) với quyền sai.

Làm thế nào tôi có thể chuyển bố trí quyền từ cây này sang cây khác?

Câu trả lời:


8

Nó có thể được thực hiện với dòng shell sau:

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

chỉ cần đặt đúng giá trị cho các biến D1 và D2, trỏ chúng vào thư mục nguồn và đích, chạy và các thư mục sẽ có quyền đồng bộ hóa.


1
Điều này giả định rằng stat là hiện tại. Đáng tiếc là tôi đã thấy rằng chỉ số lệnh thường không có mặt.
Mei

@David, tôi không biết hệ thống thiếu stat như vậy. Nhưng việc sử dụng phiên bản "bát phân ls" sau đây khá phù hợp và phù hợp với giải pháp đã cho phù hợp: alias ols = "ls -la | awk '{k = 0; for (i = 0; i <= 8; i ++) k + = ((đế (\ $ 1, i + 2,1) ~ / [rwx] /) * 2 ^ (8-i)); if (k) printf (\ "% 0o \", k); print} ' "
drAlberT

Phá vỡ khi bất kỳ đường dẫn nào có chứa bất kỳ loại ký tự đặc biệt nào (khoảng trắng, bắt đầu bằng dấu gạch ngang, v.v.).
n.st

31

Tôi vừa học được một cách mới và đơn giản để thực hiện điều này:

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

Điều này sẽ tạo ra một danh sách với tất cả các quyền và quyền sở hữu.

Sau đó đi đến một cấp trên đích và khôi phục quyền với

setfacl --restore=/root/perms.acl

Lý do bạn phải ở một cấp trên là tất cả các đường dẫn trong perms.acl đều tương đối.

Nên làm tận gốc.


đây là một cách rất đơn giản và đơn giản để sao lưu và khôi phục quyền. Tuy nhiên, lưu ý rằng getfaclsetfaclkhông nhất thiết phải có mặt trên tất cả các hệ thống.
the-wợi

Là chính xác để có .actrong lệnh đầu tiên và .acltrong thứ hai?
sfarbota

1
@sfarbota: Không, đó là một lỗi đánh máy! Sửa chữa ngay. Cảm ơn đã chỉ ra điều đó.
tuyên bố

13

Nếu bạn có nguồn và mệnh, bạn có thể đồng bộ hóa quyền của mình với rsync -ar --perms source/ dest

Nó sẽ không chuyển dữ liệu, chỉ là quyền ...


1
Không, nó sẽ sao chép các tập tin nếu dấu thời gian khác nhau
yawniek

@yawniek Các -r--permslà cần thiết, nhưng điều này vẫn perms đồng bộ nếu họ là điều duy nhất mà là khác nhau (đó là những gì bạn nói trong câu hỏi, nếu cây không thực sự giống hệt bạn không nên nói rằng họ).
Chris S

ok tôi đã không rõ ràng, tôi có nghĩa là cấu trúc cây là như nhau.
yawniek

12

Một điều bạn có thể làm là sử dụng lệnh find để xây dựng một tập lệnh với các lệnh bạn cần để sao chép các quyền. Dưới đây là một ví dụ nhanh, bạn có thể làm được nhiều hơn với các tùy chọn printf khác nhau, bao gồm cả chủ sở hữu, id nhóm, v.v.

$ 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
Tôi nghi ngờ đối số -printf cần tìm là phần mở rộng GNU? HP-UX tìm thấy không có nó.
Mei

1
Ngay cả khi không có tùy chọn printf để tìm, người ta có thể sử dụng tùy chọn ls (hoặc tệ nhất là chuyển sang xargs ls -l) và lưu vào một tệp. Một hoặc hai phút tìm kiếm và thay thế, và một người sẽ có một tập lệnh với chmod cho mỗi tệp.
mpez0

0

Hai lối:

  1. Nếu nó hoạt động trên thương hiệu UNIX của bạn: cp -ax / src / Dest
  2. Hoặc nếu không, đây là phiên bản di động: (cd / src && tar cpf -.) | (cd / dst && tar xpf -)

(trong trường hợp sau / dst phải tồn tại)

Chỉnh sửa: xin lỗi, tôi đọc sai. Không phải những gì bạn yêu cầu.


Điều đáng nói là -a (để lưu trữ) là một bổ sung GNU cho cp, tôi chưa bao giờ thấy nó trên bất kỳ hệ thống nào khác. Nó chỉ viết tắt cho -dpR (không có quyền tham chiếu, đệ quy, bảo toàn quyền). Các tùy chọn R và p nên trong bất kỳ phiên bản của cp
theotherreceive

0

Tôi nghĩ rằng tôi sẽ viết một kịch bản perl để làm điều đó. Cái gì đó như:

#!/usr/bin/perl -nw

my $dir = $_;
my $mode = stat($dir)[2];
my $pathfix = "/some/path/to/fix/";
chmod $mode, $pathfix . $dir;

Sau đó làm một cái gì đó như thế này:

cd /some/old/orig/path/ ; find . -type d | perlscript

Tôi đã viết nó ra khỏi đỉnh đầu của tôi, và nó đã không được thử nghiệm; Vì vậy, hãy kiểm tra nó trước khi bạn để nó chạy tràn lan. Điều này chỉ sửa các quyền trên các thư mục tồn tại; nó sẽ không thay đổi quyền trên các tập tin, cũng sẽ không tạo các thư mục bị thiếu.


0

Tôi nghĩ ra cái này:

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

Nó không phải là bằng chứng đạn hoàn toàn, nhưng làm những gì tôi cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.