Как установить 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, как вы узнаете, в какую группу входит данный пользователь через командную строку?

yogi70
источник
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, который категорически не рекомендуется), вы должны сделать это в своем веб-приложении. Если ваше веб-приложение написано на PHP, вы можете изменить umask на лету, используя umaskфункцию:

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

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

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

Lekensteyn
источник
Я знаю, что это древнее, но я думаю, что стоит упомянуть: администратор может связать mount /home/user/Public( mount -o bind /home/user/Public /some/other/place), чтобы обойти проблему разрешений родительского каталога.
Адриан Гюнтер
1

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

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

umask xxx

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

umask 022
wojox
источник
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

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

Bastiaan
источник
2
Вы ошибочно приняли GUID за восьмеричное значение SUID
adampski
1

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

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

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

# 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

Simba
источник
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
}

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

Виль
источник