Unix: Apakah ada cara untuk "menyalin" izin file atau direktori?

14

Saya memiliki dua file dalam direktori. Yang satu memiliki izin yang benar dan yang lainnya tidak. Apakah ada cara saya bisa "menyalin" set izin dari satu file ke file lainnya?

Svish
sumber

Jawaban:

15

Versi GNU dari utilitas chmod dapat menyalin mode dari satu file ( RFile) ke yang lain ( file).

chmod --reference=RFile file

GNU coreutils ditemukan di sebagian besar distribusi Linux dan Cygwin, di antara tempat-tempat lain. Tidak semua implementasi chmod menyediakan opsi ini.

Jeremy L
sumber
Hm ... sepertinya ini seharusnya berfungsi, tetapi tidak didukung pada Mac OS X? Di sana saya hanya mendapatkan opsi ilegal ...
Svish
2
chmod bukan perintah bash builtin. itu adalah utilitas terpisah yang tersedia di banyak unix. yang --referencepilihan disertakan dalam versi GNU; OSX mungkin menggunakan chmod yang berasal dari BSD sebagai gantinya. OSX man chmod : developer.apple.com/Mac/library/documentation/Darwin/Reference/…
quack quixote
Svish, Anda mungkin mempertimbangkan untuk menginstal versi GNU melalui MacPorts.
Jeremy L
Hanya tahu bahwa itu akan berguna untuk disebutkan di sini bahwa cp -dpR <source-file> <dest-file>kehendak, saat menyalin file, copy perizinan serta file.r yang
LawrenceC
1

Saya datang dengan ini:

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

Ini bukan bukti peluru sepenuhnya, tetapi melakukan apa yang saya butuhkan.

Ikem Krueger
sumber
0

coba ini:

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

ini akan naik secara berulang dan chmod setiap file, jika dua direktori tidak cocok pada file Anda akan melihat banyak kesalahan "Tidak ada file atau direktori".

bersam
sumber
find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
Rick Sanchez
chmod: gagal mendapatkan atribut '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1': Tidak ada file atau direktori seperti itu chmod: gagal mendapatkan atribut dari '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1 / 111.txt ': Tidak ada file atau direktori chmod: gagal mendapatkan atribut' /home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/222.txt ': Tidak chmod file atau direktori tersebut: gagal mendapatkan atribut '/ home / myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/333.txt': Tidak ada file atau direktori seperti itu
Rick Sanchez
mengujinya pada 2 folder: test1 dan test2. masing-masing memiliki file yang sama 111/222 / 333.txt dengan izin yang berbeda. test1 memiliki yang standar. test2 memiliki 777 izin. ini adalah kesalahan yang saya dapatkan.
Rick Sanchez
0

Anda dapat menggunakan getfacluntuk mengambil daftar lengkap izin file, pemilik, grup, dan ACL tambahan (daftar kontrol akses).

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

Jika Anda menyimpan output itu ke file (misalnya acl.txt), Anda dapat mengembalikan dari format ini dengan setfacl --restore acl.txt. Jika Anda hanya ingin mengembalikan satu file, dan file itu memiliki nama file yang berbeda dengan aslinya, Anda akan ingin menggunakan setfacl --set-file acl.txt filename.txt(di mana filename.txtnama file baru).

Langkah

  1. Simpan izin asli ke acl.txt:

    $ getfacl filename.txt > acl.txt
    
  2. Timpa izin (untuk demonstrasi; ini hanya agar Anda dapat melihatnya memulihkannya di langkah berikutnya berfungsi)

    $ 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. Gunakan setfacluntuk mengembalikan izin yang benar dari acl.txt:

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

Nama file diambil dari # file:komentar yang dihasilkan oleh getfacl, jadi tidak perlu menentukannya di baris perintah.

Jika Anda ingin mengembalikan izin tersebut ke file lain, Anda dapat menggunakan --set-filealih-alih --restoreseperti itu:

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

Contoh

Jika Anda akhirnya menimpa izin pada beberapa file /usr, tetapi Anda tidak tahu file apa yang Anda timpa, Anda biasanya dapat memperbaikinya dengan mengembalikan dari sistem lain yang dikonfigurasi dengan cara yang sama.

  1. Izin cadangan dari sistem kerja (catatan: getfaclmenghasilkan jalur relatif, jadi pastikan Anda cdke lokasi yang konsisten di kedua mesin)

    # cd /
    # getfacl -R usr > /root/acls.txt
    
  2. Salin dump ACL ke sistem dengan izin yang rusak

    $ scp root@working-system:/root/acls.txt .
    $ scp acls.txt root@broken-system:/root/
    
  3. Kembalikan dump ACL untuk menimpa izin yang rusak dengan izin dari mesin yang dikenal baik

    # cd /
    # setfacl --restore /root/acls.txt
    
Score_Under
sumber