Linux文件或目录的权限位是由9个权限位来控制,每三位为一组,他们分别是文件属主(Owner)的读、写、执行,用户组(Group)的读、写、执行以及(Other)其它用户的读、写、执行:
r(read)可写权限,对应数字4
w(write)可写权限,对应数字2
x(execute)可执行权限,对应数字1
-(没有任何权限)对应数字0
# 参考博客: http://oldboy.blog.51cto.com/2561410/1060032
问题1:为什么默认权限目录755,默认文件权限644
不管是操作系统还是网站站点目录,安全权限的临界点:
1) 目录755,文件644是相对安全的权限
2)并且用户为root以及用户组root
以上权限兼顾了安全和使用,生产工作中一定要尽量要我们的文件和目录达到以上默认的权限,包括用户和属组都是root。
Linux系统默认权限的方针:允许浏览,查看,但是禁止创建和修改文件及文件内容以及执行。
对于网站服务来说,站点目录及子文件权限设置(d:755 f:644 root root)
而用户上传(图片、附件、头像等)的目录权限设置(d:755 f:644 www www)
可通过以下控制条件来控制用户上传的文件
1、程序:控制文件扩展名,如.log结尾的不能上传
2、http协议(请求方法.php禁止get)
3、磁盘挂载禁止上传可执行文件
问题2:若是希望默认创建的文件为000,目录为111,怎么能实现呢?
在Linux下文件的默认权限是由umask值决定的。
umask是通过八进制的数值来定义用户创建文件或目录的默认权限。
umask对应数值表示的是禁止的权限。具体的细节,文件和目录略有不同。
系统默认的umask值
[root@oldboy ~]# umask
0022
[test@oldboy ~]$ umask
0002
# 文件起始权限值:666
# umask 022
[root@oldboy oldboy]# umask
0022
[root@oldboy oldboy]# touch 1
[root@oldboy oldboy]# ll
total 0
-rw-r--r-- 1 root root 0 Dec 15 22:13 1
# umask 035
[root@oldboy oldboy]# umask 035
[root@oldboy oldboy]# umask
0035
[root@oldboy oldboy]# touch 2
[root@oldboy oldboy]# ll 2
-rw-r---w- 1 root root 0 Dec 15 22:15 2
# umask 002
[root@oldboy oldboy]# umask 002
[root@oldboy oldboy]# umask
0002
[root@oldboy oldboy]# touch 3
[root@oldboy oldboy]# ll 3
-rw-rw-r-- 1 root root 0 Dec 15 22:16 3
# 总结:
(1)若umask值全为偶数(如022),则创建文件的权限值为(666-022=644)
(2)若umask值有任意一位奇数(如035),即奇数位在相减后每位要加1,则创建文件的权限值为(666-035=631+011=642)
# 目录起始权限值:777
# umask 022
[root@oldboy oldboy]# umask
0022
[root@oldboy oldboy]# mkdir 1
[root@oldboy oldboy]# ls -ld 1
drwxr-xr-x 2 root root 4096 Dec 15 22:22 1
# umask 035
[root@oldboy oldboy]# umask 035
[root@oldboy oldboy]# umask
0035
[root@oldboy oldboy]# mkdir 2
[root@oldboy oldboy]# ls -ld 2
drwxr---w- 2 root root 4096 Dec 15 22:23 2
# umask 032
[root@oldboy oldboy]# umask 032
[root@oldboy oldboy]# umask
0032
[root@oldboy oldboy]# mkdir 3
[root@oldboy oldboy]# ls -ld 3
drwxr--r-x 2 root root 4096 Dec 15 22:23 3
# 总结:
创建目录最终的权限值就是777减去umask值,没有奇偶数之分
# 可以修改如下配置文件内容
[root@oldboy oldboy]# sed -n '61,64p' /etc/profile
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
这段脚本的意思就是当用户的UID大于199,且用户的UID和GID相等的情况下,改用户的umask值为002,反之为022
umask一般都是放在用户相关SHELL的配置文件中,比如用户家目录下的.bashrc或.profile,也可以放在全局性的用户配置文件中,比如/etc/login.defs,还可以放在SHELL全局的配置文件中,比如/etc/profile或/etc/bashrc等;
umask放在相关的配置文件中,目的是当管理员创建用户时,系统会自动为用户创建文件或目录时配置默认的权限代码。
特别提示:
在一般的生产场景,umask的使用不多见,在此,我们了解下umask是怎么回事即可。
企业面试:
什么是umask,作用是什么,怎么计算文件和目录的默认权限: