Unix: Dosya veya dizin izinlerini "kopyalamanın" bir yolu var mı?


14

Bir dizinde iki dosya var. Birinin doğru izinleri var ve diğerinin yok. İzin kümesini bir dosyadan diğerine kopyalamanın bir yolu var mı?

Yanıtlar:


15

Chmod yardımcı programının GNU sürümü , modu bir dosyadan ( RFile) diğerine ( file) kopyalayabilir .

chmod --reference=RFile file

GNU coreutils , diğer Linux dağıtımlarının ve Cygwin'in çoğunda bulunur. Tüm chmod uygulamaları bu seçeneği sunmaz .


Hm ... bunun çalışması gerekiyor gibi görünüyor, ancak Mac OS X'te desteklenmiyor mu? Orada sadece yasadışı seçenek alıyorum ...
Svish

2
chmod bir bash yerleşik komutu değildir. birçok unix üzerinde ayrı bir yardımcı programdır. --referenceseçenek GNU versiyonunda dahildir; OSX muhtemelen BSD kaynaklı bir chmod kullanıyor. OSX man chmod : developer.apple.com/Mac/library/documentation/Darwin/Reference/…
quack quixote

Ayrıca, GNU sürümlerini MacPorts üzerinden yüklemeyi düşünebilirsiniz.
Jeremy L

Sadece cp -dpR <source-file> <dest-file>bir dosyayı kopyalarken, izinleri ve dosyayı kopyalayacağından bahsetmenin yararlı olacağını düşündüm . R
LawrenceC

1

Ben 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, ama ihtiyacım olanı yapıyor.


0

bunu dene:

find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;

iki özniteliğin dosyalarla eşleşmemesi durumunda, bu tür özyinelemeli olarak artar ve her dosya için chmod olur.


find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
Rick Sanchez

chmod: '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1' özniteliklerini alamadı: Böyle bir dosya veya dizin yok chmod: '/ home / myubuntuuser / Desktop / test2 // özniteliklerini alamadı home / myubuntuuser / Desktop / test1 / 111.txt ': Böyle bir dosya veya dizin yok chmod:' /home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/222.txt 'özniteliklerini alamadı: Hayır böyle bir dosya veya dizin chmod: '/home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/333.txt' özniteliklerini alamadı: 12'de böyle bir dosya veya dizin yok
Rick Sanchez

2 klasörde test etti: test1 ve test2. her biri farklı izinlere sahip aynı 111/222 / 333.txt dosyalarına sahiptir. test1 varsayılan ayarlara sahiptir. test2'nin 777 izni var. bu aldığım hata.
Rick Sanchez

0

getfaclDosya izinlerinin, sahibinin, grubun ve ek EKL'lerin (erişim denetim listeleri) tam listesini almak için kullanabilirsiniz .

$ getfacl filename.txt
# file: filename.txt
# owner: score
# group: score
user::rw-
group::---
other::---

Bu çıktıyı bir dosyaya (örneğin acl.txt) kaydederseniz, ile bu formattan geri yükleyebilirsiniz setfacl --restore acl.txt. Yalnızca tek bir dosyayı geri yüklemek istiyorsanız ve bu dosyanın orijinalinden farklı bir dosya adı varsa, kullanmak isteyeceksiniz setfacl --set-file acl.txt filename.txt( filename.txtyeni dosya adı nerede ).

adımlar

  1. Orijinal izinleri şuraya kaydet acl.txt:

    $ getfacl filename.txt > acl.txt
    
  2. İzinlerin üzerine yazma (gösterim için; bu sadece bir sonraki adımda geri yüklemenin işe yaradığını görebilmeniz için)

    $ chmod 777 filename.txt
    $ sudo chown nobody:root filename.txt
    $ ls -l filename.txt
    -rwxrwxrwx 1 nobody root 0 Jan  8 14:24 filename.txt
    
  3. setfaclAşağıdakilerden doğru izinleri geri yüklemek için kullanın acl.txt:

    $ sudo setfacl --restore acl.txt
    $ ls -l filename.txt
    -rw------- 1 score score 0 Jan  8 14:24 filename.txt
    

Dosya adı, # file:tarafından oluşturulan yorumdan alınır getfacl, bu nedenle komut satırında belirtilmesine gerek yoktur.

Bu izinleri farklı bir dosyaya geri yüklemek istiyorsanız, --set-filebunun yerine şunu kullanabilirsiniz --restore:

$ setfacl --set-file acl.txt second_filename.txt

Misal

Bazı dosyalardaki izinlerin üzerine yazılır /usrancak hangi dosyaların üzerine yazdığınızı bilmiyorsanız, genellikle benzer şekilde yapılandırılmış başka bir sistemden geri yükleyerek düzeltebilirsiniz.

  1. Çalışma sisteminden yedekleme izinleri (not: getfaclgöreli yollar oluşturur, bu nedenle cdher iki makinede de tutarlı bir konuma sahip olduğunuzdan emin olun )

    # cd /
    # getfacl -R usr > /root/acls.txt
    
  2. ACL dökümünü kırık izinlerle sisteme kopyalayın

    $ scp root@working-system:/root/acls.txt .
    $ scp acls.txt root@broken-system:/root/
    
  3. Bilinen iyi makineden gelen izinlerle bozuk izinlerin üzerine yazmak için ACL dökümü

    # cd /
    # setfacl --restore /root/acls.txt
    
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.