Як встановити umask для певної папки


23

З явних причин мені потрібно встановити umaskзначення для однієї конкретної папки. Як це можна зробити?

Заздалегідь дякую!

ОНОВЛЕННЯ 1

Причина, що мені потрібно використовувати umask для певної папки, наступна. У мене є веб-додаток, і коли він створює якийсь файл, типовим дозволом є 700. Але мені потрібно щонайменше 755 дозволу на цей файл. Я думаю, я міг би зараз пояснити проблему чіткіше.


1
Причини можуть бути очевидними для вас, але не для нас. Поділіться, будь ласка, тим, що ви хочете зробити.
— htorque

@htorque. Додана причина, чому мені потрібно використовувати umask в моїй конкретній проблемі.
— Бахтіор

Відповіді:


30

ви могли б використовувати setfacl

setfacl -d -m group:name:rwx /path/to/your/dir

Де nameназва групи

Щоб дізнатися, до яких груп належать ви чи конкретний користувач, див. У unix / linux, як дізнатись, до якої групи входить даний користувач за допомогою командного рядка?


1
Можливо setfacl, змінилося. Я отримую помилку про те, що -mце неправдивий варіант.
— Райан Бернетт

Райан, setfaclне змінено. Швидше за все, ви не вказали назву групи (після -m).
— сергк

1
досить впевнений, що setfaclце для списків контролю доступу, а ні umask. Краще рішення, але насправді не те, що просили, я не думаю.
— Wyatt8740

спробуйте: sudo setfacl -Rdm ...(Опустіть R для рекурсії) має працювати. @ Wyatt8740 (правильно). Для певного виконання: man setfaclі введіть /-modify. Вам потрібно користуватися sudo.
— JREAM

11

Ви не можете встановити umask на каталог, це значення на рівні процесу. Якщо вам потрібно не дозволити іншим читати файли в каталозі, скасуйте відповідні біти дозволів.

Наприклад, якщо у вас є каталог /home/user/directoryз деякими файлами та каталогами, які можуть отримати дозволи, як 777, під час процесу, встановіть біти дозволу /home/user/directoryна щось на зразок 700. Це дозволить іншим користувачам (за винятком кореня суперпоширення) не спускатися в /home/user/directory.

Я параноїк і встановлюю дозволи на /home/user750, тому лише я можу читати, писати та спускатись у свій домашній каталог. Це призводить до того, що подібні папки /home/user/Publicне можуть бути доступні іншими, але я можу з цим жити.


За оновлення вашого запитання: все-таки ви не можете контролювати, що у файловій системі (крім використання іншого типу файлової системи, наприклад FAT, який сильно не перешкоджає), вам потрібно це зробити у своєму веб-сервері. Якщо ваш web-код закодований в PHP, ви можете змінити umask на ходу за допомогою umaskфункції:

<?php
umask(0022);
// other code
?>

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

Пам'ятайте, що це значення процесу, деякі веб-сервери дозволяють встановити його у своїх конфігураційних файлах, інакше ви можете змінити сценарії запуску, щоб встановити потрібний umask. Пам'ятайте, що дозволи до вподобань 755і 644є досить небезпечними для веб-сайтів, якщо код є чутливим, кожен може прочитати його.


Я знаю, що це давнє, але я вважаю, що варто згадати: адміністратор може прив’язати mount /home/user/Public( mount -o bind /home/user/Public /some/other/place), щоб вирішити проблему дозволів батьківського каталогу.
— Адріан Гюнтер

1

Щоб змінити дозволи для папки, використовуйте chmod. umask призначений для файлів.

Встановіть umask на те, що вам потрібно

umask xxx

і поверніть назад, коли закінчите

umask 022

11
umask = файли та каталоги, fmask = лише файли, dmask = лише каталоги. : P
— htorque

1
Я дізнався щось нове сьогодні :)
— wojox

1
Насправді це варіанти для певних файлових систем, таких як NTFS (не та команда настройки маски створення файлів umask). Вибачте за додавання заплутаної інформації
— htorque

