Архів мітки: chmod

Встановлення SETGID для усіх директорій рекурсивно

Іноді треба встановити SETGID (sticky-біт каталогу) для усіх директорій та піддиректорій. Така ситуація може виникнути, якщо необхідно забезпечити спільний доступ до певної файлової структури групі користувачів.

Поясню на прикладі. Уявімо, що є необхідність у спільній праці над проектами, які знаходяться у каталозі /var/local/Share. Усі задіяні у проектах належать групі workers.  Для цього каталогу встановлена група ‘workers’ та права 775, які дозволяють членам групи читати та записувати дані. Але якщо будь-хто з членів групи створить у ній каталог, то він буде належати не групі ‘workers’, а групі користувача за умовчанням.

Звичайно можна примусити користувачів змінювати власника групи, на те і команда chgrp існує, але біт SETGID позбавляє нас від цієї рутини. Якщо ми створюємо каталог у директорії зі встановленим SETGID, то автоматично маємо того самого власника групи, що і для батьківського каталогу. Тобто всі підкаталоги Share будуть належати групі ‘workers’. Більше того, вони також унаслідують і SETGID-біт, тому їх підкаталогу теж будуть належати до цієї групи.

Гадаю, що з новим каталогом усе зрозуміло, а як встановити SETGID біт для вже існуючої ієрархії каталогів?

Перше, що спадає на думку, це рекурсивна заміна власників групи та встановлення SETGID:

# chgrp -R workers /var/local/Share
# chmod -R g+s /var/local/Share     <-- НЕВІРНО!

Але друга команда неправильна. Бо вона встановлює SETGID не тільки для каталогів, але і для файлів, що зовсім не бажане. Відміняємо наслідки цієї команди протилежною:

# chmod -R g-s /var/local/Share

Та встановлюємо SETGID лише для каталогів:

# find /var/local/Share -type d -exec chmod g+s {} ;

Для нових дистрибутивів команда закінчується на плюс (+) замість крапки з комою (;)

# find /var/local/Share -type d -exec chmod g+s {} +