По некоторым очевидным причинам я должен установить umask
значение для одной определенной папки. Как можно сделать это?
Спасибо заранее!
ОБНОВЛЕНИЕ 1
Причина я должен использовать umask для определенной папки, следует. У меня есть веб-приложение и когда оно создает, немного регистрируют разрешение по умолчанию, 700. Но мне нужны по крайней мере 755 разрешений для того файла. Я думаю, что мог объяснить проблему более ясно теперь.
Вы не можете установить 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
довольно опасны для веб-приложений, если код чувствителен, все могут считать его.
Для изменения полномочий для папки используют chmod. umask, для файлов.
Набор umask к тому, чем Вы нуждаетесь
umask xxx
и возвратитесь когда Ваш сделанный
umask 022
Вы могли использовать setfacl
setfacl -d -m group:name:rwx /path/to/your/dir
Где name
название группы
Для нахождения, который группируется, Вы или определенный пользователь принадлежите, видят В unix/linux, как Вы узнаете, какая группа данный пользователь является на пути командной строкой?
Другое решение могло бы быть, чтобы просто установить идентификатор группы на файлах, созданных в каталоге, который делает новые файлы принадлежавшими идентификатору группы каталогов вместо идентификатора группы пользователя, который создал файлы. Таким образом, я думаю, что Вы могли просто сделать:
chown www-data:www-data /my/folder
chmod 4755 /my/folder
Это устанавливает setgid специальное разрешение файла, которое вызвало бы все файлы, созданные в /my/folder
принадлежать www-data
у группы, которая имеет затем, есть rx (5) разрешение из-за родительского каталога.
Связанный, но возможно не применимый в этом случае, следующий клип от .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
}
Таким образом для интерактивного использования, что-то как этот работало бы (но, очевидно, для не обеспечения безопасности).
Предоставьте решение для пыльника, реализованное с рычагами оболочки и direnv
. Следующее решение может быть более совместимым в случае, если setfacl
не доступно в Вашей системе. (например, macOS)
direnv
переключатель среды для оболочки. Это знает, как сцепиться в удар, zsh, tcsh, оболочку рыбы и волшебный, чтобы загрузить или разгрузить переменные среды в зависимости от текущего каталога.
Использовать .envrc
кому: export
пользовательский umask
значение для определенного dir, и export
var 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