很难想像没有权限的世界会变成什么样,随便某人进来增删改查,也真的很可怕的
针对用户的权限设置
Linux为3种人准备了权限——文件所有者(属主)、文件属组用户和其他人
文件所有者通常是文件的创建者,但这也不一定,中途可以改变一个文件的属主用户,这必须由root用户来实施。也可以将一个文件交给一个用户组。
需要设置那些权限
文件和目录享有3种权限:读取(R)、写入(W)和执行(X)
要让一个文件可执行,必须设置其执行权限,可执行文件有两类,一类是直接由CPU执行的二进制代码,一类是Shell脚本程序
查看文件和目录的属性
使用带选项的-l的ls命令可以查看一个文件的属性,包括权限等,首先来个示例
$ ls -l /bin/login -rwxr-xr-x 1 root root 28096 2016-11-20 10:20 /bin/login
这条命令列出了/bin/login文件主要信息
第1段的第1个字符表示文件类型,在上例中是“-”,表示这是一个普通文件
接下来的rwxr-xr-x就是3组权限位,这9个字符应该被这样断句:rwx、r-x、r-x,表示属主、属组和其他人所拥有的权限。r表示可读取,w表示可写,x表示可执行,如果某个权限被经用,那么就用一个短划线“-”代替。在这个例子中,属主拥有读、写和执行权限,属组和其他人拥有读和执行权限。
第3个和第4个字段分别表示文件的属主和属组、在这个例子中,login文件的属主是root,而属组是root组
紧跟着3组权限位的数字表示该文件的链接数目,这里是1,表示该文件只有一个硬链接
最后的4个字段分别表示文件大小(38096字节)、最后修改的是日期和时间,以及这个文件的完整路径
要查看一个目录的属性,应该使用-ld选项
$ ls -ld /etc/ drwxr-xr-x 135 root root 12288 2016-11-20 10:20 /etc
最后,不带文件名作为参数的ls -l命令,列出当前目录下所有文件(不包括隐藏文件)的属性
改变文件所有权:chown和chgrp
chown命令用于改变文件的所有权,基本语法如下:
chown [ OPTION ] ... [ OWNER ] [ : [ GROUP] ] FILE ...
这条命令将文件FILE的属主改变为OWNER,属组改变为GROUP,下面这条命令,将文件days属性更改为lewis,属组为root组
$ ls -l days ## 查看当前days的所有权 -rw-r--r-- 1 guest guest 57 2016-11-20 10:20 days $ ls -chown lewis: root days ## 修改days的所有权 $ ls -l days ## 查看修改后的days的所有权 -rw-r--r-- 1 lewis root 57 2016-11-20 10:21 days
如果只需要更改文件的属主,那么可以省略参数“:GROUP”,下面这条命令把days文件的属主更改为guest用户,而保留其属组设置
$ sudo chown guest days
相应的,可以省略参数OWNER,而只改变文件的属组,注意,不能省略组名GROUP前面的这个“:”。下面这条命令把days文件夹的属组更改为nogroup组,而保留其属主设置
$ sudo chown :nogroup days
chown命令提供了-R选项,用于改变一个目录及其下所有文件(和子目录)的所有权设置,下面这条命令将 iso/ 和其下所有的文件交给用户lewis
$ sudo chown -R lewis iso/
查看这个目录的属性可以看到,所有文件和子目录的属主已经变成lewis用户了,如果想属主和属组同时更改,就用-R lewis:lewis命令
Linux单独提供了另一个命令chgrp用于设置文件的属组,下面这条命令将文件days的属组设置为nogroup组
$ sudo chgrp nogroup days
和chown一样,chgrp也可以使用-R选项递归一个目录实施这只,下面这条命令将iso/ 和其下所有文件(和子目录)的属组设置为root组
$ sudo chgrp -R root iso/
chgrp命令实际上只是实现了chown的一部分功能,但这个命令至少在名字上更直观告诉人们它要干什么,实际使用中,也仅仅只是习惯问题
改变文件权限:chmod
chmod用于改变一个文件权限,这个命令使用“用户组+/-权限”的表达方式来增加删除响应的权限,具体来说,用户组包括了文件属主(u)、文件属组(g)、其他人(o)和所有人(a),而权限则包括了读取(r)、写入(w)和执行(x),例如,下面这条命令增加了属主对文件days的执行权限
$ chomd u+x days
chomd可以用 a 同时指定所有的3种人,下面这条命令删除所有人(属主、属组和其他人)对days的执行权限
$ chomd a-x days
还可以通过“用户组=权限”的规则直接设置文件权限,同样应用于文件 days,下面这条命令赋予属主和属组的读取/写入权限,而仅赋予其他用户读取权限
$ chomd ug=rw,o=r days
最后一条常用规则是“用户组 1=用户组 2”,用于将用户组1的权限和用户组2的权限设置为完全相同,应用于文件days中,下面这条命令讲其他人的权限设置为和属主的权限一样
$ chomd o=u days
提示:牢记只有文件的属主和root用户才有权修改文件的权限
文件权限的八进制表示
chomd的助记符尽管意义明确,但有些时候显得太罗嗦了,系统管理员更喜欢用chomd的八进制语法来修改文件权限——这样就可以不用麻烦左右手的小指了,为此管理员至少应该熟练掌握8以内的加法运算。
首先介绍一下八进制记法的来历,每一组权限 rwx 在计算机中实际上占用了3位,每一位都有两种情况,例如对于写入位,只有“设置(r)”和没有设置(-)两种情况。这样计算机就可以使用二进制 0 和 1 来表示每一个权限位,其中 0 表示没有设置,1表示设置,例如 rwx 就被表示为111,“-w-”表示为 010 等。
由于 3 位的二进制数对应 1 位八进制数,因此可以进一步用一个八进制数字表示一组权限,下面表格显示了对应的关系
八进制 | 二进制 | 权限 | 八进制 | 二进制 | 权限 | |
0 | 000 | --- | 5 | 101 | r-w | |
1 | 001 | --x | 6 | 110 | rw- | |
2 | 010 | -w- | 7 | 111 | rwx | |
3 | 011 | -wx | ||||
4 | 100 | r-- |
不必记住上面这些数字的排列组合,在实际中,只要记住 1代表x、2代表w、4代表r、、然后简单的做加法就可以了,距离来说:rwx=4+2+1=7,r-w=4+0+1=5。
这样依赖,完整的9位权限就可以用3个八进制数来表示了,例如“rwxr-x--r”就对应于“751”,下面这条命令将文件prog的所有权限赋予属主,而属组用户和其他人仅有执行权限
$ chomd 711 prog $ ls -l prog -rwx--x--x 1 lewis nogroup 57 2016-11-20 17:00 prog