Unix: есть ли способ «скопировать» права доступа к файлу или каталогу?

14

У меня есть два файла в каталоге. Один имеет правильные разрешения, а другой нет. Есть ли способ, которым я могу «скопировать» набор разрешений из одного файла в другой?

Svish
источник

Ответы:

15

GNU-версия утилиты chmod может копировать режим из одного файла ( RFile) в другой ( file).

chmod --reference=RFile file

GNU coreutils встречается в большинстве дистрибутивов Linux и Cygwin среди других мест. Не все реализации chmod предоставляют эту возможность.

Джереми Л
источник
Хм ... похоже, это должно работать, но не поддерживается в Mac OS X? Там я получаю только нелегальный вариант ...
Свиш
2
chmod не является встроенной командой bash . это отдельная утилита, доступная на многих юниксах. --referenceопция включена в версии GNU; OSX, вероятно, использует вместо этого chmod , созданный с помощью BSD. OSX man chmod : developer.apple.com/Mac/library/documentation/Darwin/Reference/…
Quack Quixote
Свиш, вы можете рассмотреть возможность установки версий GNU через MacPorts.
Джереми Л
Просто подумал, что было бы полезно упомянуть здесь, что cp -dpR <source-file> <dest-file>при копировании файла будут копироваться разрешения, а также файл.r
LawrenceC
1

Я придумал это:

find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh

Это не полностью пуленепробиваемое, но делает то, что мне нужно.

Икем Крюгер
источник
0

попробуй это:

find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;

это будет происходить многократно и chmod для каждого файла, если два файла не совпадают в файлах, вы увидите много ошибок «Нет такого файла или каталога».

bersam
источник
find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
Рик Санчес
chmod: не удалось получить атрибуты '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1': нет такого файла или каталога chmod: не удалось получить атрибуты '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1 / 111.txt ': нет такого файла или каталога chmod: не удалось получить атрибуты' /home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/222.txt ': нет такой файл или каталог chmod: не удалось получить атрибуты '/home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/333.txt': нет такого файла или каталога
Рик Санчес
проверил это на 2 папках: test1 и test2. каждый из них имеет одинаковые файлы 111/222 / 333.txt с разными разрешениями. test1 имеет значения по умолчанию. test2 имеет 777 разрешений. это ошибка, которую я получаю.
Рик Санчес
0

Вы можете использовать getfaclдля получения полного списка прав доступа к файлу, владельца, группы и дополнительных ACL (списки контроля доступа).

$ getfacl filename.txt
# file: filename.txt
# owner: score
# group: score
user::rw-
group::---
other::---

Если вы сохраните этот вывод в файл (например acl.txt), вы можете восстановить из этого формата с помощью setfacl --restore acl.txt. Если вы хотите восстановить только один файл, и этот файл имеет имя файла, отличное от исходного файла, вы можете использовать его setfacl --set-file acl.txt filename.txt(где filename.txtновое имя файла).

меры

  1. Сохранить исходные разрешения для acl.txt:

    $ getfacl filename.txt > acl.txt
    
  2. Разрешения на перезапись (для демонстрации; это просто для того, чтобы вы могли видеть, что восстановление на следующем шаге работает)

    $ chmod 777 filename.txt
    $ sudo chown nobody:root filename.txt
    $ ls -l filename.txt
    -rwxrwxrwx 1 nobody root 0 Jan  8 14:24 filename.txt
    
  3. Используйте setfaclдля восстановления правильных разрешений из acl.txt:

    $ sudo setfacl --restore acl.txt
    $ ls -l filename.txt
    -rw------- 1 score score 0 Jan  8 14:24 filename.txt
    

Имя файла взято из # file:комментария, сгенерированного пользователем getfacl, поэтому нет необходимости указывать его в командной строке.

Если вы хотите восстановить эти разрешения в другом файле, вы можете использовать --set-fileвместо --restoreэтого:

$ setfacl --set-file acl.txt second_filename.txt

пример

Если в конечном итоге вы перезаписываете разрешения для некоторых файлов /usr, но не знаете, какие файлы вы перезаписали, вы обычно можете это исправить, восстановив из другой аналогично настроенной системы.

  1. Разрешения на резервное копирование из рабочей системы (примечание: getfaclгенерирует относительные пути, поэтому убедитесь, что вы находитесь cdв согласованном месте на обеих машинах)

    # cd /
    # getfacl -R usr > /root/acls.txt
    
  2. Скопируйте дамп ACL в систему с нарушенными разрешениями

    $ scp root@working-system:/root/acls.txt .
    $ scp acls.txt root@broken-system:/root/
    
  3. Восстановите дамп ACL, чтобы перезаписать сломанные разрешения теми, которые получены на известной исправной машине.

    # cd /
    # setfacl --restore /root/acls.txt
    
Score_Under
источник