Як встановити 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.