Manière standard de dupliquer les autorisations d'un fichier

10

J'essaie de trouver un moyen POSIX standard de dupliquer les autorisations d'un fichier sur un autre fichier. Sur un système GNU, c'est simple:

[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

Malheureusement, le drapeau --reference de chmod est une option non standard. C'est donc à mes fins. Je préférerais que ce soit un monoplace, mais ce n'est pas nécessaire. En fin de compte, il doit être dans la syntaxe POSIX sh.

Alex
la source

Réponses:

7

Une tentation est d'analyser ls. Évitez cette tentation .

Ce qui suit semble fonctionner, mais il est plein de Kluge. Il repose sur la cpconservation des autorisations du fichier cible. Pour cette démo, le fichier "template" ne doit pas déjà exister.

  • Copiez le fichier avec les autorisations souhaitées dans un nouveau fichier
  • Copiez le fichier que vous souhaitez modifier dans le fichier créé à l'étape précédente
  • Supprimez le fichier d'origine que vous souhaitez modifier
  • Renommez le fichier intermédiaire par le nom du fichier à modifier

Démo:

$ 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
En pause jusqu'à nouvel ordre.
la source
Voilà une approche intéressante. Je vais tester cela et voir à quel point cela fonctionne avec différents serveurs. Il me semble que ça fera l'affaire.
Alex
@Alex: assurez-vous de le tester avec la propriété du fichier également, si cela vous inquiète.
pause jusqu'à nouvel ordre.
La première commande cp,, cp has templatedoit être utilisée cp -ppour conserver le mode et les attributs de propriété.
mernst
@mernst: Cela n'est nécessaire que pour le premier cpsi le propriétaire / groupe du fichier (par exemple "utilisateur") est différent de celui qui effectue la copie (par exemple root).
pause jusqu'à nouvel ordre.
@Dennis Willamson: OK, mais c'est une possibilité et je ne vois aucun inconvénient à l'utiliser cp -plà-bas.
mernst
12

Vous pouvez utiliser la statcommande pour obtenir l'autorisation de fichier:

  • Syntaxe Mac OS X (BSD):

    chmod `stat -f% A fileWithPerm` fileToSetPerm

  • Syntaxe Linux (pas sûr):

    chmod `stat -c% a fileWithPerm` fileToSetPerm

Le ` symbole est une citation arrière.

Studer
la source
1
Je ne pense pas que statPOSIX soit requis. Ce n'est souvent pas disponible.
pause jusqu'à nouvel ordre.
stat (ligne de commande) n'est pas POSIX et n'est pas portable. Dennis ++
jim mcnamara
1

Les utilitaires ACL getfacl et setfacl peuvent être utilisés à cette fin, mais je ne sais pas si ce POSIX est suffisamment compatible. Fonctionne au moins sous FreeBSD 8.0 et Linux, mais d'un autre côté, il peut être nécessaire d'installer les utilitaires ACL.

Depuis la page de manuel:

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

Je pense que getfacl et setfacl peuvent également utiliser des autorisations de fichiers standard en plus des ACL.

Janne Pikkarainen
la source
Les ACL et autres sont définis par POSIX est spécifique à l'implémentation, il n'est donc pas requis pour la conformité.
pause jusqu'à nouvel ordre.
0

cp -p préservera les autorisations de fichier.

user31894
la source
1
C'est pourquoi la technique dans ma réponse (de ne pas utiliser -p) fonctionne pour ce que l'OP veut, c'est-à-dire dupliquer les autorisations pour un fichier différent , pas un doublon du fichier.
pause jusqu'à nouvel ordre.
0

Une façon simple et portable n'est pas un utilitaire standard - vous devez appeler stat () sur le fichier modèle, puis chmod () sur le ou les fichiers de destination. Cela signifie utiliser un langage comme C ou un autre langage largement utilisé comme perl.

Les autorisations d'accès aux fichiers sont spécifiées dans le membre struct stat st_mode par les bits 0007777. La solution de Dennis est correcte, si elle est un peu lourde sur les E / S, donc pour les très gros fichiers, elle peut échouer:

cp has template

Considérez cet exemple non prêt pour la production:

#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
la source