新建一个文件或目录,它的默认权限是什么?如果要修改一个用户创建的文件和目录的默认权限该如何做?本文将介绍相关的内容。说明:本文的演示环境为 ubuntu 16.04。

文件的默认权限

为了查看用户创建的文件和目录的默认权限,我们用一个普通的用户创建文件 myfile 和目录 mydir 并查看它们的默认权限:

目录的权限为 775,文件的权限为 664。对比之下发现目录比文件多了执行的权限。这是因为执行权限对于目录来说是非常重要的,有了目录的执行权限才能够进入目录中进行文件操作。
默认情况下对于目录来说最大的权限是 777,对于文件来说最大的权限一般为 666(只有可以执行的文件才添加可执行权限)。所以我们创建的文件和目录的共同特点是从最大权限中减去了 2,也就是其他用户的写权限。而这个被减去的值就是我们常说的 umask。umask 还是 bash 的一个内置命令,默认输出当前用户的 umask 值:

注意,umask 显示的值为从默认的最大权限中减去的值。上图中的第一个 0 表示 8 进制,这里我们可以暂时忽略它。

系统的默认策略(Ubuntu16.04)
系统在用户登录时通过 login 程序调用 pam_umask 模块设置用户默认的 umask。从 login 程序的配置文件 /etc/login.defs 中我们可以找到 umask 相关的配置:

# UMASK is the default umask value for pam_umask and is used by
# useradd and newusers to set the mode of the new home directories.
# is the "historical" value in Debian for UMASK
# , or even , could be considered better for privacy
# There is no One True Answer here : each sysadmin must make up his/her
# mind.
#
# If USERGROUPS_ENAB is set to "yes", that will modify this UMASK default value
# for private user groups, i. e. the uid is the same as gid, and username is
# the same as the primary group name: for these, the user permissions will be
# used as group permissions, e. g. will become .
#
# Prefix these values with "" to get octal, "0x" to get hexadecimal.
#
UMASK
……..
# Enable setting of the umask group bits to be the same as owner bits
# (examples: -> , -> ) for non-root users, if the uid is
# the same as gid, and username is the same as the primary group name.
#
# If set to yes, userdel will remove the user´s group if it contains no
# more members, and useradd will create by default a group with the name
# of the user.
#
USERGROUPS_ENAB yes

乍一看上面的配置信息,用户的默认 umask 应该是 022 才对啊。仔细地阅读相关的说明信息发现,当 USERGROUPS_ENAB 被设置为 yes 时(默认值),对于 uid 和 gid 相同且用户名和主组名相同的用户,系统会把其 umask 改为 002。所以我们看到用户 nick 的 umask 为 002。
由于 root 用户的特殊性,它默认的 umask 与其它用户是不同的,其值为 022:

umask 命令

umask 是 bash 的一个内置命令,用来显示或设置新建文件/目录的权限掩码(umask)。前面我们以数字的方式输出了用户默认的 umask 值,这次我们以符号的方式进行输出:

$ umask -S

以符号输出的就是用户创建目录时的默认权限,算一下,其实就是 775。

为了改变用户创建的文件/目录的默认值,我们可以改变 umask 的默认值。
设置 umask 值
最简单的方式就是为 umask 命令指定一个数字:

$ umask 

026 的含义为:去掉 group 中的写权限,去掉 other 中的读写权限。

这时创建的文件权限为 640,目录权限为 751。注意,修改 umask 后只有新建的文件和目录受影响,已经存在的文件和目录的权限不会被影响。

以符号的方式设置 umask 值
比如下面的命令:

$ umask u=, g=w, o=rwx

上面的命令表示从 group 中去掉写权限,从 other 中去掉读写执行的权限。
注意:"=" 号在 umask 命令和 chmod 命令中的作用恰恰相反。在 chmod 命令中,利用它来设置指定的权限,而其余权限则被删除。但是在 umask 命令中,将在原有权限的基础上删除指定的权限。

在 ~/.bashrc 文件中为用户设置默认的 umask
如果让用户每次登陆后都执行 umask 命令修改默认的 umask 值是不科学的,我们可以在用户的 ~/.bashrc 文件中执行 umask 命令,这样用户登录后 umask 的值自动就变成了设置的值。把下面的命令添加到 ~/.bashrc 文件的最后一行:
umask 026
保存后重新登录一次,然后查看 umask 的值:

文件和目录的创建

下面通过 strace 来跟踪文件和目录创建的过程,看看 mask 是如何影响它们的创建操作的。
创建一个文件

$ umask ; strace -eopen touch testfile >& | tail -; ls -l testfile

上图中 open 函数使用 666 权限创建文件,但是由于设置了 umask 为 077,所以内核在创建文件时移除了 group 和 other 的 rwx 权限,最终创建的文件权限为 600。

创建一个目录

$ umask ; strace -emkdir mkdir testdir; ls -ld testdir

上图中 mkdir 函数使用 777 权限创建目录,但是由于设置了 umask 为 022,内核最终创建的目录权限为 755。

umask 与 ACL

如果一个目录没有被设置 default ACL,那么将由 umask 决定新文件的 ACL 权限。这种情况其实就是我们常见的没有 ACL 权限时的情况。比如我们设置 umask 为 026,那么创建的文件和目录的权限就是由它决定的。

