Unix: Чи є спосіб "скопіювати" дозволи на файл чи каталог?


14

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

Відповіді:


15

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

chmod --reference=RFile file

GNU coreutils є в більшості дистрибутивів Linux, серед інших місць Cygwin. Не всі реалізації chmod надають цю опцію.


Гм ... схоже, це має працювати, але не підтримується на Mac OS X? Там я отримую лише нелегальний варіант ...
Svish

2
chmod - не команда bash вбудована. це окрема утиліта, доступна на багатьох одиницях. --referenceопція включена у версії GNU; OSX, ймовірно, використовує chmod, який походить замість BSD. OSX man chmod : developer.apple.com/Mac/library/documentation/Darwin/Reference/…
quack quixote

Svish, ви можете розглянути можливість встановлення версій GNU через MacPorts.
Джеремі Л

Щойно подумав, що було б корисно згадати тут, що cp -dpR <source-file> <dest-file>при копіюванні файлу буде скопійовано дозволи, а також 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 кожен файл, якщо два каталогу не збігаються у файлах, ви побачите багато помилок "Немає такого файлу чи каталогу".


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': Немає такого файлу чи каталогу
Rick Sanchez

протестували його у 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
    
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.