Cadangkan dan pulihkan izin file

17

Apakah ada cara untuk mencadangkan dan mengembalikan kepemilikan dan izin file (hal-hal yang dapat diubah dengan chowndan chmod)?

Anda dapat melakukan ini di Windows menggunakan icacls .

Bagaimana dengan daftar kontrol akses?

Leandand00
sumber
Akan membantu jika Anda menyatakan distro mana yang Anda gunakan, karena distro yang berbeda menggunakan manajer paket yang berbeda.
garethTheRed
@garethTheRed, apakah itu juga tergantung pada fs yang digunakan, atau hanya distro?
leeand00
1
Saya ragu itu akan tergantung pada sistem file.
garethTheRed
Sampai sekarang, tidak ada jawaban yang sempurna.
kittygirl

Jawaban:

24

Anda dapat melakukan ini dengan perintah dari paket acl (yang seharusnya tersedia di semua distribusi utama, tetapi mungkin tidak menjadi bagian dari instalasi basis). Mereka mencadangkan dan mengembalikan ACL ketika ACL hadir, tetapi mereka juga bekerja untuk izin dasar bahkan pada sistem yang tidak mendukung ACL.

Untuk mencadangkan izin di direktori saat ini dan subdirektori secara rekursif:

getfacl -R . >permissions.facl

Untuk mengembalikan izin:

setfacl --restore=permissions.facl
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Hmm. Saya benar - benar perlu membaca tentang ACL.
roaima
1
Dalam file yang dihasilkan, apakah mereka relatif terhadap direktori juga?
leeand00
2
@ leeand00 Ya, file yang dihasilkan selalu menggunakan nama file relatif.
Gilles 'SO- stop being evil'
@ Gilles, berdasarkan file unix.stackexchange.com/questions/364517/… setfacl maka tidak bisa chmodlagi, mungkin akan menyebabkan konflik?
kittygirl
1
@ kittygirl Saya tidak tahu apa yang Anda minta. Apa yang dimaksud dengan "file setfacl kemudian tidak dapat chmod lagi"? Apa hubungannya ini dengan unix.stackexchange.com/questions/364517/… ? Konflik apa?
Gilles 'SANGAT berhenti menjadi jahat'
2

Saya tidak tahu apa-apa "dari rak" yang akan melakukan ini. Berikut ini skrip pemula untuk Anda, yang akan menangani izin dasar. Itu tidak menangani ACL deskripsi apa pun - tetapi Pertanyaan Anda secara eksplisit mengecualikannya. (Ini juga akan gagal pada nama file patologis - yang dimulai dengan spasi putih, atau mengandung karakter yang tidak dapat dicetak.)

Simpan izinnya

find * -depth -exec stat --format '%a %u %g %n' {} + >/tmp/save-the-list

Kembalikan izin

while read PERMS OWNER GROUP FILE
do
    chmod "$PERMS" "$FILE"
    chown "${OWNER}:${GROUP}" "$FILE"
done </tmp/save-the-list
roaima
sumber
maksud Anda ACL juga akan gagal pada nama file patologis?
kittygirl
@ kittygirl Saya tidak menyertakan pemrosesan ACL di scriptlet karena OP secara eksplisit mengecualikan mereka dari persyaratan. Anda dapat menambahkan apa yang Anda suka, mengingat bahwa kode tersebut tidak terlalu kuat (lihat komentar yang menggambarkan nama file patologis).
roaima
Saya menemukan masalah: tidak dapat menemukan .htaccess, gitignore...
kittygirl
0
#!/bin/bash
# prepare files
home="/home/exchange"
cd $home
>acl
echo "#!/bin/bash">recovery_acl.sh
echo "cd $home">>recovery_acl.sh
f='./'
# create acl file sorted by dir_level
for i in `seq 0 15`;do
  find . -mindepth $i -maxdepth $i -type d -exec getfacl {} +|grep -E '*UTS|file:'>>acl
done
sed -i 's/default\:user/\-dm\ u/g' acl
sed -i 's/default\:group/\-dm\ g/g' acl
sed -i 's/user/\-m\ u/g' acl
sed -i 's/group/\-m\ g/g' acl
sed -i 's/\#\ file\:\ /\.\//g' acl
sed -i 's,\\,\\\\,g' acl

while IFS='' read -r line ; do
  # grep dir name
  if echo "$line" | grep -q "$f" ; then
    dir="$line"
    continue
  fi
  echo setfacl $line '"'$dir'"'>>recovery_acl.sh
  # grep non def acl (for files)
  if echo "$line" | grep -q '\-m' ; then
    echo setfacl $line '"'$dir'"'/*>>recovery_acl.sh
  fi
done < "acl"

sed -i "s/\\\134/\\\\\\\134/g" recovery_acl.sh
sed -i "s/\\\040/\\\\ /g" recovery_acl.sh

Script bash ini hanya mendapatkan acl dirs (dalam kasus saya file acls = dir (parent) acl) Setelah eksekusi script, akan menciptakan "recovery_acl.sh" lainnya.

Saat memulihkan Kesalahan seperti "Tidak ada file atau direktori" berarti dir itu kosong atau dirname memiliki dua spasi lebih.

Terentev Maksim
sumber