umask值为022时,为何新建文件默认无执行权限?
问题背景
我新建了一个名为./foo的文件,内容如下:
#!/usr/bin/env bash echo 'Hello world'
执行umask命令的输出为:
$ umask -S u=rwx,g=rx,o=rx $ umask 022
尝试直接执行该文件(未执行chmod)时,出现权限拒绝提示:
$ ./foo zsh: permission denied: ./foo
切换到bash shell执行结果一致:
$ bash The default interactive shell is now zsh. To update your account to use zsh, please run `chsh -s /bin/zsh`. bash-3.2$ ./foo bash: ./foo: Permission denied
用ls -l查看权限,显示文件无执行权限:
$ ls -l foo -rw-r--r-- 1 richiethomas staff 40 Mar 3 10:11 foo
执行chmod +x foo后,文件可正常执行:
$ chmod +x foo $ ./foo Hello world $ ls -l foo -rwxr-xr-x 1 richiethomas staff 40 Mar 3 10:11 foo
疑问:根据资料,umask值022表示“所有者拥有全部权限,其他用户可读、可执行但不可写”,但实际新建文件无执行权限,请问原因是什么?
原因解释
普通文件和目录的默认基础权限不同:
umask的作用是在「系统默认基础权限」的基础上,移除对应的权限位。但系统对普通文件和目录的默认基础权限设定不一样:- 目录的默认基础权限是
777(rwxrwxrwx),应用umask 022后,计算得777-022=755(rwxr-xr-x),这和你理解的umask效果一致; - 普通文件的默认基础权限是
666(rw-rw-rw-),应用umask 022后,计算得666-022=644(rw-r--r--),也就是你看到的权限——没有执行位,这是正常结果。
- 目录的默认基础权限是
系统安全设计的考虑:
普通文件默认不带执行权限是系统的安全策略,目的是防止误创建的文本文件、配置文件等被意外执行,避免恶意代码或错误脚本自动运行带来的风险。如果需要让脚本类文件可执行,必须手动通过chmod +x添加执行权限,这也是最后成功执行文件的原因。
内容的提问来源于stack exchange,提问作者Richie Thomas
相关产品推荐
相关产品推荐

