众所周知,Linux 是一个多用户、多任务的操作系统。多用户多任务并不是大家同时挤到一起在一台机器的的键盘和显示器前来操作机器,多数用户可能是通过网络来进行远程访问的。比如宁波城市学院的Web服务器www.nbcc.cn,上面有FTP 用户、系统管理员、web 用户、常规普通用户等,在同一时刻,可能有的同学或者老师正在访问校园新闻网页;网站管理员有的可能在上传软件或者数据来管理站点,在与此同时,可能还会有系统管理员在维护系统;浏览主页的用的是nobody 用户,大家都用同一个,而上传软件或数据用的是FTP用户;管理员的对系统的维护可能用的是普通帐号或超级权限root帐号。所以很容易理解:Linux中的所谓多用户是分角色的,不同的用户,所需要完成的工作不一样,因此,其权限也不同。
同时,Linux中的用户也可以是分组的,因为我们可能需要让多个用户具有相同的权限,比如查看、修改某一文件或执行某个命令,这时我们就需要用到用户组。举例来说,我们为了让一些用户有权限查看而不能改动某一文档,比如是一个课程表,我们可以把这些用户都划到同一个组下,然后来修改这个文件的权限,让课程表文件从属于此组,并对用户组可读,这样此文件对用户组下面的每个用户都是可读的。
重要
¨ 用户(user)是能够获取系统资源的权限的集合。Linux中的用户可以分为三类:
1. 根用户(root):具有系统全部权限的用户;
2. 普通用户:其使用系统的权限受到一定限制;
3. 系统用户:也称虚拟用户,是保障系统运行的用户,一般不通过Shell登录系统。
¨ 用户组(group)就是具有相同特征的用户(user)的集合体。
简单了解了用户和用户组概念后,我们再回头来讨论一下Linux中的文件访问权限。我们首先要知道:在Linux中,一个文件总是与某个特定用户(文件拥有者,单个用户)和某个特定用户组(文件组,一批用户)关联在一起的。我们举个例子来说明这个事实,在这个例子中,我们用到一个新的命令’ls’(将在知识点1中详细讨论)来查看文件包括访问权限在内的属性,在命令行下输入’ls -l’,后跟三个要查看的文件名,命令输出如命令序列 3‑2所示:
命令序列 1
[dev01@localhost~]$ ls -l /bin/bash ~/.bashrc sample.c
-rwxr-xr-x. 1 root root 874184 12月 2 2011 /bin/bash
-rw-r--r-- 1 dev01 dev01 124 12月2 2011 /home/dev01/.bashrc
-rwxr-xr--. 1 dev01 dgroup 116 9月27 12:42 helloworld.sh
由什么所属,并且从属于哪个用户组
输出结果每行列出了一个文件的属性,每行都有7个字段,这7个字段都是有其含义的,我们举命令序列 3‑2中输出的最后一行为例:
图1文件属性字段举例
其中,字段2 我们将在任务6中接触到,而字段5是文件的大小,默认单位是字节(Byte),字段6将在知识点1中详细讨论。我们在这里要弄懂的是字段1、字段3和字段4。
在命令序列 3‑2中,我们可以看到 /home/dev01/.bashrc 文件由用户dev01所有,并且属于用户组dev01;类似的,/bin/bash文件由用户 root 所有,并且属于用户组root;helloworld.sh 由用户 dev01所有,并且属于用户组 dgroup。
而文件对于文件所有者、文件组成员和其他用户可以规定不同的访问权限,这些权限就是读(r)、写(w)、执行(x)和无权限(-)。
注意
¨ 这对读(r)、写(w)、执行(x)这三种权限于普通文件和目录的含义是不同的:
r w x
文件 读取文件 编辑文件 执行可执行文件
目录 列出目录内容 移动、建立、删除文件/目录进入目录
-rwxr-xr--. 1 dev01 dgroup 116 9月27 12:42 helloworld.sh
第一个-: 在这个例子中表示普通文件
拥有者,用户组,其他人
回到命令序列 3‑3文件属性字段第一个字段,这个字段中包括一个 11 个字符的字符串。(第 11 个字符与SELinux相关,我们此处不作讨论)。第一个字符描述了对象的类型(- 在这个例子中表示普通文件),剩下的 9 个字符每三个字符为一组。第一组表示文件拥有者的权限,所以dev01用户可以读、写、执行helloworld.sh,文件第二组表示文件组用户的权限,所以在dgroup用户组中的用户可以读、执行但不能写helloworld.sh。文件第二组表示其他用户的权限,所以其他用户只能读helloworld.sh。
图2 Linux中的文件访问权限举例
重要
¨ 在Linux中,文件总共有7种类型,下面就是这7种文件及其类型代码字符:
1. - 常规文件
2. d 目录文件
3. l 符号链接文件
4. c 字符特殊设备文件
5. b 模块特殊设备文件
6. p FIFO管道文件
7. s 套接字文件
到这里为止,我们就基本了解了文件访问权限这个概念了。
以下所ls命令
命令 用法:ls [选项]... [文件]...
列出 FILE 的信息(默认为当前目录)。
如果不指定-cftuvSUX 或--sort 选项,则根据字母大小排序。
¨ -a 不隐藏任何以. 开始的项目
¨ -A 列出除. 及.. 以外的任何项目
¨ -c 按ctime(文件属性或者内容最后更改的时间) 排序;同-lt 一起使用:根据ctime 排序并显示ctime;同-l一起使用:显示ctime 但根据名称排序。
¨ -d 当遇到目录时列出目录本身而非目录内的文件
¨ -F 加上文件类型的指示符号(*/=@| 其中一个)
¨ -h 与-l一起,以易于阅读的格式输出文件大小 (例如 1K、 234M、 2G等,默认情况下的单位是Byte)
¨ -i 显示每个文件的inode 号
¨ -l 使用较长格式列出信息
¨ -n 类似 -l,但列出UID 及GID 号
¨ -r 排序时保留顺序
¨ -R 递归显示子目录
¨ -S 根据文件大小排序
¨ -t 根据mtime(文件内容最后修改时间)排序
¨ -u 按照atime(文件最后访问时间)排序;同-lt 一起使用:按照访问时间排序并显示;同-l一起使用:显示访问时间并按文件名排序。
命令
用法:chmod [选项]... 模式[,模式]... 文件...
或:chmod [选项]... 八进制模式文件...
或:chmod [选项]... --reference=参考文件文件...
将每个文件的模式更改为指定值。
¨ --reference=参考文件 使用指定参考文件的模式,而非指定权限值
¨ -R, --recursive 以递归方式更改所有的文件及子目录
注意
修改或者设置文件访问权限可以用两种方法,一种是助记符的方法,助记符分为三个部分:
1. 对象助记符:可以是 a 代表所有用户,u代表文件拥有者,g代表文件组用户,o代表其他用户
2. 操作助记符:可以是+代表添加权限,-代表删除权限,=代表设置权限
3. 权限助记符:r代表可读,w代表可写,x代表可执行
¨ 如果你想对用户、组合或其他设置不同的权限,可以通过逗号分隔不同的表达,例如chmod u+r, g=rx,o-rwx hello.sh 表示为文件拥有者增加读权限,设置文件组用户权限为可读可执行,删除其他用户的所有权限
注意
另一种是使用八进制取代符号设置权限。
我们一般用 4位八进制数字来表示一个文件的访问权限。第 1 个数字的含义我们将在这里暂不讨论,也不会用到(将在下面文件特殊权限部分涉及到)。第 2 个数字表示了文件拥有者权限,第3 个数字是文件组用户权限,第 4 数字个是其他用户权限(参考表下面数字权限)。例如,在命令序列 3‑54中的hello.sh 例子中,创建的脚本文件的原有权限是 -rw-r--r--,相当于八进制 644。设置每个人的执行权限则将模式改为 755。
数字权限
符号 二进制 八进制
rwx 111 7
rw- 110 6
r-x 101 5
r-- 100 4
-wx 011 3
-w- 010 2
--x 001 1
--- 000 0
命令
用法:chown [选项]... [所有者][:[组]] 文件...
或:chown [选项]... --reference=参考文件文件...
更改每个文件的所有者和/或所属组。当使用 --referebce 参数时,将文件的所有者和所属组更改为与指定参考文件相同,注意,只有root用户才能变更文件的所有者,只有某用户组的成员用户才能将文件组设置为为该用户组。
¨ --reference=参考文件使用参考文件的相关属性,而非指定值
¨ -R, --recursive 递归处理所有的文件及子目录
小心 千万不能随便将文件特别是来历不明的文件的拥有者或者文件组设置为root,这将很容易给别有用心者可趁之机。
注意
注意,只有root用户才能变更文件的所有者