文档章节

umask

o
 osc_4nmshwhm
发布于 2018/08/07 13:32
字数 684
阅读 8
收藏 0

精选30+云产品,助力企业轻松上云!>>>

umask

用户权限掩码,用来设定 当前用户在创建文件或目录时的默认权限 。Linux 中,普通文件的默认最大权限是 0666(rw- rw- rw-)。即没有可执行的权限,如果非要有,就通过 chmod 来添加。而目录默认的最大权限为 0777(rwx rwx rwx),所有权限都开放。

查看当前用户权限掩码

$ umask
002

权限掩码可以这样理解:

1.  去掉 默认最大权限中与 umask 中相对应的位,就得到创建的文件或目录的默认权限。如:

普通文件默认最大权限为 0666 ,即 rw- rw- rw- ,掩码为 002,即 --- --- -w-,去掉对应位的 w,剩下的就是 rw- rw- r-- ,也就得到文件的默认权限。

2.  默认最大权限与掩码取反后相与就得到默认权限,如:0666 & (~002) = 0664

如:

$ umask
002
$ touch test
$ mkdir testdir
$ ls -l
-rw-rw-r--  1 shelmean shelmean         0 Aug  7 13:25 test
drwxrwxr-x  2 shelmean shelmean      4096 Aug  7 13:25 testdir

正如之前说 open 函数通过 O_CREAT 标志创建文件时,需要第三个参数 mode 来请求设定文件的权限,有可能设置不成功,就像当设置为 0666 时,其权限仍然为 664(默认权限),就是因为 umask 的原因。

如:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    /* 定义文件描述符并初始化为 -1 */
    int fd = -1;
    /*想要创建一个权限为 rw- rw- rw- 的文件,8进制表示为 0666*/
    if ((fd = open("test.txt",O_RDONLY | O_CREAT | O_EXCL, 0666)) == -1)
    {
        perror("open.txt open failed");
    }
    close(fd);
    return 0;
}

运行结果

$ ./a.out 
$ ls -l
-rw-rw-r-- 1 shelmean shelmean    0 Aug  7 21:01 test.txt

可以看到创建的文件权限并不是 rw- rw- rw- ,而是默认的文件权限。这是因为 umask 为 002,它会拿掉 其他(other)用户  权限,因此变成了 rw- rw- r-- 。

再如:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    /* 定义文件描述符并初始化为 -1 */
    int fd = -1;
    /*想要创建一个其他用户具有写权限的文件*/
    if ((fd = open("test.txt",O_RDONLY | O_CREAT | O_EXCL, 0446)) == -1)
    {
        perror("open.txt open failed");
    }
    close(fd);
    return 0;
}

运行结果

$ ./a.out
$ ls -l
-r--r--r-- 1 shelmean shelmean    0 Aug  7 21:07 test.txt

发现 其他(other)用户  权限被拿掉了。因为 umask 为 002 。也可以理解为 0446 & (~002) = 444 ( r-- r-- r-- )

umask的使用

#include <sys/types.h>
       #include <sys/stat.h>

       mode_t umask(mode_t mask);

如:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    /* 定义文件描述符并初始化为 -1 */
    int fd = -1;
    umask(0);//umask 为 000
    if ((fd = open("test.txt",O_RDONLY | O_CREAT | O_EXCL, 0446)) == -1)
    {
        perror("open.txt open failed");
    }
    close(fd);
    return 0;
}

运行结果

$ ./a.out
$ ls -l
-r--r--rw- 1 shelmean shelmean    0 Aug  7 21:23 test.txt

成功创建权限为 0446 即 r-- r-- rw- 的普通文件。

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

格式编号始终显示2个小数位 - Format number to always show 2 decimal places

问题: I would like to format my numbers to always display 2 decimal places, rounding where applicable. 我想将数字格式化为始终显示2个小数位,并在适用的情况下四舍五入。 Examples...

富含淀粉
43分钟前
22
0
Docker可视化工具Portainer

1 前言 从没想到Docker也有可视化的工具,因为它的命令还是非常清晰简单的。无聊搜了一下,原来已经有很多Docker可视化工具了。如DockerUI、Shipyard、Rancher、Portainer等。查看对比了一番...

南瓜慢说
45分钟前
20
0
日志系统新贵 Loki,真香!!

最近,在对公司容器云的日志方案进行设计的时候,发现主流的ELK或者EFK比较重,再加上现阶段对于ES复杂的搜索功能很多都用不上最终选择了Grafana开源的Loki日志系统,下面介绍下Loki的背景。...

庞陆阳
58分钟前
14
0
jQuery获取select onChange的值 - jQuery get value of select onChange

问题: I was under the impression that I could get the value of a select input by doing this $(this).val(); 我的印象是我可以通过执行$(this).val();来获取选择输入的值$(this).val()......

javail
今天
13
0
道翰天琼解密宇宙信息大脑三者最核心奥秘,破解认知智能基础理论(群聊形式)

三体论是探索研究宇宙,信息和人类大脑三者关系的理论体系。是认知智能的奠基理论体系之一。宇宙和信息,信息和人类大脑,人类大脑和宇宙,三者之间存在着某种未被完全揭示的奥秘。三体论的核...

jackli2020
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部