Skopiuj uprawnienia do identycznego drzewa w systemie Linux / UNIX


22

Mam drzewo plików z prawidłowymi uprawnieniami. potem mam (identyczne) drzewo (z trudną inną zawartością pliku) z niewłaściwymi uprawnieniami.

jak mogę przenieść układ uprawnień z jednego drzewa do drugiego?

Odpowiedzi:


8

Można to zrobić za pomocą następującej linii powłoki:

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

po prostu ustaw odpowiednią wartość dla zmiennych D1 i D2, wskaż je na katalogach źródłowym i docelowym, uruchom, a katalogi będą miały zsynchronizowane uprawnienia.


1
Zakłada się, że statystyki są obecne. Niestety zauważyłem, że statystyki poleceń często nie występują.
Mei

@ David, nie wiem o takim systemie pozbawionym statystyk. Ale dość trywialne jest użycie następującej wersji „octal ls” i odpowiednie dostosowanie podanego rozwiązania: alias ols = "ls -la | awk '{k = 0; for (i = 0; i <= 8; i ++) k + = (((substr (\ $ 1, i + 2,1) ~ / [rwx] /) * 2 ^ (8-i)); if (k) printf (\ "% 0o \", k); print} ' „
drAlberT

Łamie się, gdy dowolna zaangażowana ścieżka zawiera dowolny znak specjalny (biały znak, zaczyna się od myślników itp.).
n.

31

Właśnie nauczyłem się nowego i prostego sposobu na osiągnięcie tego:

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

Spowoduje to wygenerowanie listy ze wszystkimi uprawnieniami i prawami własności.

Następnie przejdź do jednego poziomu powyżej miejsca docelowego i przywróć uprawnienia za pomocą

setfacl --restore=/root/perms.acl

Powodem, dla którego musisz znajdować się o jeden poziom wyżej, jest to, że wszystkie ścieżki w pliku perms.acl są względne.

Powinny być wykonane jako root.


jest to bardzo prosty i prosty sposób na tworzenie kopii zapasowych i przywracanie uprawnień. Należy jednak pamiętać, że getfacli setfaclniekoniecznie są one obecne we wszystkich systemach.
the-wabbit

Czy poprawne jest mieć .acw pierwszym poleceniu i .aclw drugim?
sfarbota,

1
@sfarbota: Nie, to była literówka! Poprawione teraz. Dzięki za zwrócenie na to uwagi.
marlar

13

Jeśli masz źródło i miejsce docelowe, możesz zsynchronizować swoje uprawnienia z rsync -ar --perms source/ dest

Nie przeniesie danych, tylko uprawnienia ...


1
nie, skopiuje pliki, jeśli znaczniki czasu będą się różnić
ziewanie

@ yawniek The -ri --permssą zbędne, ale nadal synchronizują perms, jeśli są jedyną rzeczą, która jest inna (co powiedziałeś w pytaniu; jeśli drzewa nie są w rzeczywistości identyczne, nie powinieneś był powiedzieć, że były).
Chris S

ok, wtedy byłem niejasny, miałem na myśli, że struktura drzewa jest taka sama.
ziewanie

12

Jedną rzeczą, którą możesz zrobić, to użyć polecenia find do zbudowania skryptu z poleceniami potrzebnymi do skopiowania uprawnień. Oto szybki przykład, możesz zrobić o wiele więcej z różnymi opcjami printf, w tym uzyskać właściciela, identyfikator grupy i tak dalej.

$ 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
Podejrzewam, że argument -printf w celu znalezienia jest rozszerzeniem GNU? Wyszukiwarka HP-UX go nie ma.
Mei,

1
Nawet bez opcji printf do znalezienia, można użyć opcji ls (lub, w najgorszym przypadku, potokować do xargs ls -l) i zapisać w pliku. Minuta lub dwie wyszukiwania i zamiany, a jeden będzie zawierał skrypt z chmod dla każdego pliku.
mpez0

0

Dwie drogi:

  1. Jeśli działa na twojej marce UNIX: cp -ax / src / dest
  2. Jeśli nie, jest to wersja przenośna: (cd / src && tar cpf -.) | (cd / dst && tar xpf -)

(w tym ostatnim przypadku musi istnieć / dst)

Edycja: przepraszam, źle odczytałem. Nie to o co prosiłeś.


Warto wspomnieć, że -a (do archiwizacji) to dodatek GNU do cp, nigdy nie widziałem go w żadnym innym systemie. To po prostu skrót od -dpR (bez usuwania odniesień, rekurencji, zachowania uprawnień). Opcje R i p powinny być w dowolnej wersji cp
therereiveive

0

Myślę, że napisałbym do tego skrypt perla. Coś jak:

#!/usr/bin/perl -nw

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

Następnie zrób coś takiego:

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

Zapisałem to sobie z głowy i nie zostało to przetestowane; więc sprawdź to, zanim zacznie szaleć. To naprawia tylko uprawnienia do istniejących katalogów; nie zmieni uprawnień do plików ani nie utworzy brakujących katalogów.


0

Wymyśliłem to:

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

Nie jest w pełni kuloodporny, ale robi to, czego potrzebuję.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.