Modo standard per duplicare le autorizzazioni di un file


10

Sto cercando di trovare un modo POSIX standard per duplicare le autorizzazioni di un file su un altro file. Su un sistema GNU questo è facile:

[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

Sfortunatamente, il flag --reference su chmod è un'opzione non standard. Quindi questo è fuori per i miei scopi. Preferirei che fosse un one-liner, ma non è necessario. In definitiva, deve essere nella sintassi sh POSIX.

Risposte:


7

Una tentazione è di analizzare ls. Evita quella tentazione .

Quanto segue sembra funzionare, tuttavia è pieno di Kluge. Si basa sul cpmantenimento delle autorizzazioni del file di destinazione. Per questa demo, il file "modello" non deve già esistere.

  • Copia il file con le autorizzazioni che desideri in un nuovo file
  • Copia il file che desideri modificare nel file creato nel passaggio precedente
  • Rimuovere il file originale che si desidera modificare
  • Rinominare il file intermedio con il nome del file da modificare

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

Questo è un approccio interessante. Ho intenzione di testarlo e vedere come funziona su vari server. Mi sembra che farà il trucco.
Alex

@Alex: assicurati di testarlo anche con la proprietà del file, se questo è un problema.
In pausa fino a ulteriore avviso.

Il primo comando cp cp has template, dovrebbe usare cp -pper preservare la modalità e gli attributi di proprietà.
mernst,

@mernst: Questo è necessario solo per il primo cpse il proprietario / gruppo del file (ad esempio "utente") è diverso da quello che sta eseguendo la copia (ad esempio root).
In pausa fino a ulteriore avviso.

@Dennis Willamson: OK, ma questa è una possibilità e non vedo alcun aspetto negativo nell'utilizzare cp -plì.
mernst

12

È possibile utilizzare il statcomando per ottenere l'autorizzazione del file:

  • Sintassi di Mac OS X (BSD):

    chmod `stat -f% A fileWithPerm` fileToSetPerm

  • Sintassi di Linux (non sicuro):

    chmod `stat -c% a fileWithPerm` fileToSetPerm

Il simbolo ` è un backquote.


1
Non credo statsia richiesto da POSIX. Spesso non è disponibile.
In pausa fino a ulteriore avviso.

stat (riga di comando) non è POSIX e non è portatile. Dennis ++
jim mcnamara,

1

Le utility ACL getfacl e setfacl possono essere utilizzate per questo scopo, ma non so se questo POSIX sia abbastanza conforme. Funziona almeno in FreeBSD 8.0 e Linux, ma d'altra parte potrebbe essere necessario installare i programmi di utilità ACL.

Dalla pagina man:

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

Penso che getfacl e setfacl possano operare anche permessi di file standard oltre agli ACL.


ACL e simili sono definiti da POSIX specifici per l'implementazione, quindi non sono richiesti per la conformità.
In pausa fino a ulteriore avviso.

0

cp -p conserverà i permessi dei file.


1
Ecco perché la tecnica nella mia risposta (di non usare -p) funziona per ciò che l'OP vuole, ovvero duplicare le autorizzazioni per un file diverso , non un duplicato del file.
In pausa fino a ulteriore avviso.

0

Un modo semplice e portatile non è un'utilità standard: dovresti chiamare stat () sul file template, quindi chmod () sui file di destinazione. Questo significa usare un linguaggio come C o un altro linguaggio ampiamente usato come il perl.

Le autorizzazioni di accesso al file sono specificate nel membro struct stat st_mode dai bit 0007777. La soluzione di Dennis è corretta, anche se un po 'pesante su I / O, quindi per file molto grandi potrebbe non riuscire:

cp has template

Considera questo esempio non pronto per la produzione:

#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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.