Standardowy sposób duplikowania uprawnień do pliku

10

Próbuję znaleźć standardowy sposób POSIX do duplikowania uprawnień jednego pliku do innego pliku. W systemie GNU jest to łatwe:

[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

Niestety flaga --reference na chmod jest niestandardową opcją. To jest moje przeznaczenie. Wolałbym, aby był to jeden liniowiec, ale nie jest to konieczne. Ostatecznie musi być w składni sh POSIX.

Alex
źródło

Odpowiedzi:

7

Jedną z pokus jest parsowanie ls. Unikajcie pokusy .

Poniższe wydaje się działać, ale jest pełne Kluge. Polega na cpzachowaniu uprawnień do pliku docelowego. W przypadku tej wersji demonstracyjnej plik „szablon” nie może już istnieć.

  • Skopiuj plik z uprawnieniami, które chcesz do nowego pliku
  • Skopiuj plik, który chcesz zmienić, do pliku utworzonego w poprzednim kroku
  • Usuń oryginalny plik, który chcesz zmienić
  • Zmień nazwę pliku pośredniego na nazwę pliku, który chcesz zmienić

Próbny:

$ 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
Wstrzymano do odwołania.
źródło
To interesujące podejście. Sprawdzę to i zobaczę, jak dobrze działa na różnych serwerach. Wydaje mi się, że to załatwi sprawę.
Alex
@Alex: upewnij się, że przetestowałeś to również z prawem własności pliku, jeśli jest to problem.
Wstrzymano do odwołania.
Pierwsze polecenie cp cp has template, powinno zostać użyte cp -pdo zachowania atrybutów trybu i własności.
poniedziałek
@mernst: Jest to konieczne tylko w cpprzypadku, gdy właściciel / grupa pliku (np. „użytkownik”) różni się od tego, który wykonuje kopiowanie (np. root).
Wstrzymano do odwołania.
@Dennis Willamson: OK, ale jest taka możliwość i nie widzę żadnych wad korzystania z cp -pniej.
poniedziałek
12

Możesz użyć statpolecenia, aby uzyskać uprawnienia do pliku:

  • Składnia Mac OS X (BSD):

    chmod `stat -f% A fileWithPerm` fileToSetPerm

  • Składnia systemu Linux (niepewna):

    chmod `stat -c% a fileWithPerm` fileToSetPerm

` Symbolem jest backquote.

Studer
źródło
1
Nie sądzę, że statjest to wymagane przez POSIX. Często nie jest dostępny.
Wstrzymano do odwołania.
stat (linia poleceń) nie jest POSIX i nie jest przenośna. Dennis ++
Jim mcnamara,
1

Do tego celu można użyć narzędzi ACL getfacl i setfacl , ale nie wiem, czy to wystarczająco zgodne z POSIX. Działa przynajmniej w FreeBSD 8.0 i Linux, ale z drugiej strony może być konieczne zainstalowanie narzędzi ACL.

Ze strony podręcznika:

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

Myślę, że getfacl i setfacl mogą również obsługiwać standardowe uprawnienia do plików oprócz list ACL.

Janne Pikkarainen
źródło
Listy ACL i takie są zdefiniowane przez POSIX, są specyficzne dla implementacji, więc nie są wymagane dla zgodności.
Wstrzymano do odwołania.
0

cp -p zachowa uprawnienia do plików.

użytkownik31894
źródło
1
Dlatego technika w moją odpowiedź (o nie przy użyciu -p) działa na jakie pragnienia OP, który ma powielać uprawnienia dla innego pliku, a nie duplikatu pliku.
Wstrzymano do odwołania.
0

Jeden przenośny, prosty sposób nie jest standardowym narzędziem - należy wywołać stat () w pliku szablonu, a następnie chmod () w plikach docelowych. Oznacza to używanie języka takiego jak C lub innego powszechnie używanego języka, takiego jak Perl.

Uprawnienia dostępu do pliku są określone w elemencie struct stat st_mode przez 0007777 bitów. Rozwiązanie Dennisa jest poprawne, jeśli jest nieco obciążone we / wy, więc w przypadku naprawdę dużych plików może się nie powieść:

cp has template

Rozważ ten nieprzygotowany do produkcji przykład:

#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
źródło