关注微信公众号:CodingTechWork,一起学习进步。

引言

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

  1. [root@linux01 ~]# useradd userA
  2. [root@linux01 ~]# su - userA
  3. [userA@linux01 ~]$ ll
  4. total 0
  5. [userA@linux01 ~]$ mkdir dir01
  6. [userA@linux01 ~]$ mkdir dir02
  7. [userA@linux01 ~]$ touch t1.txt
  8. [userA@linux01 ~]$ touch t2.txt
  9. [userA@linux01 ~]$ ll
  10. total 8
  11. drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir01
  12. drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir02
  13. -rw-r----- 1 userA userA 0 Mar 27 10:25 t1.txt
  14. -rw-r----- 1 userA userA 0 Mar 27 10:25 t2.txt

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

  1. [userA@linux01 ~]$ umask
  2. 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的命令格式一样。

    示例:
  1. [userA@linux01 ~]$ umask -p
  2. umask 0027
  3. [userA@linux01 ~]$ umask -S
  4. u=rwx,g=rx,o=
  5. [userA@linux01 ~]$ umask u=rw
  6. [userA@linux01 ~]$ umask -p -S
  7. umask -S u=rw,g=rx,o=
  8. [userA@linux01 ~]$ umask -p
  9. umask 0127
  10. [userA@linux01 ~]$ umask u=rwx
  11. [userA@linux01 ~]$ umask -p
  12. umask 0027
  13. [userA@linux01 ~]$ umask o=x
  14. [userA@linux01 ~]$ umask -p
  15. umask 0026
  16. [userA@linux01 ~]$ umask -p -S
  17. umask -S u=rwx,g=rx,o=x

umask存放位置

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

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

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

umask值计算

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

  1. [userA@linux01 ~]$ umask
  2. 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值。
  修改前:

  1. [userA@linux01 ~]$ umask
  2. 0027
  3. [userA@linux01 ~]$ vim /etc/profile




  修改后:

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

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

总结

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

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

  1. Linux下遍历目录及文件,更改权限

    Linux下遍历目录及文件,更改权限 引言: 我在Linux下搭建android时,将eclipse及sdk复制到/usr/下时,总会出现无法读,无法写写样的问题. 解决方案: 有两个方案: 一.将复 ...

  2. 如何设置UNIX/Linux中新创建目录或文件的默认权限

    在unix或者linux中,每创建一个文件或者目录时,这个文件或者目录都具有一个默认的权限,比如目录755,文件644,那么这些默认权限是怎么控制的呢? 答案是"umask"权限掩 ...

  3. Linux创建目录和文件的默认权限设置

    这两天,项目中使用jenkins自动构建系统时遇到了在Linux中创建目录和文件的权限问题,临时的解决办法是在脚本中增加了chmod赋权限命令; 偶然想到Linux应该是可以设置默认权限的,故学习了一 ...

  4. mysql基础之mariadb的安装,连接,用户,密码,权限设置语句详解

    一.mariadb安装 1.配置mariadb源: [root@ren7 ~]# vim /etc/yum.repos.d/mariadb.repo [mariadb] name = MariaDB ...

  5. Linux 文件和目录的权限设置 - umask(默认权限),chmod(改变权限)

    1. chmod 改变已有目录或文件的权限 chmod 设置已有目录或文件的权限.可以为指定范围的用户添加或删除权限. 权限范围的表示法如下: u:User,即文件或目录的拥有者: g:Group,即 ...

  6. linux用户,组,文件等操作

    参考: https://blog.csdn.net/chengqiuming/article/details/78601977   , https://www.cnblogs.com/123-/p/4 ...

  7. Linux文件的默认权限:umask

    1. 文件的默认权限 Linux下当我们新建一个文件和目录时,该文件和目录的默认权限是什么? 通过umask命令来查看: $ umask0002 $ umask -Su=rwx,g=rwx,o=rx ...

  8. linux下为目录和文件设置权限

    摘:linux下为目录和文件设置权限 分类: Linux2012-05-09 03:18 7456人阅读 评论(1) 收藏 举报 linuxwordpressweb数据库serverfile linu ...

  9. Linux中/proc目录下文件详解

    转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ...

随机推荐

  1. SwiftUI render WKWebView

    SwiftUI render WKWebView // // ContentView.swift // webview-app // // Created by 夏凌晨 on 2020/10/27. ...

  2. JWT & JSON Web Tokens

    JSON Web Tokens https://jwt.io json web token example https://jwt.io/introduction/ https://medium.co ...

  3. Microsoft Lifecycle Policy

    Microsoft Lifecycle Policy The Microsoft Lifecycle Policy gives you consistent and predictable guide ...

  4. React 17 发布候选版本, 没有添加新功能

    React 17 发布候选版本, 没有添加新功能 React v17.0 Release Candidate: No New Features https://reactjs.org/blog/202 ...

  5. true && number !== boolean

    true && number !== boolean bug let result = ``; // section, name ? create text, compute cent ...

  6. Flutter DraggableScrollableSheet 可滚动对象的容器

    文档 Example import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp ex ...

  7. iOS拍照定制之AVCapturePhotoOutput

    问题 领导安排任务,写个拍照功能,界面跟系统拍照有点出入 拍完照片,底部显示已拍照片,有个拍照上限[在此不论] 点击已拍照片,可以预览.放大缩小查看 思路 系统拍照肯定不行了,只能定制,没提是否拍照禁 ...

  8. IO、NIO、BIO的区别

    我们首先得明白什么是同步,异步,阻塞,非阻塞,只有这几个单个概念理解清楚了,然后在组合理解起来,就相对比较容易了. IO模型主要分类: 同步(synchronous) IO和异步(asynchrono ...

  9. Go的包

    目录 go的包 一.包的创建规则 二.包的导入规则 三.包的函数调用 go的包 一.包的创建规则 一个包就是一个文件夹. 同一个包(文件夹)下,所有go文件都只能用同一个package,也就是每个文件 ...

  10. 第46天学习打卡(四大函数式接口 Stream流式计算 ForkJoin 异步回调 JMM Volatile)

    小结与扩展 池的最大的大小如何去设置! 了解:IO密集型,CPU密集型:(调优)  //1.CPU密集型 几核就是几个线程 可以保持效率最高 //2.IO密集型判断你的程序中十分耗IO的线程,只要大于 ...