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

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


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


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.