详解linux下umask的使用
最近开始学习linux ,看完马哥的linux课程关于umask的这个部分, 写这篇博客希望加深下我对umask的理解 和对umask不太清楚的博友一些帮助。
1 umask 是什么
当我们登录系统之后创建一个文件是会有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情。umask用于设置用户创建文件或者目录的默认权限,umask设置的是权限的“补码”,而我们常用chmod设置的是文件权限码。一般在/etc/profile,HOME/.bashprofile或者HOME/.profile中设置umask值。
2 umask是用来做什么的
默认情况下的umask值是022(可以用umask命令查看),此时你建立的文件默认权限是644(6-0,6-2,6-2),建立的目录的默认 权限是755(7-0,7-2,7-2),可以用ls -l验证一下, 现在应该知道umask的用途了吧,它是为了控制默认权限的。
[root@bogon test]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@bogon test]# umask
0022
[root@bogon test]# touch a.txt
[root@bogon test]# ls -l
total 0
-rw-r--r--. 1 root root 0 Jul 3 00:40 a.txt
[root@bogon test]# mkdir b
[root@bogon test]# ls -l
total 0
-rw-r--r--. 1 root root 0 Jul 3 00:40 a.txt
drwxr-xr-x. 2 root root 6 Jul 3 00:41 b
从上面可以看到, root 的umask是022(第一个0 代表特殊权限位,这里先不考虑), 创建的文件默认权限是644,创建的目录是755。
3 基本权限讲解
讲解umask的使用之前, 需要先讲解下文件的基本权限
linux文件权限
r |
w |
x |
|
---|---|---|---|
文件 |
可以查看文件内容 |
可以修改文件 |
可以把文件启动为一个运行的程序 |
目录 |
可以ls查看目录中的文件名 |
可以在目录中创建或者删除文件(只有w权限没法创建,需要x配合) |
可以使用cd进入这个目录ls-l显示目录内文件的元数据的信息 |
4 umask计算权限
对于文件和目录来说, 最大的权限其实都是777,但是执行权限对于文件来说,很可怕,而对目录来说执行权限是个基本权限。所以默认目录的最大权限是777,而文件的默认最大权限就是666。
对于root用户的umask=022这个来说,777权限二进制码就是(111)(111)(111),022权限二进制码为(000)(010)(010)。
- 所有权限二进制的1:代表有这个权限
- umask二进制1:代表要去掉这个权限,不管你原来有没有权限,你最终一定没有这个权限。
- umask二进制的0:代表我不关心对应位的权限,你原来有权限就有权限,没有就没有, 我不影响你。
umask为002的文件默认权限计算方法
所有者 r |
所有者 w |
所有者 x |
所在组 r |
所在组 w |
所在组 x |
其他 r |
其他 w |
其他 x |
|
---|---|---|---|---|---|---|---|---|---|
所有权限777 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
umask掩码002 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
计算后的值 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
umask为002的目录默认权限计算方法
所有者 r |
所有者 w |
所有者 x |
所在组 r |
所在组 w |
所在组 x |
其他 r |
其他 w |
其他 x |
|
---|---|---|---|---|---|---|---|---|---|
所有权限666 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
umask掩码002 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
计算后的值 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
umask为023的目录默认权限计算方法
所有者 r |
所有者 w |
所有者 x |
所在组 r |
所在组 w |
所在组 x |
其他 r |
其他 w |
其他 x |
|
---|---|---|---|---|---|---|---|---|---|
所有权限777 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
umask掩码023 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
计算后的值 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
umask为023的文件默认权限计算方法
所有者 r |
所有者 w |
所有者 x |
所在组 r |
所在组 w |
所在组 x |
其他 r |
其他 w |
其他 x |
|
---|---|---|---|---|---|---|---|---|---|
所有权限666 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
umask掩码023 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
计算后的值 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
上面就是一个umask的正常计算过程,但是这样实在是太麻烦了。我们使用如下的简单的方法快速计算。
- 对于目录,直接使用777-umask即可,就得到了最终结果。
- 对于文件,先使用666-umask。
- 如果对应位上为偶数:最终权限就是这个偶数值。
- 如果上面的对应为上有奇数,就对应位+1。
上面的这个方法计算是非常方便的, 为何得到奇数要+1呢。
文件的最大权限是666,都是偶数,你得到奇数,说明你的umask有奇数啊,读为4,写为2,都是偶数,说明你有执行权限的。
就按照上面的umask=023为例,在计算其他用户权限的时候6-3=3 ,6是读写,3是写和执行,其实应该是读写权限减去读权限的得到写权限的,相当于我们多减去了一个执行权限。所以结果加1。
5 umask的修改
umask 的修改分2中, 临时修改的和永久修改的
临时修改:
[root@bogon test]# umask 023
[root@bogon test]# umask
0023
[root@bogon test]#
永久修改:
可以编辑以下文件 添加umask=022。
交互式登陆的配置生效:
/etc/profile < /etc/profile.d/*.sh < ~/.bash_profile < ~/.bashrc </etc/bashrc 【/etc/bashrc的配置最有效 可以覆盖前面的配置】
非交互登陆的配置生效:
~/.bashrc < /etc/bashrc < /etc/profile.d/*.sh
6 常用umask
[root@bogon test]# umask 002
[root@bogon test]# umask
0002
[root@bogon test]# umask 022
[root@bogon test]# umask
0022
以上就是本文的全部内容,希望对大家的学习有所帮助。
- ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
- 【weakfilescan】敏感文件扫描工具
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
- ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)
- CVE-2017-11882漏洞复现
- ASP.NET Core使用静态文件、目录游览与MIME类型管理
- Python 黑客——使用Python破解门禁系统
- ASP.NET Core文件上传与下载(多种上传方式)
- 采用Opserver来监控你的ASP.NET项目系列(三、监控你的服务器状态)
- eclipse中运行hbase时不能显示表中的值
- 从 PHP 到 Java
- 用Lua定制Redis命令
- 见招拆招-PostgreSQL中文全文索引效率优化
- 通过2-3-4树理解红黑树
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php文件包含的几种方式总结
- 一个基于Laravel5的个人博客系统:Lablog搭建教程
- php快速导入大量数据的实例方法
- Laravel 模型关联基础教程详解
- yunBT:一个基于TP3.1的多用户BT离线下载程序,支持在线播放
- 使用Chihaya搭建一个可以屏蔽迅雷的Tracker
- [jio本]Debian9一键安装各种下载工具
- php实现QQ小程序发送模板消息功能
- 微软自家沙盒 Sandbox公布
- php DES加密算法实例分析
- php提供实现反射的方法和实例代码
- PHP实现批量修改文件名的方法示例
- Linux VPS快速下载Bilibili视频脚本 ,支持1080P/720P/360P等格式
- PHP递归统计系统中代码行数
- PHP切割整数工具类似微信红包金额分配的思路详解