Salin izin ke pohon identik di linux / unix


22

Saya memiliki pohon file dengan izin yang benar. maka saya punya (identik) pohon identik (dengan konten file yang berbeda tangguh) dengan izin salah.

bagaimana cara mentransfer tata letak izin dari satu pohon ke pohon lain?

Jawaban:


8

Ini dapat dilakukan dengan garis shell berikut:

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

cukup atur nilai yang tepat untuk variabel D1 dan D2, arahkan mereka ke direktori sumber dan tujuan, jalankan dan dirs akan memiliki izin dalam sinkronisasi.


1
Ini mengasumsikan bahwa stat hadir. Sayangnya, saya menemukan bahwa stat perintah sering tidak ada.
Mei

@ David, saya tidak tahu sistem seperti itu tidak memiliki stat. Tetapi cukup sepele untuk menggunakan versi "octal ls" berikut dan mengakomodasi solusi yang diberikan sesuai: alias ols = "ls -la | awk '{k = 0; untuk (i = 0; i <= 8; i ++) k + = ((substr (\ $ 1, i + 2,1) ~ / [rwx] /) * 2 ^ (8-i)); jika (k) printf (\ "% 0o \", k); print} ' "
drAlberT

Henti ketika jalur apa pun yang terlibat berisi karakter khusus apa pun (spasi putih, dimulai dengan tanda hubung, dll).
n.st

31

Saya baru belajar cara baru dan sederhana untuk mencapai ini:

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

Ini akan menghasilkan daftar dengan semua izin dan kepemilikan.

Lalu pergi ke satu tingkat di atas tujuan dan kembalikan izin dengan

setfacl --restore=/root/perms.acl

Alasan Anda harus satu tingkat di atas adalah bahwa semua jalur di perms.acl relatif.

Harus dilakukan sebagai root.


ini adalah cara yang sangat mudah dan sederhana untuk membuat cadangan dan memulihkan izin. Namun perlu dicatat bahwa getfacldan setfacltidak selalu ada pada semua sistem.
the-wabbit

Apakah benar memiliki .acperintah pertama dan .aclkedua?
sfarbota

1
@ sfarbota: Tidak, itu salah ketik! Diperbaiki sekarang. Terima kasih telah menunjukkannya.
marlar

13

Jika Anda memiliki sumber dan tujuan, Anda dapat menyinkronkan izin Anda dengan rsync -ar --perms source/ dest

Itu tidak akan mentransfer data, hanya izin ...


1
nope, itu akan menyalin file jika cap waktu berbeda
yawniek

@yawniek The -rdan --permsberlebihan, tetapi ini masih mensinkronkan perm jika mereka satu-satunya hal yang berbeda (yang Anda katakan dalam Pertanyaan; jika pohon tidak benar-benar identik, Anda seharusnya tidak mengatakan bahwa itu adalah).
Chris S

ok saya tidak jelas, maksud saya struktur pohonnya sama.
yawniek

12

Satu hal yang bisa Anda lakukan adalah menggunakan perintah find untuk membangun skrip dengan perintah yang Anda butuhkan untuk menyalin izin. Ini adalah contoh cepat, Anda dapat melakukan lebih banyak hal dengan berbagai opsi printf, termasuk mendapatkan pemilik, id grup, dan sebagainya.

$ 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
Saya curiga argumen -printf yang ditemukan adalah ekstensi GNU? HP-UX find tidak memilikinya.
Mei

1
Bahkan tanpa opsi printf untuk ditemukan, seseorang dapat menggunakan opsi ls (atau, paling buruk, pipe to xargs ls-l) dan menyimpan dalam file. Satu atau dua menit mencari dan mengganti, dan satu akan memiliki skrip dengan chmod untuk setiap file.
mpez0

0

Dua arah:

  1. Jika berfungsi pada merek UNIX Anda: cp -ax / src / dest
  2. Atau jika tidak, ini adalah versi portabel: (cd / src && tar cpf -.) | (cd / dst && tar xpf -)

(dalam kasus terakhir / dst harus ada)

Sunting: maaf, saya salah membaca. Bukan apa yang kamu minta.


Perlu disebutkan bahwa -a (untuk arsip) adalah tambahan GNU ke cp, saya belum pernah melihatnya di sistem lain. Ini hanya kependekan dari -dpR (tidak ada de-referensi, rekursif, mempertahankan izin). Opsi R dan p harus dalam versi cp
theotherreceive

0

Saya pikir saya akan menulis skrip perl untuk melakukannya. Sesuatu seperti:

#!/usr/bin/perl -nw

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

Kemudian lakukan sesuatu seperti ini:

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

Saya menulis ini dari atas kepala saya, dan belum diuji; jadi periksalah sebelum kamu membiarkannya merajalela. Ini hanya memperbaiki izin pada direktori yang ada; itu tidak akan mengubah izin pada file, juga tidak akan membuat direktori yang hilang.


0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.