Standardmethode zum Duplizieren der Berechtigungen einer Datei

10

Ich versuche, eine Standard-POSIX-Methode zu finden, um die Berechtigungen einer Datei in eine andere Datei zu duplizieren. Auf einem GNU-System ist dies einfach:

[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

Leider ist das Flag --reference to chmod keine Standardoption. Das ist also für meine Zwecke. Ich würde es vorziehen, ein Einzeiler zu sein, aber das ist nicht notwendig. Letztendlich muss es in der POSIX sh-Syntax sein.

Alex
quelle

Antworten:

7

Eine Versuchung ist zu analysieren ls. Vermeiden Sie diese Versuchung .

Das Folgende scheint zu funktionieren, aber es ist voll von Kluge. Es setzt cpvoraus, dass die Berechtigungen der Zieldatei erhalten bleiben. Für diese Demo darf die Datei "Vorlage" noch nicht vorhanden sein.

  • Kopieren Sie die Datei mit den gewünschten Berechtigungen in eine neue Datei
  • Kopieren Sie die Datei, die Sie ändern möchten, in die im vorherigen Schritt erstellte Datei
  • Entfernen Sie die Originaldatei, die Sie ändern möchten
  • Benennen Sie die Zwischendatei in den Namen der zu ändernden Datei um

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
Bis auf weiteres angehalten.
quelle
Das ist ein interessanter Ansatz. Ich werde dies testen und sehen, wie gut es gegen verschiedene Server funktioniert. Es scheint mir, als würde es den Trick machen.
Alex
@Alex: Stellen Sie sicher, dass Sie es auch mit Dateieigentum testen, wenn dies ein Problem darstellt.
Bis auf weiteres angehalten.
Der erste Befehl cp cp has templatesollte verwendet werden cp -p, um die Modus- und Besitzattribute beizubehalten.
mernst
@mernst: Dies ist nur für den ersten erforderlich, cpwenn sich der Eigentümer / die Gruppe der Datei (z. B. "Benutzer") von demjenigen unterscheidet, der das Kopieren durchführt (z. B. root).
Bis auf weiteres angehalten.
@ Tennis Willamson: OK, aber das ist eine Möglichkeit und ich sehe keinen Nachteil bei der Verwendung cp -pdort.
mernst
12

Mit dem statBefehl können Sie die Dateiberechtigung abrufen:

  • Mac OS X (BSD) -Syntax:

    chmod `stat -f% A fileWithPerm` fileToSetPerm

  • Linux-Syntax (nicht sicher):

    chmod `stat -c% a fileWithPerm` fileToSetPerm

Das Symbol ` ist ein Backquote.

Studer
quelle
1
Ich denke nicht, dass statPOSIX dies erfordert. Es ist oft nicht verfügbar.
Bis auf weiteres angehalten.
stat (Befehlszeile) ist nicht POSIX und nicht portabel. Dennis ++
Jim Mcnamara
1

Zu diesem Zweck können die ACL-Dienstprogramme getfacl und setfacl verwendet werden, aber ich weiß nicht, ob dieses POSIX- System kompatibel genug ist. Funktioniert zumindest unter FreeBSD 8.0 und Linux, andererseits müssen möglicherweise die ACL-Dienstprogramme installiert werden.

Von der Manpage:

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

Ich denke, getfacl und setfacl können neben ACLs auch Standard-Dateiberechtigungen ausführen.

Janne Pikkarainen
quelle
ACLs und dergleichen, die von POSIX definiert werden, sind implementierungsspezifisch und daher für die Konformität nicht erforderlich.
Bis auf weiteres angehalten.
0

cp -p behält die Dateiberechtigungen bei.

user31894
quelle
1
Aus diesem Grund funktioniert die Technik in meiner Antwort ( nicht zu verwenden -p) für das, was das OP wünscht, nämlich das Duplizieren von Berechtigungen für eine andere Datei, nicht für ein Duplikat der Datei.
Bis auf weiteres angehalten.
0

Ein tragbarer, unkomplizierter Weg ist kein Standarddienstprogramm. Sie müssten stat () für die Vorlagendatei und chmod () für die Zieldatei (en) aufrufen. Dies bedeutet, eine Sprache wie C oder eine andere weit verbreitete Sprache wie Perl zu verwenden.

Die Dateizugriffsberechtigungen werden im Mitglied struct stat st_mode durch die 0007777-Bits angegeben. Dennis 'Lösung ist richtig, wenn die E / A etwas schwer ist. Bei wirklich großen Dateien kann dies fehlschlagen:

cp has template

Betrachten Sie dieses nicht produktionsfertige Beispiel:

#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
quelle