我需要umask
为一个特定文件夹设置值。我有一个 Web 应用程序,当它创建某个文件时,默认权限为 700。但我需要该文件至少有 755 个权限。该怎么做?
答案1
你可以使用setfacl
setfacl -d -m group:name:rwx /path/to/your/dir
name
群名在哪里
要查找您或特定用户所属的组,请参阅在 unix/linux 中,如何通过命令行找出给定用户属于哪个组?
答案2
您无法为每个目录设置 umask,它是一个进程级值。如果您需要阻止其他人读取目录中的文件,请撤销相应的权限位。
例如,如果您有一个目录/home/user/directory
,其中包含一些文件和目录,它们可以从进程获取 777 之类的权限,请将 的权限位设置/home/user/directory
为 700 之类的值。这将使其他用户(超级用户 root 除外)无法进入/home/user/directory
。
我有点偏执,将权限设置为/home/user
750,这样只有我可以读取、写入和访问我的主目录。这导致/home/user/Public
其他人无法访问文件夹,但我可以忍受。
根据您问题的更新:您仍然无法在文件系统中控制这一点(除非使用其他文件系统类型,例如强烈反对的 FAT),您需要在 Web 应用程序中执行此操作。如果您的 Web 应用程序是用 PHP 编写的,您可以使用umask
功能:
<?php
umask(0022);
// other code
?>
您可以将其放在配置文件中,例如包含数据库连接密码的文件(在 Wordpress 等应用程序中思考)。
请记住,这是一个进程值,一些 Web 服务器允许您在其配置文件中设置它,否则您可以修改启动脚本以设置所需的 umask。请记住,像755
和这样的权限644
对于 Web 应用程序来说非常危险,如果代码敏感,每个人都可以阅读它。
答案3
提供另一种解决方案外壳钩子和direnv
。如果setfacl
您的系统不支持,以下解决方案可能更兼容。(例如 macOS)
direnv
是 shell 的环境切换器。它知道如何挂载 bash、zsh、tcsh、fish shell 和 elvish 来加载或卸下环境变量取决于当前目录。
.envrc
对特定目录使用export
自定义umask
值,export
当您离开该目录时,ed 环境变量将被卸载。
# 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 hook 初始化对于 zsh 还不支持chpwd
hook。如果 pull requestGH-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
答案4
要更改文件夹的权限,请使用 chmod。umask 用于文件。
将 umask 设置为你需要的值
umask xxx
完成后再改回来
umask 022