Cara standar untuk menduplikasi izin file

10

Saya mencoba menemukan cara POSIX standar untuk menduplikasi izin satu file ke file lain. Pada sistem GNU ini mudah:

[alexmchale@bullfrog ~]$ ls -l hardcopy.*
-rw-r--r-- 1 alexmchale users 2972 Jul  8 20:40 hardcopy.1
---------- 1 alexmchale users 2824 May 14 13:45 hardcopy.4
[alexmchale@bullfrog ~]$ chmod --reference=hardcopy.1 hardcopy.4
[alexmchale@bullfrog ~]$ ls -l hardcopy.*
-rw-r--r-- 1 alexmchale users 2972 Jul  8 20:40 hardcopy.1
-rw-r--r-- 1 alexmchale users 2824 May 14 13:45 hardcopy.4

Sayangnya, flag --reference to chmod adalah opsi yang tidak standar. Jadi itu untuk tujuan saya. Saya lebih suka itu menjadi satu-liner, tapi itu tidak perlu. Pada akhirnya, itu harus dalam sintaks POSIX sh.

Alex
sumber

Jawaban:

7

Satu godaan adalah mengurai ls. Hindari godaan itu .

Yang berikut ini sepertinya berhasil, namun penuh dengan Kluge. Itu bergantung pada cpmempertahankan izin dari file target. Untuk demo ini, file "templat" harus belum ada.

  • Salin file dengan izin yang Anda inginkan ke file baru
  • Salin file yang ingin Anda ubah ke file yang dibuat pada langkah sebelumnya
  • Hapus file asli yang ingin Anda ubah
  • Ubah nama file perantara menjadi nama file yang akan diubah

Demo:

$ echo "contents of has">has
$ echo "contents of wants">wants
$ chmod ug+x has     # just so it's different - represents the desired permissions
$ cp has template
$ cat has
contents of has
$ cat wants
contents of wants
$ cat template
contents of has
$ ls -l has wants template
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 16 2010-07-31 09:23 template
-rw-r--r-- 1 user user 18 2010-07-31 09:22 wants
$ cp wants template
$ ls -l has wants template
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 18 2010-07-31 09:24 template
-rw-r--r-- 1 user user 18 2010-07-31 09:22 wants
$ cat template
contents of wants
$ rm wants
$ mv template wants
$ ls -l has wants
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 18 2010-07-31 09:24 wants
$ cat has
contents of has
$ cat wants
contents of wants
Dijeda sampai pemberitahuan lebih lanjut.
sumber
Nah, itu pendekatan yang menarik. Saya akan menguji ini dan melihat seberapa baik kerjanya terhadap berbagai server. Bagi saya sepertinya akan melakukan trik.
Alex
@Alex: pastikan untuk mengujinya dengan kepemilikan file juga, jika itu yang menjadi perhatian.
Dijeda sampai pemberitahuan lebih lanjut.
Perintah cp pertama cp has template,, harus digunakan cp -puntuk mempertahankan mode dan atribut kepemilikan.
mernst
@mernst: Itu hanya diperlukan untuk yang pertama cpjika pemilik / grup file (misalnya "pengguna") berbeda dari yang melakukan penyalinan (misalnya root).
Dijeda sampai pemberitahuan lebih lanjut.
@ Dennis Willamson: OK, tapi itu sebuah kemungkinan dan saya tidak melihat adanya kerugian untuk menggunakannya di cp -psana.
Pertama
12

Anda dapat menggunakan statperintah untuk mendapatkan izin file:

  • Sintaks Mac OS X (BSD):

    chmod `stat -f% A fileWithPerm` fileToSetPerm

  • Sintaks Linux (tidak yakin):

    chmod `stat -c% a fileWithPerm` fileToSetPerm

The ` simbol backquote a.

Studer
sumber
1
Saya tidak berpikir statdiperlukan oleh POSIX. Ini sering tidak tersedia.
Dijeda sampai pemberitahuan lebih lanjut.
stat (baris perintah) bukan POSIX, dan tidak portabel. Dennis ++
jim mcnamara
1

Utilitas ACL getfacl dan setfacl dapat digunakan untuk tujuan ini, tapi saya tidak tahu apakah POSIX ini cukup sesuai. Paling tidak berfungsi di FreeBSD 8.0 dan Linux, tetapi di sisi lain orang mungkin harus menginstal utilitas ACL.

Dari halaman manual:

getfacl file1 | setfacl -b -n -M - file2
Copy ACL entries from file1 to file2.

Saya pikir getfacl dan setfacl dapat beroperasi juga izin file standar selain ACL.

Janne Pikkarainen
sumber
ACL dan semacamnya didefinisikan oleh POSIX khusus implementasi, jadi tidak diperlukan untuk kepatuhan.
Dijeda sampai pemberitahuan lebih lanjut.
0

cp -p akan mempertahankan izin file.

pengguna31894
sumber
1
Itu sebabnya teknik dalam jawaban saya ( tidak menggunakan -p) bekerja untuk apa yang diinginkan OP yaitu untuk menduplikasi izin untuk file yang berbeda , bukan duplikat file.
Dijeda sampai pemberitahuan lebih lanjut.
0

Satu cara yang mudah dibawa-bawa bukan utilitas standar - Anda harus memanggil stat () di file template, kemudian chmod () pada file tujuan. Ini berarti menggunakan bahasa seperti C atau bahasa lain yang banyak digunakan seperti perl.

Izin akses file ditentukan dalam st_mode anggota strat stat oleh 0007777 bit. Solusi Dennis benar, jika sedikit berat pada I / O, jadi untuk file yang sangat besar mungkin gagal:

cp has template

Pertimbangkan contoh tidak siap-produksi ini:

#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

mode_t 
getperm(const char *template_file)
{
    struct stat st;
    if(stat(template_file, &st)==-1)
    {
       perror("Cannot stat file");
       exit(1);
    }
    return st.st_mode;
}

int main(int argc, char **argv)
{    
    mode_t mode=getperm(argv[1]);
    int i=0;
    for(i=2; argv[i]!=NULL; i++)    
    {
       if(chmod(argv[i], mode)==-1)
          fprintf(stderr, "Permissions failed on %s:\n\t%s\n",
              argv[i], strerror(errno));
    }       
    return 0;
}
jim mcnamara
sumber