如何为特定文件夹设置 umask

如何为特定文件夹设置 umask

我需要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/user750,这样只有我可以读取、写入和访问我的主目录。这导致/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 还不支持chpwdhook。如果 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

来源:基于 cwd 的动态 umask.md

答案4

要更改文件夹的权限,请使用 chmod。umask 用于文件。

将 umask 设置为你需要的值

umask xxx

完成后再改回来

umask 022

相关内容