14

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

4 ответа4

15

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

chmod --reference=RFile file

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

1

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

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

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

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: comment, сгенерированного 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
    
0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .