Как установить 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
}
Так что для интерактивного использования что-то подобное будет работать (но, очевидно, не для обеспечения безопасности).