如何为特定文件夹设置umask


23

由于某些明显的原因,我需要umask为一个特定的文件夹设置值。一个人怎么能做到呢?

预先感谢!

更新1

我需要对特定文件夹使用umask的原因如下。我有一个Web应用程序,当它创建一些文件时,默认权限为700。但是该文件至少需要755权限。我想我现在可以更清楚地解释这个问题。


1
原因可能对您显而易见,但对我们而言不明显。请分享您想做的事。
htorque 2011年

@htorque。添加了为什么我需要在特定问题中使用umask的原因。
巴赫蒂奥尔

Answers:


30

你可以用 setfacl

setfacl -d -m group:name:rwx /path/to/your/dir

name组名在哪里

要查找您或特定用户所属的组,请参见在unix / linux中,如何通过命令行找出给定用户所属的组?


1
也许setfacl已经改变了。我收到错误消息,指出这-m不是有效的选择。
Ryan Burnette 2015年

瑞安,setfacl没有改变。您很可能没有提供正确的组名(在之后-m)。
sergk

1
可以肯定的setfacl访问控制列表而不是umask。我认为,这是一个更好的解决方案,但实际上不是要问的问题。
Wyatt8740 '02

尝试:(sudo setfacl -Rdm ...省略R进行递归)应该可以。@ Wyatt8740(正确)。可以肯定地运行:man setfacl,然后输入 /-modify。您需要使用sudo
JREAM

11

您不能为每个目录设置umask,这是一个进程级别的值。如果需要防止其他人读取目录中的文件,请撤消相应的权限位。

例如,如果您的目录中/home/user/directory包含一些文件和目录,这些文件和目录可以从进程中获取诸如777的权限,则将的权限位设置/home/user/directory为类似700的值。这将使其他用户(超级用户根除外)无法降级在/home/user/directory

我很偏执,并将权限设置/home/user为750,因此只有我可以在主目录中进行读写和下降操作。结果是/home/user/Public其他人无法访问类似的文件夹,但是我可以忍受。


每次更新您的问题:仍然,您无法控制文件系统中的内容(除了使用其他文件系统类型,例如FAT,强烈建议不要这样做),您需要在webapp中执行该操作。如果您的Web应用程序是用PHP编码的,则可以使用以下umask函数动态更改umask :

<?php
umask(0022);
// other code
?>

您可以将其放在配置文件中,例如包含数据库连接密码的文件(在诸如Wordpress之类的应用程序中考虑)。

请记住,这是一个过程值,某些Web服务器允许您在其配置文件中对其进行设置,否则,您可以修改启动脚本以设置所需的umask。请记住,像755和这样的权限644对于webapps来说是非常危险的,如果代码敏感,每个人都可以阅读。


我知道这很古老,但我认为值得一提:管理员可以绑定mount /home/user/Publicmount -o bind /home/user/Public /some/other/place)来解决父目录权限问题。
阿德里安·昆特

1

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

将umask设置为所需

umask xxx

完成后再换回来

umask 022

11
umask =文件和目录,fmask =仅文件,dmask =仅目录。:P
htorque

1
我今天学到了新的东西:)
wojox

1
实际上,这是某些文件系统(如NTFS)的选项(不是该文件创建掩码设置命令umask)。抱歉,添加令人困惑的信息。
htorque 2011年

umask会更改当前进程(当前shell)的文件创建掩码,如果您打开了其他shell或用户拥有的进程,我认为它不会受到影响。该命令还将影响在目录外部创建的所有其他文件,直到您将其更改回。
戴夫

1

另一个解决方案可能是只在目录中创建的文件上设置组ID,这会使新文件归目录组ID所拥有,而不是创建文件的用户的组ID。因此,我认为您可以这样做:

chown www-data:www-data /my/folder

chmod 4755 /my/folder

这将设置setgid特殊文件许可权,该许可权将使所有创建的文件/my/folder归该www-data组所有,该组由于父目录而具有rx(5)许可权。


2
您已将GUID误认为SUID八进制值
adampski '18

1

提供用shell钩子钩子实现的花药解决方案direnv。如果setfacl您的系统不可用,以下解决方案可能会更兼容。(例如macOS)

direnv是外壳程序的环境切换器。它知道如何根据当前目录挂接到bash,zsh,tcsh,fish shell和elvish来加载或卸载环境变量。

使用.envrcexport定制umask特定的目录价值,而export当你离开这个DIR 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"

目前,zsh的direnv钩子初始化不支持chpwd钩子。如果您在看到该页面时未合并拉取请求GH-514。请注释掉eval "$(direnv hook zsh)"和钩direnvchpwd与下面的代码手动,

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


0

相关,但在这种情况下可能不适用,以下剪辑来自.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
}

因此,对于交互式使用而言,类似的方法将起作用(但显然不能提供安全性)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.