细数Linux的文件权限
普通权限
普通权限使用ls -l查看,最前面显示的即是,如:
# ls -l `which bash`-rwxr-xr-x 1 root root 964536 4月 1 10:17 /usr/bin/bash
-rwxr-xr-x 就是bash文件的权限,一共10位:
| -/d/l/... | rwx | rwx | rwx |
| 1位 -表示文件,d表示文件夹,l表示链接文件 |
3位 |
3位 所属用户组的读、写、执行权限 -表示没有对应的权限 |
3位 其他用户的读、写、执行权限 -表示没有对应的权限 |
所以,这个bash文件的权限就是:所属用户有读、写、执行权限,所属用户组的其他用户有读、执行权限,其他用户则只有执行权限。
普通权限使用chmod修改,命令中分别用u、g、o表示用户(user)、用户组(group)、其他(other),a表示所有(all),示例:
# chmod g+w 1.txt # 给所属用户组增加写权限
# chmod go-rw 1.txt # 可以组合使用,给所属组和其他用户取消读、写权限
# chmod a+x 1.txt # 给所有用户增加执行权
同时chmod还支持数字权限,读(r)为4、写(w)为2、执行(x)为1,实际权限就是加起来的总和,比如7就表示rwx,示例:
# chmod 777 1.txt # -rwxrwxrwx
# chmod 644 1.txt # -rw-r--r--
了解了数字权限,下面通过umask命令查看新建文件的默认权限:
# umask 0022
这个值是掩码,也就是默认除去的权限,第一位的0表示这是一个八进制数字,后三位与上文一致表示u、g、o中除去的权限,022相当于go-w,那么新建时的逻辑是:
当创建目录时:由最大权限777-022得出新建目录的默认权限755,也就是drwxr-xr-x
当创建文件时:由最大权限777-022=755,然后由于初始文件不能有执行权限(为了安全),若包含了就要减掉,所以这里每位都要再减1,最终就是644,也就是-rw-r--r--
注:由于r、w的数字是偶数(2和4),x是奇数(1),所以也可以这样描述,777减022后得出的三位数字,偶数保留,奇数减1
若要修改默认权限,只需要修改这个掩码即可,临时修改直接命令行执行,若要永久生效就写入profile或bashrc,改为0033的命令:
# umask 0033
特殊权限
特殊权限可以用来解决这样的一个问题:系统用户的密码都存储在/etc/shadow中,该文件非常重要不能开放权限,但其他用户又必须要能修改自己的密码,于是给可信任的passwd命令增加特殊权限,这样其他用户使用passwd时将获得与所有者(root)一样的权限,执行完毕权限自然也收回;
看看passwd的权限:
# ls -l `which passwd`
-rwsr-xr-x 1 root root 27832 6月 10 2014 /usr/bin/passwd
一个s代替了user上的x,这个即是特殊权限,有下面三种:
| 特殊权限 | 表现形式 | 命令操作 | 说明 |
| SUID | s代替user上的x | chmod u+s xxx |
只对二进制程序有效,执行时获得程序所有者的权限,执行完毕权限失效 举例:/usr/bin/passwd 注:慎用,这个权限可能超乎想象,比如给vi和rm赋予该权限,由于这俩通常属于root,那么任何人都可以编辑和删除任何文件了 |
| SGID | s代替group上的x | chmod g+s xxx |
对二进制程序有效,执行时获得程序所属用户组的权限,执行完毕权限失效(逻辑与suid一样,但影响没那么大,不过也要慎用) 对文件夹有效,文件夹内新建的目录和文件都必然属于该用户组,方便统一管理 |
| SBIT | t代替other上的x | chmod o+t xxx |
也叫粘滞位,只对文件夹有效,文件夹内的文件只有其所有者或root才能删除、移动、重命名 举例:/tmp就设置了该权限,故虽然其权限是777,但对其他用户的文件不能进行删除和修改 |
特殊权限同样有数字权限:SUID:4,SGID:2,SBIT:1,chmod中在普通权限之前加一位表示特殊权限,如:chmod 2755 xxx
隐藏属性
明明有权限却无法删除,甚至root都无权操作,那么八成是隐藏属性在限制;
隐藏属性使用lsattr查看,如:
# lsattr 1.txt
-------------e-- 1.txt
可以看到只有一个e属性,,下面是一些常见的:
| a | 使文件只可被追加内容,只有root可设置 |
| A | 使文件被访问时atime不被修改 |
| c | 使文件在被读写时由内核进行压缩 |
| d | 使文件不会被dump备份 |
| D | 作用于文件夹,使其被修改时立即同步到磁盘上 |
| e | 表示文件以ext4 extents存储的,ext4上新建文件的默认属性,不可用chattr修改 |
| i | 使文件不能被修改、删除、重命名、链接,只有root可设置 |
隐藏属性使用chattr修改:
# touch 1.txt
# chattr +i 1.txt
# lsattr 1.txt
----i--------e-- 1.txt
# chattr -i 1.txt
# lsattr 1.txt
-------------e-- 1.txt
ACL权限
acl,即访问控制列表,可以针对某个用户或用户组进行单独的权限设置;
用root创建一个只有自己有权限的目录/tmp/acl,使用getfacl查看:
# cd /tmp
# mkdir -m 700 testacl
# ls -ld testacl
drwx------ 2 root root 4096 7月 28 18:03 testacl
# getfacl testacl # 此时没有额外的acl权限
# file: testacl
# owner: root
# group: root
user::rwx
group::---
other::---
下面用setfacl配置读写权限给develop账号:
# setfacl -m u:develop:rwx testacl/ # 给用户develop增加rwx权限,可以加-R递归到子目录
# setfacl -m g:develop:rx testacl/ # 给用户组develop增加rx权限,可以加-R递归到子目录
# getfacl testacl/
# file: testacl/
# owner: root
# group: root
user::rwx
user:develop:rwx
group::---
group:develop:r-x
mask::rwx
other::---
注:acl权限会覆盖原有权限而不是组合,比如原来develop拥有属于other的r-x权限,将acl设置为-w-,那么develop的最终权限为-w-而不是rwx,所以若需要rwx则应直接将acl设置为rwx
删除acl权限:
# setfacl -x u:develop testacl/ # 删除用户develop的权限,可以加-R递归到子目录
# setfacl -b testacl/ # 删除所有额外的acl权限,可以加-R递归到子目录 # getfacl testacl/ # file: testacl/ # owner: root # group: root user::rwx group::--- other::---
over
浙公网安备 33010602011771号