如何为目录或用户设置单独的 umask?

如何为目录或用户设置单独的 umask?

我想要一个目录或用户的单独的 umask。我怎样才能做到这一点?

编辑:我正在使用 Debian 6。

我想要这样做的原因是,我希望所有 SFTP 用户都使用 write on 组创建文件。我正在使用 SFTP 客户端来测试 umask 是否设置正确。

答案1

对于目录,如果您使用的是 Linux,那么使用扩展 ACL 和掩码可能对您有用。

您可以通过将umask xxx命令放入每个用户的~/.profile.

答案2

您需要它来为文件夹中的特定系统组设置默认权限,对吧?检查这个现有线程对于详细介绍这一点的同一问题。

答案3

更新: 抱歉,我的解决方案不符合您的要求。以下答案仅解决用户方面的需求,而不是经理方面强制umask其他用户位于特定目录下的需求。

提供花药解决方案实施贝壳钩direnv为了具体目录。如果setfacl您的系统上不可用,以下解决方案可能更兼容。 (例如,macOS)

direnv是 shell 的环境切换器。它知道如何挂钩 bash、zsh、tcsh、fish shell 和 elvish 来加载或卸下环境变量取决于当前目录

用于特定目录的自定义值,当您离开该目录时,ed 环境变量将被卸载.envrcexportumaskexport

# 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"

目前,zsh 的 direnv hook 初始化不支持chpwdhook。如果拉取请求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

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

相关内容