Стандартний спосіб дублювання дозволів файлу


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 to chmod - це нестандартний варіант. Так що це для моїх цілей. Я вважаю за краще, щоб це був однолінійний, але це не обов'язково. Зрештою, він повинен бути в синтаксисі POSIX sh.

Відповіді:


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

@mernst: Це потрібно лише для першого, cpякщо власник / група файлу (наприклад, "користувач") відрізняється від того, хто виконує копіювання (наприклад, root).
Призупинено до подальшого повідомлення.

@Dennis Willamson: Гаразд, але це можливість, і я не бачу жодних недоліків використання cp -pтам.
mernst

12

Ви можете скористатися statкомандою для отримання дозволу на файл:

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

    chmod `stat -f% A fileWithPerm` файлToSetPerm

  • Синтаксис Linux (не впевнений):

    chmod `stat -c% a fileWithPerm` файлToSetPerm

Символ ` є зворотним котируванням.


1
Я не думаю stat, що POSIX вимагає. Це часто недоступно.
Призупинено до подальшого повідомлення.

stat (командний рядок) не є POSIX і не є портативним. Dennis ++
jim mcnamara

1

Для цієї мети можна використовувати утиліти ACL getfacl та setfacl , але я не знаю, чи достатньо цього POSIX сумісного. Працює принаймні у FreeBSD 8.0 та Linux, але з іншого боку, можливо, доведеться встановити утиліти ACL.

З чоловічої сторінки:

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

Я думаю, що getfacl і setfacl також можуть працювати стандартними дозволами на додаток до ACL.


ACL та таке, визначене POSIX, залежить від впровадження, тому його не потрібно для дотримання.
Призупинено до подальшого повідомлення.


0

Один переносний, простий спосіб - це не стандартна утиліта - вам потрібно буде зателефонувати stat () на шаблон файлу, а потім chmod () у файлі призначення. Це означає використовувати мову, як C, або іншу широко використовувану мову, як perl.

Дозволи на доступ до файлів задаються у члені struct 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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.