Стандартный способ дублировать права доступа к файлу

10

Я пытаюсь найти стандартный способ POSIX для дублирования прав доступа одного файла к другому файлу. В системе GNU это легко:

[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

К сожалению, флаг --reference для chmod является нестандартной опцией. Так что это для моих целей. Я бы предпочел, чтобы он был однострочным, но в этом нет необходимости. В конечном счете, он должен быть в синтаксисе POSIX sh.

Alex
источник

Ответы:

7

Одно искушение - разобрать ls. Избегайте этого искушения .

Следующее, кажется, работает, однако оно полно Kluge. Он опирается на cpсохранение разрешений целевого файла. Для этой демонстрации файл «шаблон» не должен существовать.

  • Скопируйте файл с разрешениями, которые вы хотите, в новый файл
  • Скопируйте файл, который вы хотите изменить, в файл, созданный на предыдущем шаге.
  • Удалить исходный файл, который вы хотите изменить
  • Переименуйте промежуточный файл в имя файла, который нужно изменить.

Демо-версия:

$ 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
Приостановлено до дальнейшего уведомления.
источник
Теперь это интересный подход. Я собираюсь проверить это и посмотреть, насколько хорошо он работает с различными серверами. Мне кажется, это сработает.
Алекс
@Alex: не забудьте проверить его с правами собственности на файл, если это не проблема.
Приостановлено до дальнейшего уведомления.
Первая команда cp cp has templateдолжна использовать cp -pдля сохранения атрибутов режима и владельца.
Мернст
@mernst: Это необходимо только для первого, cpесли владелец / группа файла (например, «пользователь») отличается от того, кто выполняет копирование (например, root).
Приостановлено до дальнейшего уведомления.
@Dennis Willamson: ОК, но это возможно, и я не вижу никаких недостатков в использовании cp -pтам.
mernst
12

Вы можете использовать statкоманду для получения разрешения на файл:

  • Синтаксис Mac OS X (BSD):

    chmod `stat -f% A fileWithPerm` fileToSetPerm

  • Синтаксис Linux (не уверен):

    chmod `stat -c% a fileWithPerm` fileToSetPerm

` Символом является кавычка.

Studer
источник
1
Я не думаю, что statтребуется POSIX. Это часто не доступно.
Приостановлено до дальнейшего уведомления.
stat (командная строка) не является POSIX и не является переносимым. Деннис ++
Джим Макнамара
1

Для этой цели могут использоваться утилиты ACL getfacl и setfacl , но я не знаю, достаточно ли это POSIX-совместимо. Работает по крайней мере во FreeBSD 8.0 и Linux, но с другой стороны, возможно, придется установить утилиты ACL.

С man-страницы:

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

Я думаю, что getfacl и setfacl могут работать со стандартными правами доступа к файлам в дополнение к ACL.

Янне Пиккарайнен
источник
Списки ACL и т.п. определяются POSIX в зависимости от реализации, поэтому для обеспечения соответствия это не требуется.
Приостановлено до дальнейшего уведомления.
0

cp -p сохранит права доступа к файлам.

user31894
источник
1
Вот почему техника в моем ответе ( не использовать -p) работает для того, что хочет OP, а именно для дублирования разрешений для другого файла, а не для дубликата файла.
Приостановлено до дальнейшего уведомления.
0

Один портативный, простой способ не является стандартной утилитой - вам нужно вызвать stat () для файла шаблона, а затем chmod () для файла (ов) назначения. Это означает использование языка, подобного C, или другого широко используемого языка, такого как perl.

Права доступа к файлу указываются в элементе struct stat st_mode битами 0007777. Решение Денниса правильное, если оно немного тяжелое для ввода-вывода, поэтому для действительно больших файлов оно может дать сбой:

cp has template

Рассмотрим пример, не готовый к производству:

#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;
}
Джим Макнамара
источник