基本使用
chmod
(应该是change mode的意思?)用于在Linux终端中修改用户权限(读/写/运行),也就是 set permissions
:
chmod permissions file
或者是:
chmod permission1_permission2_permission3 file
需要注意,Linux下共有三种类型的用户:
Owner
:文件所有者Group
:文件所有组World
:其他用户
所以我们需要同时设定三种用户对应的权限,即分别设定对应文件三种用户是否可读,可写,可执行,例如我们通过命令 ls -l
往往可以看到:
drwxr-xr-x username usergroup ....
可以看到最前面的一系列字符,首先 d
代表的是 directory
即这是一个目录,username
为 文件所有者,usergroup
为 文件所有组,后面的9个字符其实就是对应三种用户的三个权限((r)ead (w)rite e(x)ecute
):
rwx
:文件所有者具有读、写、执行权限r-x
:文件所有组具有读和执行权限r-x
:其他用户具有读和执行权限
而对于计算机存储来说,我们只需要一个 bit
即 0
或者 1
就可以表示是否具有一个权限,那显然对于三种权限我们只需要 xxx
三个 bit
即可,并且一个值对应特定的权限,例如:
chmod 755 some_file.txt
这个例子的 755
分别对应上述三种用户对象的权限:
7
:二进制表示为111
,即表示文件所有者rwx
三种权限都有5
:二进制表示为101
,即表示文件所有组权限为r-x
5
:同理
如果你打算对目录下面的所有文件都设置权限,可以通过 -R
参数,表示 recursive,即递归的意思,即对指定的目录递归应用所指定的权限:
chmod -R 755 some_dir
其他
s 权限
chmod
还可以设置一些比较特殊的权限,例如 s
,这个权限表示 setuid
,表示将会根据这个 setuid
位来决定可执行文件的执行用户,或者是目录下的一些行为的结果。
例如下面的一个文件:
-rwsrw-r-x root root passwd
这个是在 /usr/bin
下面的一个系统自带的可执行文件,即 passwd
命令,所有用户都可以通过这个命令来修改自己的密码。但是,用户密码是存放在 /etc/shadow
文件里面,而这个文件只有 root
用户才有权限进行修改。这样就与上述场景矛盾了,因为通常来说,一个用户执行的可执行文件,也只会拥有这个用户本身的权限,这也就意味着按理来说,普通用户通过 passwd
无法修改自己的密码,因为他们没有修改 /etc/shadow
的权限!
而这里就体现了 setuid
位的意义,你会发现 passwd
的文件所有者的权限为 rws
,对于设置了 setuid
位的可执行文件,任何用户在执行这个文件时,都将以文件所有者这个用户来执行,也就是说,事实上每个普通用户在修改自己的密码的时候,都是借用了 root
来修改的,而 root
用户并不需要知道普通用户想要如何修改自己的密码!这样就可以在保证了系统文件的权限控制的同时,允许用户拥有一定的自我管理能力。这种做法往往能体现在一些权限管理的设计上面,例如我们可以为用户提供一些服务,而将这些服务涉及到的一些敏感操作封装在由系统或者管理员提供的渠道或者方法之中,系统不关注用户的操作内容,而用户也不需要关注系统如何实现自己的操作,这样彼此之间都可以隔离。
t 权限
这是粘滞位权限,借用了 9 9 9 位权限里面的最后一位