# unix 中 umask 是什么？(转)

Source: https://blog.ferstar.org/posts/understanding-umask-permissions-unix/






转自:[http://blog.csdn.net](http://blog.csdn.net/xxd851116/article/details/9722127) 

以前在用ftp的时候一直懵懵懂懂，不知所以然。最近遇到ftp上传问题，文件无法上传。查了很多资料终于弄明白了。
要知道umask是什么，必须先要了解unix的权限是怎么设计的。了解这个对我们平时做业务系统的权限设计有很好的参考作用。


## unix权限
一直崇拜uinx的权限设计
曾经有同事问我，用二进制到底怎么实现权限控制。我曾经回答过，似乎对方不是太明白。趁此总结一下。

unix按三类群体设计权限，分别是：
> 1、所有者权限
2、组权限
3、公共权限

Unix有组的概念，觉得设计的不错，WEB系统设计可以参考这种设计模式。

某个文件（或目录）的上面三种权限可以通过一个非常简洁的表达式来展现。例如：
> rwxr-xr-x

它仅仅只有9个字符，每3个作为一组（rwx r-x r-x），依次分别表示所有者权限、组权限和公共权限。每组内r、w、x分别表示了文件在该用户群体中的读、写、执行权限（- 表示无权限）。

字符的运算速度远比数字慢，为了表达这种表达式，设计师用了二进制来表示。由于二进制只有两种状态：0和1，恰好能表示事物互斥的两种特性“有”和“无”，“开”和“关”等。（javascript中就是用0和1来表示boolean型对象的值）

我们知道，计算机中表示数据量的最小单位是“bit”，中文名称叫“比特”，我习惯称“位”。8位组成一个“Byte”，即“字节”。1024个“Byte”就是一个K的“Byte”，通常所写成“KB”。因此有下面的表达式：
> 1Byte =  8bit
1KB = 1024Byte = 8 * 1024bit
1MB = 1024KB

那在计算机中，如何表示一个字符呢？


如果我不知道字符编码我会这样做：把所有的字符都列出来，用序号表示，1表示a，2表示b，以此类推......然后再把序号转换成计算机可识别的二进制。好像是可以的。但是这样这个世界就乱了。因此字符编码产生了，它的作用就是指定计算机的“比特”和字符的映射关系。

不同的字符编码对字符占用的的“比特”宽度是不一样的。标准ASCII字符编码规定了1个字符占用8个“比特”，即1个字节。

如果这种权限表达式“rwxr-xr-x”用字符作存储，则需要 9 * 8 bit = 72 bit。

这种设计在当今硬盘不值钱的年代，当然无关紧要，但你要知道unix是什么时候诞生的，那个时候存储的价格可谓天价，也因此造就了一种艺术性的设计。

1、对于某个群体对象来说，具有三种操作：读r、写w、执行x。
2、每个操作用一个“比特”来表示，1表示具有该权限，0表示不具有该权限。

所以：
> \- \- \- = 000 = 0
\- \- x = 001 = 1
\- w \- = 010 = 2
\- w x = 011 = 3
r - - = 100 = 4
r - x = 101 = 5
r w - = 110 = 6
r w x = 111 = 7

原来，这是充分利用了“最小单位”。其中的哲学在于“一个多选项如何用一个数字来表示”。

至此，某个群体的权限可以使用数字来表示。

下面是在aix6.1中用“ls -l”命令后显示的内容：
>drwxr-xr-x    5 root     system          256 Jul 11 17:51 WEB-INF
-rw-r--r--    1 root     system         1392 Jul 11 17:51 index.jsp

1、第1列前有一个“d”或“-”，“d”表示这是一个目录，“-”表示不是目录。后面9位就是权限表达式了。
2、第2列表示文件硬链接的数目。
3、第3列“root”表示该文件的所有者，默认是该文件的创建者（当然，也可以通过chown修改所有者）。
4、第4列“system”表示该文件的群组，默认是该文件是创建者所在的群组（当然，也可以通过chgrp修改群组）。
5、第5列就是表示该文件的“字节”大小。
6、第6列表示创建时间。
7、第7列就是文件（或目录）名了。

## umask含义

umask指文件权限的掩码。它是从权限中“拿走”相应的“位”（即bit）,且文件创建时不能赋予执行权限。
可以去百度百科了解下更多信息：<http://baike.baidu.com/view/1867757.htm>

您可以输入命令来查询当前系统的umask值：
```
# umask
022
#
```
这就表示，除了我之外（组成员和其他人）没有写（-w- = 010）权限。其实就是对“位”的“取反”。

这种设计的好处在于，在创建文件的时候有掩码帮助您初始化默认权限，不用每次都去指定这个文件的权限。
“022”也是一般unix系统默认的掩码值。

接下来创建文件（或目录）时，新创建的文件（或目录）的权限就是“755”。

## FTP中的umask值的作用

aix中可以通过修改文件“/etc/inetd.conf”中ftp一行：
`ftp stream tcp6 nowait root /usr/sbin/ftpd ftpd`

将该行修改为：
`ftp stream tcp6 nowait root /usr/sbin/ftpd ftpd -u xxx`
其中：“xxx”即掩码值。

它用来初始化ftp上传的文件默认的权限。

例如：
`ftp stream tcp6 nowait root /usr/sbin/ftpd ftpd -u 022`

ftp上传的文件的默认权限将是“755”，即其他人不给“写”权限。

（完）。

