Ответы:
GNU-версия утилиты chmod может копировать режим из одного файла ( RFile
) в другой ( file
).
chmod --reference=RFile file
GNU coreutils встречается в большинстве дистрибутивов Linux и Cygwin среди других мест. Не все реализации chmod предоставляют эту возможность.
--reference
опция включена в версии GNU; OSX, вероятно, использует вместо этого chmod , созданный с помощью BSD. OSX man chmod : developer.apple.com/Mac/library/documentation/Darwin/Reference/…
cp -dpR <source-file> <dest-file>
при копировании файла будут копироваться разрешения, а также файл.r
Я придумал это:
find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh
Это не полностью пуленепробиваемое, но делает то, что мне нужно.
попробуй это:
find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;
это будет происходить многократно и chmod для каждого файла, если два файла не совпадают в файлах, вы увидите много ошибок «Нет такого файла или каталога».
find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
Вы можете использовать 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:
комментария, сгенерированного пользователем 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