Linux 权限管理非常灵活,不像 windows 那一坨那么混乱。
现在来谈谈 Linux 下的权限管理吧。
vagrant@lucid32:/tmp$ ls -l /tmp/vagrant-shell
-(1)rwx(2)r-x(3)r-x(4) 1 vagrant(5) vagrant(6) 95 2016-07-29 04:49 /tmp/vagrant-shell
文件类型
首先来看第一部分,第一部分 - 表示文件类型,有以下几种文件类型:
| 符号 | 类型 |
|---|---|
| - | 普通文件 |
| d | 文件夹 |
| l | 符号链接 |
| b | 块设备文件 |
| c | 字符设备文件 |
| s | 套接文件 |
| p | 管道文件 |
文件权限
剩下的 9 个字符分为 3 组:分别是 归属用户 、 归属群组 、 其它用户 对于该文件的权限。-表示没有相应权限。
| 符号 | 权限 |
|---|---|
| r | 可读 |
| w | 可写 |
| x | 可执行 |
文件归属
第 5、6 部分分别代表归属用户、归属群组,也就是 vagrant:vagrant。 其他部分不在讨论范围内。。
权限管理
重点来了,如果用户没有执行权限,那么他执行的时候会提示:
Permission denied
曾经的我多么幼稚,遇到这种情况就扔到 vFAT 分区执行 = =
对于文件夹,必须拥有它的可执行权限,才能够使用 cd 命令进入该文件夹,我刚刚作死把 /usr/bin 的执行权限去掉了,和 rm -rf /usr/bin 效果雷同。。
拥有可读权限,才能够使用 ls 命令查看该文件夹的文件列表。
有了权限管理,就可以限制哪些人、哪些组能够访问文件了,而 root 拥有最高权限,可以无视一切 = =
综上,应该对权限管理有个认识了,那么下面来说说怎么设置权限。
可以用 3 位 二进制 来表示权限,拥有什么权限那一位就为 1,或者用一位 八进制 来表示,如下
| 权限 | r | w | x |
|---|---|---|---|
| 二进制 | 100 | 010 | 001 |
| 八进制 | 4 | 2 | 1 |
比如,r-x权限,可以表示成二进制的101,也可以表示成八进制的5。
前面说到,一个文件的权限有 3 组,分别为:归属用户 、 归属组 、 其他用户 对应的权限,虽然用 9 位二进制来表示比较直观,但是用 3 位八进制来表示比较方便。
现在应该能明白常见的 755 权限了吧,其实就是:rwxr-xr-x权限。
设置权限
设置权限用 chmod 命令,比如,我想要一个文件只有我能访问,其他人都不能访问,那么我可以这样:
vagrant@lucid32:/tmp$ chmod 700 vagrant-shell
vagrant@lucid32:/tmp$ ls -l
total 4
-rwx------ 1 vagrant vagrant 95 2016-07-29 04:49 vagrant-shell
chmod还有几个常用的选项,如下
- a 所有用户 u 归属用户 g 归属群组 o 其它用户
- = 具有权限 + 增加权限 - 去除权限
- r 可读权限 w 可写权限 x 可执行权限
那么上述的情况也可以这样写:
chmod go-rwx vagrant-shell
以上表示归属组、其他用户去掉 rwx 权限。
chmod a+rwx vagrant-shell
以上表示所有人都有 rwx 权限。
SUID、SGID、Sticky bit
某些情况下,需要以可执行文件归属用户的身份执行该文件,可以为该文件设置 SUID。同样,设置SGID 能够以该文件归属群组的身份执行它。
例如:用户自行设定密码。出于安全方面的考虑,/etc/shadow只能由 root 用户直接修改。
-rw------- root root /etc/shadow
这个时候,可以为程序 /usr/bin/passwd 设置 SUID,当普通用户执行passwd 命令时,便能够以该程序归属用户 root 的身份修改 /etc/shadow 文件。而 passwd 程序自身带有身份验证机制,不能通过验证时拒绝执行,从而保证了安全。
ls -l /usr/bin/passwd
-r-s--x--x root root /usr/bin/passwd
我们发现,归属用户的可执行权限位使用s,表示SUID。同样,归属群组的可执行权限位使用s,表示SGID。任何用户或群组都拥有 “其它用户” 的权限,所以不需要以其它用户身份执行文件,其它用户的可执行权限位便不会出现s。该权限位可能出现的属性为t ,也就是粘着位Sticky bit。
ls -ld /tmp
drwxrwxrwt root root /tmp
粘着位表示任何用户都可能具有写权限,但只有该归属用户或 root 用户才能够删除。
SUID、SGID、Sticky bit也可以像权限一样,使用一个八进制数表示,如下:
- 4 SUID
- 2 SGID
- 1 Sticky bit
通过在 chmod 命令中使用 4 个八进制数的表达式,如 4755,用第一位表示SUID、SGID 或Sticky bit,便能够为文件设置这些特殊权限。示例:
chmod -R 4755 path
更改归属用户、归属组
更改归属用户、组可以用 chown 命令来实现,例如
vagrant@lucid32:/tmp$ sudo chown netcan:netcan vagrant-shell
vagrant@lucid32:/tmp$ ls -l
total 4
-rwxrwxrwx 1 netcan netcan 95 2016-07-29 04:49 vagrant-shell