У меня есть два файла в каталоге. Один имеет правильные разрешения, а другой нет. Есть ли способ, которым я могу "скопировать" набор разрешений из одного файла в другой?
4 ответа
GNU-версия утилиты chmod может копировать режим из одного файла (RFile
) в другой (file
).
chmod --reference=RFile file
GNU coreutils встречается в большинстве дистрибутивов Linux и Cygwin, а также в других местах. Не все реализации chmod предоставляют эту опцию.
Я придумал это:
find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh
Это не полностью пуленепробиваемое, но делает то, что мне нужно.
Вы можете использовать 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
- это новое имя файла).
меры
Сохранить исходные разрешения в
acl.txt
:$ getfacl filename.txt > acl.txt
Разрешения на перезапись (для демонстрации; это просто для того, чтобы вы могли видеть, что восстановление на следующем шаге работает)
$ 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
Используйте
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
, но не знаете, какие файлы вы перезаписали, вы обычно можете это исправить, восстановив из другой аналогично настроенной системы.
Резервные разрешения от работы системы (обратите внимание:
getfacl
генерирует относительные пути, так чтобы у васcd
- диск в согласованном месте на обеих машинах)# cd / # getfacl -R usr > /root/acls.txt
Скопируйте дамп ACL в систему с нарушенными разрешениями
$ scp root@working-system:/root/acls.txt . $ scp acls.txt root@broken-system:/root/
Восстановите дамп ACL, чтобы перезаписать сломанные разрешения теми, что были на известной исправной машине.
# cd / # setfacl --restore /root/acls.txt
попробуй это:
find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;
это будет происходить многократно и chmod для каждого файла, если два файла не совпадают в файлах, вы увидите много ошибок "Нет такого файла или каталога".