umask змінює маску створення файлів для поточного процесу (поточної оболонки), якщо у вас інша оболонка відкрита або процес, що належить користувачеві, я не вірю, що це вплине. Ця команда також вплине на будь-які інші файли, створені поза каталогом, доки ви не зміните її назад.
— Дейв

1

Іншим рішенням може бути просто встановити ідентифікатор групи для файлів, створених у каталозі, що робить нові файли, що належать ідентифікатору групи директорій, замість ідентифікатора групи користувача, який створив файли. Тож я думаю, ви могли просто зробити:

chown www-data:www-data /my/folder

chmod 4755 /my/folder

Це встановлює жорсткий дозвіл спеціального файлу, який призведе до того, що всі створені файли /my/folderналежать www-dataгрупі, яка має дозвіл rx (5) через батьківський каталог.


2
Ви помилилися GUID у
— восьмикласному

1

Забезпечте рішення пилоподібного виробу, реалізованого за допомогою оболонок і direnv. Наступне рішення може бути більш сумісним у випадку, якщо setfaclвін недоступний у вашій системі. (наприклад, macOS)

direnvє перемикачем середовища для оболонки. Він знає, як підключити bash, zsh, tcsh, рибну оболонку та ельфій для завантаження чи вивантаження змінних середовища, залежно від поточного каталогу .

Використовуйте .envrcдля встановлення exportспеціального umaskзначення для конкретного dir, і exported env var буде завантажено, коли ви залишите цей dir.

# example .envrc file
export UMASK=0022

Визначте гачок, щоб змінити umaskзначення після зміни робочого режиму .

function _umask_hook {
  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  elif [[ $OSTYPE == darwin* ]]; then
    umask 0077
  else
    umask 0022
  fi
}

# To make the code more reliable on detecting the default umask
function _umask_hook {
  # Record the default umask value on the 1st run
  [[ -z $DEFAULT_UMASK ]] && export DEFAULT_UMASK="$(builtin umask)"

  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  else
    umask "$DEFAULT_UMASK"
  fi
}

# zsh hooks
# trigger _umask_hook once working dir is changed
add-zsh-hook chpwd _umask_hook

# bash
# Append `;` if PROMPT_COMMAND is not empty
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND;}_umask_hook"

На даний момент ініціалізація гака direnv для zsh не підтримує chpwdгачок. Якщо запит на витягнення GH-514 не було об'єднано, коли ви бачите цю сторінку. Будь ласка закомментировать eval "$(direnv hook zsh)"і гак direnvна chpwdвручну наступний код,

if (( $+commands[direnv] )) && ! (( $+functions[_direnv_hook] )); then
  _direnv_hook() {
    eval "$(command "direnv" export zsh)";
  }
  typeset -agU precmd_functions;
  if [[ -z ${precmd_functions[(r)_direnv_hook]} ]]; then
    precmd_functions=( _direnv_hook ${precmd_functions[@]} )
  fi

  typeset -agU chpwd_functions;
  if [[ -z ${chpwd_functions[(r)_direnv_hook]} ]]; then
    chpwd_functions=( _direnv_hook ${chpwd_functions[@]} )
  fi
fi

Джерело: dynamic-umask-based-on-cwd.md


0

Пов’язаний, але може бути непридатний у цьому випадку, наступний кліп .zshrc:

# Change the umask automatically for some directories; use 0022 as the default
chpwd () {
    case $PWD in
        $HOME/[Dd]ocuments*)
            if [[ $(umask) -ne 077 ]]; then
                umask 0077
                echo -e "\033[01;32mumask: private \033[m"
            fi;;
        */[Ww]eb*)
            if [[ $(umask) -ne 072 ]]; then
                umask 0072
                echo -e "\033[01;33mumask: other readable \033[m"
            fi;;
        /vol/nothing)
            if [[ $(umask) -ne 002 ]]; then
                umask 0002
                echo -e "\033[01;35mumask: group writable \033[m"
            fi;;
        *)
            if [[ $(umask) -ne 022 ]]; then
                umask 0022
                echo -e "\033[01;31mumask: world readable \033[m"
            fi;;
    esac
}

Тож для інтерактивного використання щось подібне спрацювало б (але, очевидно, не забезпечити безпеку).

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