天天看点

文件的特殊权限

命令 : chattr

语法: chattr  [+-=][ASaci [文件或者目录名]

‘+-=’ : 分别为增加、减少、设定

‘A’ : 增加该属性后,文件或目录的atime将不可被修改;

‘S’ : 增加该属性后,会将数据同步写入磁盘中;

‘a’ : 增加该属性后,只能追加不能删除,非root用户不能设定该属性;

‘c’ : 自动压缩该文件,读取时会自动解压;

‘i’ : 增加后,使文件不能被删除、重命名、设定链接接、写入、新增数据;

# chattr +i test2

# touch test2/test1

touch: 无法创建'test2/test1': 权限不够

# chattr -i test2

# touch test2/test1

# chattr +i test2

# rm -f test2/test1

rm: 无法删除'test2/test1': 权限不够

对 ‘test2’ 目录增加 ‘i’ 权限后,即使是root账户也不能在 ‘test2’ 里创建或删除test1文件。

# chattr -i test2

# touch test2/test3

# ls test2

test1  test3

# chattr +a test2

# rm -f test2/test1

rm: 无法删除 'test2/test1': 不允许的操作

# touch test2/test4

# ls test2

test1  test3  test4

test2目录增加 ‘a’ 权限后,只可以在里面创建文件,而不能删除文件。文件同样可以适用这些权限。

# chattr +a test2/test1

# echo '11111' > test2/test1

-bash: test2/test1: 不允许的操作

# echo '11111' >> test2/test1

# cat test2/test1

11111

# chattr +i test2/test3

# echo '11111' >> test2/test3

-bash: test2/test3: 权限不够

# echo '11111' > test2/test3

-bash: test2/test3: 权限不够

# rm -f test2/test3

rm: 无法删除'test2/test3': 权限不够

命令 : lsattr

该命令用来读取文件或者目录的特殊权限,语法为 lsattr  [-aR] [文件/目录名]

‘-a’ : 类似与ls 的-a 选项,即连同隐藏文件一同列出;

‘-R’ : 连同子目录的数据一同列出

# lsattr test2

-----a-------e- test2/test1

----i--------e- test2/test3

-------------e- test2/test4

# lsattr -aR test2

----i--------e- test2/.

-----a-------e- test2/test1

-------------e- test2/..

----i--------e- test2/test3

-------------e- test2/test4

set uid 和set gid 和 sticky bit

set uid :该权限针对二进制可执行文件,使文件在执行阶段具有文件所有者的权限。比如 passwd 这个命令就具有该权限。当普通用户执行 passwd 命令时,可以临时获得 root 权限,从而可以更改密码。

set gid:该权限针对目录。目录被设置这个权限后,任何用户在此目录下创建的文件都具有和该目录所属的组相同的组。

sticky bit:可以理解为放删除位。一个文件是否可以被某用户删除,主要取决于该文件所在目录是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能被删除,同时也不能添加新的文件。如果希望用户能够添加文件但不删除该目录下其他用户的文件,则可以对父目录增加该权限。设置该权限后,就算用户对目录具有写权限,也不能删除其他用户的文件。

例如,passwd 命令设置了一个 set uid 权限,而/tmp 目录则设置了一个 sticky bit 权限。查看一下它们的权限:

# ls -l /usr/bin/passwd

-rwsr-xr-x. 1 root root 25980 2月  22 2012 /usr/bin/passwd

# ls -ld /tmp/

drwxrwxrwt. 5 root root 4096 10月 31 14:13 /tmp/

从上面你会发现:passwd 显示的是 rws 而非传统的 rwx ,用数字表示为 4755 。/tmp/显示的 rwt 而非rwx ,用数字表示为1777。那么这个4和1是如何计算出来的呢?当有特殊权限时,第一位数字可以是0   1(--t)   2(-s-)   3(-st)   4(s--)   5(s-t)   6(ss-)   7(sst)。

再回过头来看passwd ,它是s--,所以是4;而/tmp/是--t ,所以是1;

配置这些特殊权限的方法和之前一样。比如我想给一个文件增加一个set uid 权限,那么命令为" chmod u+s filename ",而去掉这个权限的命令则为" chmod u-s filename "。同理,想设置一个set gid 权限的命令为为 " chmod g+s dirname ",设置一个stick bit 权限的命令为 " chmod o+t dirname "。