如果一个目录被设置了 default ACL,那么将会由文件创建函数的 mode 参数和目录的 default ACL 共通决定新文件的 ACL 权限,此时 umask 被忽略。还以 umask 026 为例,我们创建一个目录 dir2 并设置 default ACL 权限:

$ setfacl -m d:u:tester:rwx dir2

然后在 dir2 目录中创建文件 testfile:

这次 testfile 的权限已经不受 umask 的影响了!

总结

umask 是一个看似简单实则影响重大的命令,根据实际需求设置好 umask 不仅能够保护系统的安全,还会让操作变得轻松(少一些 Permission denied)。

参考:
Umask
umask man page
鸟哥 umask

Linux umask的更多相关文章

  1. Linux umask命令详解

    Linux umask命令 Linux umask命令指定在建立文件时预设的权限掩码.一般来说,umask命令是在/etc /profile文件中设置的 umask可用来设定[权限掩码].[权限掩码] ...

  2. Linux umask限制导致php的mkdir 0777无效

    原因:mkdir权限受当前linux umask限制 解决方法: $oldmask = umask(0); mkdir("test", 0777); umask($oldmask) ...

  3. linux umask命令

    umask命令 umask命令功能:显示.设置文件的缺省权限. umask命令语法:umask [-S] -S:以rwx形式显示新建文件或目录的缺省权限. 执行umask: 显示0022 第一个0:特 ...

  4. Linux umask权限

    文件基本权限 Linux中文件权限由三部分组成: rw-r--r-- 前三位:表示用户所拥有的权限 中三位:表示用户所在组的权限 后三们:表示其他用户的权限 权限 八进制 十进制 - - - 000 ...

  5. linux umask使用详解

    转自:http://blog.csdn.net/lmh12506/article/details/7281910 umask使用方法 A 什么是umask?   当我们登录系统之后创建一个文件总是有一 ...

  6. [Linux] umask 从三类人群的权限中拿走权限数字

      作用   umask 用来设置用户创建文件.目录的默认权限,通过从权限中拿走相应的位,格式 `umask nnn`.     理解   rwx rwx rwx 权限对应三类人群,所属人,所属组,其 ...

  7. linux umask使用方法

    A 什么是umask?   当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情.umask设置了用户创建文件的默认 权限,它与chmod的效果刚好相 ...

  8. linux umask计算方法

    1. umask用于设定默认的新建文件或目录的权限 查看umask当前值命令: umask -p 计算创建出的file权限方法: 如果umask值的每位数都是偶数,使用666按位减umask的值即可 ...

  9. Linux umask 档案预设权限/touch 建立空档案或修档案件时间

    1 建立档案时,权限一般设为-rw-r--r-- 2 建立目录时,权限一般设为drwxr-xr-x 3 touch 选项与参数 -a :  仅修订access time -c :仅修改档案的时间,若该 ...

随机推荐

  1. MSSQL一种取代游标的方案

    今天看到一篇文章写的自己整理记录下,据说比用游标快. DECLARE @字段1 数据类型; DECLARE @字段2 数据类型; DECLARE @TMP_WHILE_ID INT; ,),TMP_W ...

  2. 【第八篇】SAP ABAP7.5x新语法之F4增强【续】

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:SAP ABAP7.5x系列之F4增强[续]   ...

  3. Windows 10 执行pip list报错 UnicodeDecodeError: 'gbk' codec can't decode

    在命令行执行任何pip命令都报错: C:\Users\hyang0>pip --version Traceback (most recent call last): File "c:\ ...

  4. 【PAT】B1076 Wifi密码(15 分)

    注意接收字符时缓冲区的换行要接受掉 #include<stdio.h> int main() { int n; scanf("%d", &n); n *= 4; ...

  5. hdu3400(三分套三分)

    题意:平面上两条线段 AB,CD. A到B的速度v1,C到D的速度v2,其它地方的速度V3. 求A到D的最短时间. 解法:三分嵌套三分.首先假设AB上的点确定后.确定CD的点的确定应该是符合三分性质的 ...

  6. 原生JS添加类名 删除类名

    为 <div> 元素添加 class: document.getElementById("myDIV").classList.add("mystyle&quo ...

  7. PHP 使用 ElasticSearch

    环境 php 7.2elasticsearch 6.2 下载elasticsearch-php 6 下载 安装 elasticsearch 下载源文件,解压,重新建一个用户,将目录的所属组修改为此用户 ...

  8. 1.4 Genymotion模拟器安装

    如果你符合下述三种情况的话,你可以考虑安装一个Genymotion Android模拟器: 没有真机调试,只能用模拟器 嫌SDK内置的AVD启动速度,运行速度慢 电脑配置还可以,最好4G内存以上 如果 ...

  9. JS进阶之---函数,立即执行函数

    一.函数 函数声明.函数表达式.匿名函数 函数声明:使用function关键字声明一个函数,再指定一个函数名,叫函数声明.function name () { … } 函数表达式:使用function ...

  10. 编译安装nginx,并使用systemd管理nginx

    #tar zxvf nginx-1.8.1.tar.gz #cd nginx-1.8.1/ #make && make install #cat /etc/systemd/system ...