Linux—用户新建目录和文件的默认权限设置:umask详解

技术公众号:后端技术解忧铺
关注微信公众号:CodingTechWork,一起学习进步。

引言

  我们有没有思考过一个问题,在登录Linux系统后,我们创建的目录或者文件的权限,为什么每次创建都是统一的?我们做以下实验:新建一个用户userA,然后分别创建目录dir01和dir02,文件t1.txt和t2.txt。

[root@linux01 ~]# useradd userA
[root@linux01 ~]# su - userA
[userA@linux01 ~]$ ll
total 0
[userA@linux01 ~]$ mkdir dir01
[userA@linux01 ~]$ mkdir dir02
[userA@linux01 ~]$ touch t1.txt
[userA@linux01 ~]$ touch t2.txt
[userA@linux01 ~]$ ll
total 8
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir01
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir02
-rw-r----- 1 userA userA    0 Mar 27 10:25 t1.txt
-rw-r----- 1 userA userA    0 Mar 27 10:25 t2.txt

  从上述的实验中发现,每次创建目录的权限都是drwxr-x---,即为750,文件的权限都是-rw-r-----即为640。我们能想到的必定这是个默认权限,那这个默认权限由谁来控制?答案是:umask

[userA@linux01 ~]$ umask
0027

  是的,我们可以通过umask来改变用户的创建文件和目录的默认权限,Linux是注重安全性的OS,而安全离不开权限的设置,对于创建新的目录和文件设定必要的初始权限是必不可少的,Linux和Windows在权限一个很大的区别就是:Windows中,新建目录和文件是继承上级目录权限;Linux是通过使用umask设置的默认权限给新建的目录和文件赋予初始权限。下面将一起走进umask的学习和使用。

umask

umask介绍

  首先,我们要了解的是,Linux文件的最大权限是666,目录的最大权限是777,为何目录要比文件权限大?因为目录需要有执行权(x)才能够进入到目录中。
  umask的作用是在用户登录Linux系统环境下,设置用户创建目录和文件的初始化权限。

umask命令

语法:

  • umask [-p] [-S] [mode]
    参数:
  • -p:表示完整打印umask内容。
  • -S:表示以符号形式显示设置。
  • mode:表示设置权限,mode和chmod的命令格式一样。
    示例:
[userA@linux01 ~]$ umask -p
umask 0027
[userA@linux01 ~]$ umask -S
u=rwx,g=rx,o=
[userA@linux01 ~]$ umask u=rw
[userA@linux01 ~]$ umask -p -S
umask -S u=rw,g=rx,o=
[userA@linux01 ~]$ umask -p
umask 0127
[userA@linux01 ~]$ umask u=rwx
[userA@linux01 ~]$ umask -p
umask 0027
[userA@linux01 ~]$ umask o=x
[userA@linux01 ~]$ umask -p
umask 0026
[userA@linux01 ~]$ umask -p -S
umask -S u=rwx,g=rx,o=x

umask存放位置

  一般umask的值可以在/etc/profile文件中定义。

# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 022
fi
··· ···
··· ···
umask 027

  其中,我们可以看到账号UID>199UID=GID用户名=用户组名时,umask值为002,否则,umask值为022
  umask 027表示当前用户的umask掩码值设置为027。

umask值计算

  上面一直在讲umask掩码值,那这个值究竟怎么计算?或者说,这个掩码值和目录或文件的默认权限关系是怎样的?

[userA@linux01 ~]$ umask
0027

  我们通过umask命令获取到当前用户的umask掩码值为0027,为何是4位?其实真正有效的是后3位。第1位是代表文件所具有的特殊权限(SetUID、SetGID、Sticky BIT)。
  通过umask值我们可以反推出用户新建目录和文件的默认权限是什么。

原理

  1. 将目录或文件的默认最高权限(目录777、文件666)和umask掩码值都转换为二进制。
  2. 对umask取反
  3. 将两个二进制值做与运算
  4. 将与运算后的二进制值转换为十进制,即为用户的新建目录或文件的默认权限。
