新建一个文件或目录,它的默认权限是什么?如果要修改一个用户创建的文件和目录的默认权限该如何做?本文将介绍相关的内容。说明:本文的演示环境为 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. weblogic系列漏洞整理 -- 1. weblogic安装

    目录 0. 概述 1. 下载安装Java环境 2. 下载安装weblogic 安装 部署domain域 进入weblogic 3. 排错 如果出现如下错误 0. 概述 WebLogic是美国Oracl ...

  2. python遍历本地文件系统 按文件大小排序

    在这个例子中,主要会用到python内置的和OS模块的几个函数: os.walk() : 该方法用来遍历指定的文件目录,返回一个三元tuple(dirpath, dirnames, filenames ...

  3. Matplotlib:tick_params参数设置

    1.tick_params语法 参数:axis : {‘x’, ‘y’, ‘both’} Axis on which to operate; default is ‘both’.reset : boo ...

  4. 【PAT】B1068 万绿丛中一点红(20 分)

    一开始因为看见这题就头疼,可费了点时间. 要考虑所有元素,如果忽略外圈元素,最后一个样例过不去. 而且要求只出现一次的元素, 我没有使用map,因为当时还没学,用map储存元素会节约好多代码 #inc ...

  5. 3.8Python数据处理篇之Numpy系列(八)---Numpy的梯度函数

    目录 目录 前言 (一)函数说明 (二)一维数组的应用 (三)多维数组的应用 目录 前言 梯度函数,其中的梯度也就是斜率,反映的是各个数据的变化率.在numpy中只有一个梯度函数. (一)函数说明 ( ...

  6. SAP SQVI 快速浏览器

    SQVI可向SQL一样连接多个表浏览数据. 1.输入T-CODE:SQVI. 2.新建一个新查询case 输入CASE 名.点击新建,在弹出的窗口中输入标题,在数据源中可选择单个表查询,或者选择表连接 ...

  7. SQL Server2008 18456错误

    1.以windows验证模式进入数据库管理器.   第二步:右击sa,选择属性:   在常规选项卡中,重新填写密码和确认密码(改成个好记的).把强制实施密码策略去掉.   第三步:点击状态选项卡:勾选 ...

  8. <20190303>大厂的风度,firmware每年更新!

    哪怕是最普通的型号, 思科Cisco 每隔一个周期都会推送一个新的firmware, 来提高 路由器的稳定性,和整体兼容性, 2015年买的路由器, 今年年初又发布一个更新包. Release Not ...

  9. 转://Oracle 11gR2 ASM磁盘组管理

    一.环境.[grid@rhel2 ~]$ cat /etc/issueRed Hat Enterprise Linux Server release 5.5 (Tikanga) Kernel \r o ...

  10. JS面向对象之工厂模式

    js面向对象 什么是对象 "无序属性的集合,其属性可以包括基本值.对象或者函数",对象是一组没有特定顺序的的值.对象的没个属性或方法都有一个俄名字,每个名字都映射到一个值. 简单来 ...