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

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

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

ОБНОВЛЕНИЕ 1

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

23
задан 22 May 2011 в 13:23

6 ответов

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

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

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


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

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

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

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

11
ответ дан 23 November 2019 в 01:26

Для изменения полномочий для папки используют chmod. umask, для файлов.

Набор umask к тому, чем Вы нуждаетесь

umask xxx

и возвратитесь когда Ваш сделанный

umask 022
1
ответ дан 23 November 2019 в 01:26

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

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

Где name название группы

Для нахождения, который группируется, Вы или определенный пользователь принадлежите, видят В unix/linux, как Вы узнаете, какая группа данный пользователь является на пути командной строкой?

30
ответ дан 23 November 2019 в 01:26

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

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

chmod 4755 /my/folder

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

1
ответ дан 23 November 2019 в 01:26

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

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

0
ответ дан 23 November 2019 в 01:26

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

direnv переключатель среды для оболочки. Это знает, как сцепиться в удар, zsh, tcsh, оболочку рыбы и волшебный, чтобы загрузить или разгрузить переменные среды в зависимости от текущего каталога.

Использовать .envrc кому: export пользовательский umask значение для определенного dir, и exportvar ENV редактора будет разгружен при отъезде того dir.

# 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

1
ответ дан 23 November 2019 в 01:26

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

Похожие вопросы: