Как установить umask для конкретной папки

По некоторым очевидным причинам мне нужно установить umask значение для одной конкретной папки. Как можно это сделать?

Спасибо заранее!

ОБНОВЛЕНИЕ 1

Причина, по которой мне нужно использовать umask для определенной папки, заключается в следующем. У меня есть веб-приложение, и когда оно создает какой-то файл, разрешение по умолчанию составляет 700. Но мне нужно как минимум 755 разрешений для этого файла. Я думаю, что я мог бы объяснить проблему более четко сейчас.

5 ответов

Вы могли бы использовать setfacl

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

куда name это название группы

Чтобы узнать, к каким группам вы или конкретный пользователь принадлежите, смотрите в Unix/ Linux, как вы узнаете, в какую группу входит данный пользователь через командную строку?

Вы не можете установить umask для каждого каталога, это значение уровня процесса. Если вам нужно запретить другим пользователям читать файлы в каталоге, отзовите соответствующие биты прав доступа.

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

Я параноик и установил права на /home/user до 750, так что только я могу читать, писать и спускаться в моем домашнем каталоге. Как следствие, такие папки, как /home/user/Public не могут быть доступны другим, но я могу жить с этим.


За обновление вашего вопроса: тем не менее, вы не можете контролировать, что в файловой системе (кроме использования другого типа файловой системы, такого как FAT, который категорически не рекомендуется), вы должны сделать это в своем веб-приложении. Если ваше веб-приложение написано на PHP, вы можете изменить umask на лету, используя umask функция:

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

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

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

Обеспечить пыльниковое решение, реализованное с помощью оболочек и direnv, Следующее решение может быть более совместимым в случае setfacl недоступно в вашей системе. (например, macOS)

direnv переключатель среды для оболочки Он умеет подключаться к bash, zsh, tcsh, fish shell и elvish для загрузки или выгрузки переменных окружения в зависимости от текущего каталога.

использование .envrc в export обычай umask значение для конкретного каталога, а export ed env var будет выгружен при выходе из этого каталога.

# example .envrc file
export UMASK=0022

Определите крюк, чтобы изменить umask значение после работы dir изменяется.

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

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

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

chmod 4755 /my/folder

Это устанавливает специальное разрешение для файла setgid, которое приведет к тому, что все файлы, созданные в /my/folder принадлежать www-data группа, которая затем имеет разрешение rx (5) из-за родительского каталога.

Чтобы изменить разрешения для папки, используйте chmod. Umask для файлов.

Установите umask на то, что вам нужно

umask xxx

и вернитесь, когда вы закончите

umask 022

Связанный, но, возможно, не применимый в этом случае, следующий клип от .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
}

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

Другие вопросы по тегам