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.

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

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.


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.


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

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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.