以前在用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”,即其他人不给“写”权限。
(完)。