示例

目录场景

  • 掩码值:0022
  • 目录默认最高权限:777

计算默认权限:

  1. 转为二进制:
    777 = 0111 0111 0111
    022 = 0000 0010 0010
  2. umask取反
    NOT运算:1111 1101 1101
  3. 与运算
    0111 0111 0111 总权限777
    1111 1101 1101 umask取反
    ====================
    0111 0101 0101 新建目录默认权限
  4. 转为十进制
    0111 0101 0101=755
    即该用户新建目录的默认权限为755,即为rwxr-xr-x

文件场景

  • 掩码值:0022
  • 目录默认最高权限:666

计算默认权限:

  1. 转为二进制:
    666 = 0110 0110 0110
    022 = 0000 0010 0010
  2. umask取反
    NOT运算:1111 1101 1101
  3. 与运算
    0110 0110 0110 总权限666
    1111 1101 1101 umask取反
    ====================
    0110 0100 0100 新建目录默认权限
  4. 转为十进制
    0110 0100 0100 = 644
    即该用户新建目录的默认权限为644,即为rw-r--r--

公式

  按照umask计算的原理很麻烦,所以弄一个公式来总结计算如下:

  • 目录(文件)的初始权限 = 目录(文件)的最大默认权限 - umask权限

  而这种公式方式需要注意分类:

  • 目录公式:
    用户目录默认权限 = 777 - umask值

  • 文件公式:
    1)偶数umask:用户文件默认权限 = 666 - umask偶数值
    2)奇数umask:用户文件默认权限 = 666 - umask奇数值 + 1

示例
  1. 对照原理示例umask值=022,计算如下:
    用户目录默认权限:777-022=755,即为rwxr-xr-x
    用户文件默认权限:666-022=644,即为rw-r--r--

  2. 对照引言中的实验umask值=027,计算如下:
    用户目录默认权限:777-027=750,即为drwxr-x---
    用户文件默认权限:666-027+1=640,即为-rw-r-----

umask值修改

暂时修改

  暂时修改的方式,可以通过umask命令来更改,比如计算出权限对应的umask值要改为027,则直接用该用户登录Linux系统后,使用命令umask 027即可。但是,一旦用户退出登录后,umask将恢复默认值,刚才设置的将会失效。所以,这种umask命令方式,只是适合当前会话。

永久修改

  除了使用umask命令进行当前会话的用户默认权限设置外,我们还可以对该用户永久性修改umask值。针对某个用户修改,需要用该用户登录Linux,然后修改/etc/profile文件中的umask值。
  修改前:

[userA@linux01 ~]$ umask
0027
[userA@linux01 ~]$ vim /etc/profile

/etc/profile

  修改后:

[userA@linux01 ~]$ vim /etc/profile
[userA@linux01 ~]$ umask
0022
[userA@linux01 ~]$ mkdir dir03
[userA@linux01 ~]$ touch t3.txt
[userA@linux01 ~]$ ll
total 12
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir01
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir02
drwxr-xr-x 2 userA userA 4096 Mar 27 21:48 dir03
-rw-r----- 1 userA userA    0 Mar 27 10:25 t1.txt
-rw-r----- 1 userA userA    0 Mar 27 10:25 t2.txt
-rw-r--r-- 1 userA userA    0 Mar 27 21:48 t3.txt

  明显可以看出修改后,新建目录和文件的权限已经发生变化。

总结

  如果我们登陆Linux系统后,新建目录或者文件很多,且权限都是某种特定的,则可以通过umask命令来暂时设置当前会话的默认权限。如果后期需要永久性的可以修改/etc/profile中的umask值。
  当然,对于应用程序一些吐文件时需要先新建的目录或者文件设置权限时,我们为了安全方式,可能不能永久性修改umask值,但,我们可以在启动脚本里面加上umask 022这种命令,来使得当前应用启动时受到当前启动脚本中的umask来控制应用程序输出的文件或目录的默认权限。

