Linux 继承自 Unix,自设计之初就是多用户的系统。我们用实际的例子说明一下。
~/test$ ls -l
-rw-r–r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-03 20:08 b
显示的信息分别表示(按列): 文件属性、链接数(inode)、文件拥有者(owner)、文件所属用户组(group)、文件大小、最新修改日期、文件(目录)名。
1. 文件属性
文件或目录有 10 个基本属性,第 1 个表示类型,后 9 个分为三组,分别表示 owner、group、others 的执行属性。
文件类型: [d] 目录; [-] 文件; [l] 链接文件; …
执行属性: [r] 可读; [w] 可写; [x] 可执行。
-rw-r–r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
表示文件拥有者(owner)可读写(rw)、用户组(group)和其他用户(other)只读(r)。属性还可以用数字表示 r = 4, w = 2, x = 1,比如 rw-r–r– = 644。
~/test$ ls -l
-rw-r–r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-03 20:08 b
~/test$ chmod 664 ./a.txt
~/test$ ls -l
-rw-rw-r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-03 20:08 b
当然,我们也可以用更直观的参数。
~/test$ chmod a+w a.txt # 全部设置为可写
~/test$ ls -l
-rw-rw-rw- 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-03 20:08 b
~/test$ chmod ug=rw,o=r a.txt # 拥有人和组可读写, 其他只读
~/test$ ls -l
-rw-rw-r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-03 20:08 b
~/test$ chmod u=rw,g-w a.txt # 拥有人可读写, 组移除写
~/test$ ls -l
-rw-r–r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-03 20:08 b
参数说明:
(1) u = owner; g = group; o = other; a = u + g + o
(2) [=] 设置; [-] 移除; [+] 增加。
对于目录而言, r 表示读取目录结构的权限,w 表示可以在目录里创建、删除、移动文件和子目录,x 表示可以进入该目录。
~/test$ ls -l
-rw-r–r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-03 20:08 b
~/test$ chmod a-x ./b # 移除 x
~/test$ ls -l
-rw-r–r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drw-r–r– 2 yuhen yuhen 4096 2009-08-03 20:08 b
~/test$ cd b # 无法进入该目录
-bash: cd: b: Permission denied
~/test$ chmod a+x b # 恢复
~/test$ ls -l
-rw-r–r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-03 20:08 b
~/test$ cd b # 正确进入
chmod 支持 -R 参数对目录下所有文件和子目录进行递归修改。
除了上述的基本属性外,还可以用 chattr 和 lsattr 设置和显示隐藏属性。
#p#副标题#e#2. 特殊属性
特殊权限包括 SUID、SGID、SBit (Sticky Bit)。
设置 SUID 的文件可以让一般用户在执行操作时拥有该文件拥有人(owner)的权限。/usr/bin/passwd 就是一个例子,任何用户都可以通过该程序修改 /etc/passwd 中的密码。
~/test$ ls -l /etc/passwd # owner = root, group = root
-rw-r–r– 1 root root 1503 2009-07-19 19:41 /etc/passwd
~/test$ ls -l /usr/bin/passwd # 拥有 SUID 属性(s),因此执行该程序的时候拥有 root 权限。
-rwsr-xr-x 1 root root 37084 2009-04-04 13:49 /usr/bin/passwd
SGID 和 SUID 类似,表示执行的时候拥有文件或目录用户组的权限。而 SBit 只对目录有效,如过用户拥有该目录 wx 权限,则其创建的文件和子目录只有其他自己和 root 才能删除。
我们一样可以用 chmod 设置特殊权限。SUID = 4, SGID = 2, SBit = 1。
~/test$ chmod 4644 a.txt # SUID, rw, r, r
~/test$ ls -l # 注意 owner 上的大写字母 S
-rwSr–r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 3 yuhen yuhen 4096 2009-08-04 00:09 b
~/test$ chmod 2644 a.txt # GUID, rw, r, r
~/test$ ls -l # 注意 group 上的大写字母 S
-rw-r-Sr– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 3 yuhen yuhen 4096 2009-08-04 00:09 b
~/test$ chmod 1755 b # SBit, rwx, rx, rx
~/test$ ls -l # 注意 other 上的小写字母 t
-rw-r-Sr– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-t 3 yuhen yuhen 4096 2009-08-04 00:09 b
我们注意到特殊权限会写在 x 的位置,那么如果同时设置 x 和特殊权限会有什么不同呢?
~/test$ chmod 777 a.txt 设置属性 rwx, rwx, rwx
~/test$ ls -l
-rwxrwxrwx 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-t 3 yuhen yuhen 4096 2009-08-04 00:09 b
~/test$ chmod 6777 a.txt 设置属性 SUID, GUID, rwx, rwx, rwx
~/test$ ls -l # 大写字母 S 变成小写了。
-rwsrwsrwx 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-t 3 yuhen yuhen 4096 2009-08-04 00:09 b
目录如果没有 x 权限,SBit 就是大写字母 T,否则就是小写字母 t。
~/test$ ls -l
-rwsrwsrwx 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-t 3 yuhen yuhen 4096 2009-08-04 00:09 b
~/test$ chmod o-x b
~/test$ ls -l
-rwsrwsrwx 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-T 3 yuhen yuhen 4096 2009-08-04 00:09 b
总结成一句话就是: 有 x 用小写,否则用大写。
#p#副标题#e#3. 默认权限
我们可以用 umask 修改文件和目录的默认创建权限。
~/test$ umask
0022
~/test$ umask -S
u=rwx,g=rx,o=rx
数字表示要移除的属性,分别表示特殊属性、拥有人、用户组和其他用户。用 -S 参数可以显示默认属性。对于文件而言,默认是没有 “x” 属性的。
~/test$ umask -S
u=rwx,g=rx,o=rx
~/test$ touch b.txt
~/test$ mkdir x
~/test$ ls -l
-rw-r–r– 1 yuhen yuhen 0 2009-08-04 00:24 b.txt
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-04 00:24 x
umask 还可以修改默认权限。
~/test$ umask -S u=rwx,g=rwx,o=rx
u=rwx,g=rwx,o=rx
~/test$ umask
0002
~/test$ umask -S
u=rwx,g=rwx,o=rx
~/test$ umask 0027
~/test$ umask -S
u=rwx,g=rx,o=
4. 拥有人和用户组
通过 chown 和 chogrp 可以改变文件拥有人和用户组。
~/test$ ls -l
-rw-r–r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 3 yuhen yuhen 4096 2009-08-04 00:09 b
~/test$ sudo chown root a.txt # 修改拥有人
~/test$ ls -l
-rw-r–r– 1 root yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 3 yuhen yuhen 4096 2009-08-04 00:09 b
~/test$ sudo chgrp root a.txt # 修改用户组
~/test$ ls -l
-rw-r–r– 1 root root 0 2009-08-03 20:07 a.txt
drwxr-xr-x 3 yuhen yuhen 4096 2009-08-04 00:09 b
chown 和 chgrp 都支持 -R 参数进行子目录和文件递归修改。
~/test$ ls -Rl
.:
total 4
-rw-r–r– 1 root root 0 2009-08-03 20:07 a.txt
drwxr-xr-x 3 yuhen yuhen 4096 2009-08-04 00:09 b
./b:
total 4
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-04 00:09 1
-rw-r–r– 1 yuhen yuhen 0 2009-08-04 00:09 x.txt
./b/1:
total 0
~/test$ sudo chown -R root .
~/test$ sudo chgrp -R root .
~/test$ ls -Rl
.:
total 4
-rw-r–r– 1 root root 0 2009-08-03 20:07 a.txt
drwxr-xr-x 3 root root 4096 2009-08-04 00:09 b
./b:
total 4
drwxr-xr-x 2 root root 4096 2009-08-04 00:09 1
-rw-r–r– 1 root root 0 2009-08-04 00:09 x.txt
./b/1:
total 0
#p#副标题#e#5. 链接数
文件的链接数表示该文件硬链接数量,默认为 1。目录则表示其下子目录数量,默认为 2,分别是 “.” 和 “..”。
~/test$ ls -l
-rw-r–r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-03 20:08 b
~/test$ ln a.txt c.txt # 创建硬链接
~/test$ ls -l # 链接数发生变化
-rw-r–r– 2 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-03 20:08 b
-rw-r–r– 2 yuhen yuhen 0 2009-08-03 20:07 c.txt
~/test$ ln -s a.txt d.txt # 创建符号链接
~/test$ ls -l # 链接数未改变
-rw-r–r– 2 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-03 20:08 b
-rw-r–r– 2 yuhen yuhen 0 2009-08-03 20:07 c.txt
lrwxrwxrwx 1 yuhen yuhen 5 2009-08-04 00:07 d.txt -> a.txt
看看目录的链接数。
~/test$ ls -l # b 的链接数为 2
-rw-r–r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-03 20:08 b
~/test$ ls -al b # 仅包含 “.” 和 “..”
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-03 20:08 .
drwxr-xr-x 3 yuhen yuhen 4096 2009-08-04 00:09 ..
~/test$ mkdir ./b/1 # 在 b 下创建子目录
~/test$ ls -al b # 创建成功
drwxr-xr-x 3 yuhen yuhen 4096 2009-08-04 00:09 .
drwxr-xr-x 3 yuhen yuhen 4096 2009-08-04 00:09 ..
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-04 00:09 1
~/test$ ls -l # b 链接数发生变化
-rw-r–r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 3 yuhen yuhen 4096 2009-08-04 00:09 b
~/test$ touch ./b/x.txt # 在 b 下创建文件
~/test$ ls -al b # 创建文件成功
drwxr-xr-x 3 yuhen yuhen 4096 2009-08-04 00:09 .
drwxr-xr-x 3 yuhen yuhen 4096 2009-08-04 00:09 ..
drwxr-xr-x 2 yuhen yuhen 4096 2009-08-04 00:09 1
-rw-r–r– 1 yuhen yuhen 0 2009-08-04 00:09 x.txt
~/test$ ls -l # b 链接数未发生改变
-rw-r–r– 1 yuhen yuhen 0 2009-08-03 20:07 a.txt
drwxr-xr-x 3 yuhen yuhen 4096 2009-08-04 00:09 b