Відповіді:
Версія 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>
при копіюванні файлу буде скопійовано дозволи, а також 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