### 回答1: 在Linux中,可以使用umask命令来设置文件默认权限。umask命令用于设置新创建文件默认权限掩码,它会屏蔽掉文件权限位,使其默认权限为指定的补集。例如,如果umask为022,则新创建的文件权限为644,新创建的目录权限为755。可以通过修改umask来改变文件默认权限。 要设置文件默认权限,可以按照以下步骤操作: 1. 打开终端,输入umask命令查看当前的umask。 2. 使用umask命令设置新的umask。例如,如果要将默认权限设置为755,则可以使用umask 022命令。 3. 创建新的文件目录,它们的默认权限将会是指定umask的补集。例如,如果umask为022,则新创建的文件权限为644,新创建的目录权限为755。 注意:umask是八进制数,它的范围为-777,其中每一位代表一种权限,分别为读、写、执行权限。例如,umask为022表示屏蔽掉组和其他用户的写权限,即新创建的文件目录默认权限为755。 ### 回答2: Linux是一种多用户、多任务的操作系统,为了保证文件目录的安全性,Linux系统中对文件目录设置了不同的权限。在Linux系统中,每个文件目录都有一个所有者和一组访问权限,这些权限可以控制用户文件目录的访问权限。比如,读、写、执行权限,所有者可以授予其他用户相应的权限。 在Linux系统中,我们可以通过chmod命令来设置文件目录的访问权限。该命令需要指定文件目录的路径和对应的权限,有三种设置权限的语法格式: 1.符号模式: 使用"u,g,o,a"来表示用户用户组、其他用户和所有用户,使用"+"、"-"或"="来表示增加权限、删除权限、赋权权限。 chmod u+rwx,g+rx,o+r testfile 该命令的意思是,给testfile文件的所有者(u)添加读、写和执行(rwx)权限,给用户组(g)添加读和执行(rx)权限,以及给其他用户(o)添加只读(r)权限。 2.数字模式: 使用三个数字的表示法来设置权限,其中第一个数字表示所有者的权限,第二个数字表示用户组的权限,第三个数字表示其他用户权限,每个数字的都是0到7之间的数字。 chmod 754 testfile 该命令的意思是,给testfile文件的所有者添加读、写和执行权限(7 = 4 + 2 + 1),给用户组添加读和执行权限(5 = 4 + 1),给其他用户添加只读权限(4)。 3.字母模式: 使用r、w、x和s等符号来表示读、写、执行和特殊权限,其中"s"表示设置SUID,即设置程序的用户ID,"t"表示设置sticky bit,即只允许文件的所有者删除该文件。 chmod u=rwx,g=rx,o=r testfile 该命令的意思是,给testfile文件的所有者添加读、写和执行(rwx)权限,给用户组添加读和执行(rx)权限,给其他用户添加只读权限(r)。 总之,通过这些命令可以为文件目录设置相应的权限,从而控制文件的读写执行操作,保证文件目录的安全性和隐私。 ### 回答3: 在Linux系统中,每个文件都有一组权限,用于控制文件的读、写和执行。默认情况下,新创建的文件权限是由 umask 决定的。umask 是在创建新文件时从文件权限掩码中删除的权限位。 如果您想更改文件默认权限,可以通过在配置文件设置 umask来实现。umask通常用三个数字表示,每个数字代表一个权限组(所有者、群组和其他人),例如 umask 022 表示所有者拥有读写权限,而群组和其他人只有读权限。 要更改默认权限,您需要编辑 /etc/profile 或 ~/.bashrc 文件,并添加以下行: umask 002 要使新的 umask 变更生效,您需要注销并重新登录,或者使用以下命令使新的设置立即生效: source /etc/profile 您还可以使用 chmod 命令来更改文件默认权限。要更改默认权限,您可以在 /etc/rc.local 中添加 chmod 命令。例如,如果您想将 /var/www 目录和其下的文件默认权限设置为 755,您可以添加以下行: chmod -R 755 /var/www 您可以根据需要更改文件默认权限。请注意,更改默认权限可能会导致文件的安全性降低,因此请谨慎操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值