Linux / unix'te izinleri aynı ağaca kopyala


22

Doğru izne sahip bir dosya ağacım var. Sonra yanlış izinleri (filewise) özdeş bir ağaç (farklı dosya içeriğiyle zor) var.

İzin düzenini bir ağaçtan diğerine nasıl aktarabilirim?

Yanıtlar:


8

Aşağıdaki kabuk çizgisiyle yapılabilir:

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

basitçe D1 ve D2 değişkenleri için doğru değeri ayarlayın, bunları kaynak ve hedef dizinlere yönlendirin, çalıştırın ve dirs senkronize izinlere sahip olacaktır.


1
Bu stat olduğunu varsayar. Ne yazık ki maalesef, stat stat komutunun genellikle bulunmadığını öğrendim.
Mei,

@David, stat eksik bir sistem bilmiyorum. Ancak aşağıdaki "sekizlik ls" versiyonunu kullanmak ve verilen çözümü buna göre kullanmak oldukça önemlidir: alias ols = "ls -la | awk '{k = 0; (i = 0; i <= 8; i ++) k + = ((substr (\ $ 1, i + 2,1) ~ / [rwx] /) * 2 ^ (8-i)); eğer (k) printf (\ "% 0o \", k); print} ' "
drAlberT

Sonları herhangi katılan yolu içeren herhangi özel karakteri (boşluk, tire ile başlar, vs) çeşit.
n.st

31

Bunu başarmanın yeni ve basit bir yolunu öğrendim:

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

Bu, tüm izin ve sahipliklere sahip bir liste oluşturur.

Ardından hedefin üzerindeki bir seviyeye gidin ve izinleri geri yükleyin.

setfacl --restore=/root/perms.acl

Yukarıda bir seviye olmanızın nedeni, perms.acl içindeki tüm yolların göreceli olmasıdır.

Kök olarak yapılmalı.


bu, izinleri yedeklemek ve geri yüklemek için çok basit ve basit bir yoldur. Ancak bunu unutmayın getfaclve setfacltüm sistemlerde mutlaka bulunmaz.
the wabbit

.acİlk komutta ve .aclikincide olmak doğru mu?
sfarbota

1
@sfarbota: Hayır, yazım hatası oldu! Şimdi düzeltildi. Gösterdiğin için teşekkürler.
marlar

13

Kaynağa ve desteye sahipseniz, izinlerinizi senkronize edebilirsiniz. rsync -ar --perms source/ dest

Verileri aktarmayacak, sadece izinleri ...


1
hayır, zaman damgaları farklıysa dosyaları kopyalayacaktır
yawniek

@yawniek Gereksiz -rve --permsgereksiz, ancak bu yine de farklı olan tek şeyse izin verir (eğer Soru'da söylediğiniz şey; ağaçlar gerçekte özdeş değilse, öyle olduklarını söylememeliydiniz).
Chris S

Tamam o zaman net değildim, demek istedim ki ağaç yapısı aynıydı.
yawniek

12

Yapabileceğiniz bir şey , izinleri kopyalamanız için gereken komutları içeren bir komut dosyası oluşturmak için find komutunu kullanmaktır . İşte hızlı bir örnek, sahibi, grup kimliğini vb. Dahil olmak üzere çeşitli printf seçenekleriyle daha fazlasını yapabilirsiniz.

$ 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 argümanını bulmak için GNU eklentisi olduğundan şüpheleniyorum. HP-UX bulmak buna sahip değil.
Mei,

1
Printf seçeneği bulunmasa bile, bir kişi ls seçeneğini kullanabilir (veya en kötüsü ls-lar'a pipoyla) ve bir dosyaya kaydedebilir. Bir veya iki dakika ara ve değiştir ve birinin her dosya için chmod içeren bir betiği olacak.
mpez0

0

İki yol:

  1. UNIX markanız üzerinde çalışıyorsa: cp -ax / src / dest
  2. Ya da değilse, bu taşınabilir versiyondur: (cd / src && tar cpf -.) | (cd / dst && tar xpf -)

(İkinci durumda / dst mevcut olmalıdır)

Düzenleme: üzgünüm, yanlış okudum. İstediğin gibi değil.


-A (arşiv için) cp'ye GNU ilavesi olduğunu söylemeye değer, başka bir sistemde hiç görmedim. -DpR için sadece kısa (referans yok, özyinelemeli, izinleri koru). R ve p seçenekleri
cp'nin

0

Sanırım bunu yapmak için bir perl betiği yazardım. Gibi bir şey:

#!/usr/bin/perl -nw

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

O zaman şöyle bir şey yap:

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

Bunu başımın üstünden yazdım ve test edilmedi; Bu yüzden, hiddetli çalışmasına izin vermeden önce kontrol edin. Bu yalnızca var olan dizinlerdeki izinleri düzeltir; dosyalar üzerindeki izinleri değiştirmeyecek, eksik dizinler yaratamayacak.


0

Bununla geldim:

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

Tamamen kurşun geçirmez değil, ihtiyacım olanı yapıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.