Answers:
你可以用 setfacl
setfacl -d -m group:name:rwx /path/to/your/dir
name
组名在哪里
要查找您或特定用户所属的组,请参见在unix / linux中,如何通过命令行找出给定用户所属的组?
setfacl
已经改变了。我收到错误消息,指出这-m
不是有效的选择。
setfacl
没有改变。您很可能没有提供正确的组名(在之后-m
)。
setfacl
是访问控制列表而不是umask
。我认为,这是一个更好的解决方案,但实际上不是要问的问题。
sudo setfacl -Rdm ...
省略R进行递归)应该可以。@ Wyatt8740(正确)。可以肯定地运行:man setfacl
,然后输入 /-modify
。您需要使用sudo
。
您不能为每个目录设置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来说是非常危险的,如果代码敏感,每个人都可以阅读。
/home/user/Public
(mount -o bind /home/user/Public /some/other/place
)来解决父目录权限问题。
要更改文件夹的权限,请使用chmod。umask用于文件。
将umask设置为所需
umask xxx
完成后再换回来
umask 022
umask
)。抱歉,添加令人困惑的信息。
另一个解决方案可能是只在目录中创建的文件上设置组ID,这会使新文件归目录组ID所拥有,而不是创建文件的用户的组ID。因此,我认为您可以这样做:
chown www-data:www-data /my/folder
chmod 4755 /my/folder
这将设置setgid特殊文件许可权,该许可权将使所有创建的文件/my/folder
归该www-data
组所有,该组由于父目录而具有rx(5)许可权。
提供用shell钩子和钩子实现的花药解决方案direnv
。如果setfacl
您的系统不可用,以下解决方案可能会更兼容。(例如macOS)
direnv
是外壳程序的环境切换器。它知道如何根据当前目录挂接到bash,zsh,tcsh,fish shell和elvish来加载或卸载环境变量。
使用.envrc
来export
定制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)"
和钩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
相关,但在这种情况下可能不适用,以下剪辑来自.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
}
因此,对于交互式使用而言,类似的方法将起作用(但显然不能提供安全性)。