Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。
文件所有者一般是创建者,但是也可以改变文件的所有者。
文件用户组是文件的属组。组是一群用户组成的集合。
其他人是不包括前两种和root用户的人。
查看文件和目录的属性:ls -l
drwxr-xr-x. 2 zyan root 4096 Apr 27 17:36 uniref90
d
:第一位代表的是文件的类型,类型可以是下面几个中的一个:- d代表的是目录(directroy)
- -代表的是文件(regular file)
- s代表的是套字文件(socket)
- p代表的管道文件(pipe)或命名管道文件(named pipe)
- l代表的是符号链接文件(symbolic link)
- b代表的是该文件是面向块的设备文件(block-oriented device file)
- c代表的是该文件是面向字符的设备文件(charcter-oriented device file)
rwxr-xr-x
:接下来的9个字符表示,三种用户的读、写、运行的权限。如第一组rwxr-xr-x,表示文件所有者(u)有r (读)、w(写)、x(运行)的权限;属组(g)有读权限 、没有写权限,有运行权限;其他人(o)有读权限 、没有写权限,有运行权限。
2
:第二个数字表示文件的连接 和书。zyan
:第三个表示文件的属主root
:第四个表示文件的属组- 最后分别是文件大小、最后修改日期和时间、文件的名称。
chown
参数
chown (change owner) 用于改变文件的所有权,语法如下:
chown [-cfhvR] [--help] [--version] user[:group] file...
- user : 新的文件拥有者的使用者 ID
- group : 新的文件拥有者的使用者组(group)
- -c : 显示更改的部分的信息
- -f : 忽略错误信息
- -h :修复符号链接
- -v : 显示详细的处理信息
- -R : 处理指定目录以及其子目录下的所有文件
- –help : 显示辅助说明
- –version : 显示版本
示例
# 把文件days拥有着更改为pan,属组更改为root。
sudo chown pan:root days
# 如果只要更改文件的拥有者,可以省略:GROUP参数。该命令把拥有者更改为guest。
sudo chown guest days
# 同样也可以省略 OWNER,该命令将文件days的属组更改为 pan。
sudo chown :pan days
# 如果想要把文件夹下的所有文件都更改用户或者组别,需要加上-R参数:
sudo chown -R pan HOME/
# 将当前目录下的所有文件与子目录的拥有者皆设为 runoob,群体的使用者 runoobgroup:
chown -R runoob:runoobgroup *
chgrp
参数
chgrp (change group) 用于变更文件或目录的所属群组。
chgrp [-cfhRv][--help][--version][所属群组][文件或目录...]
chgrp [-cfhRv][--help][--reference=<参考文件或目录>][--version][文件或目录...]
- -f 或 --quiet 或 --silent:不显示错误信息。
- -h 或 --no-dereference:只对符号连接的文件作修改,而不改动其他任何相关文件。
- -R 或 --recursive:递归处理,将指定目录下的所有文件及子目录一并处理。
- -v 或 --verbose:显示指令执行过程。
- -c 或 --changes:效果类似"-v"参数,但仅回报更改的部分。
- –help:帮助。
- –reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同。
- –version:显示版本信息。
示例
# 改变文件的群组属性
# 将 log2012.log 文件由 root 群组改为 bin 群组。
chgrp -v bin log2012.log
[root@localhost test]# ll
---xrw-r-- 1 root root 302108 11-13 06:03 log2012.log
[root@localhost test]# chgrp -v bin log2012.log
[root@localhost test]# ll
---xrw-r-- 1 root bin 302108 11-13 06:03 log2012.log
# 根据指定文件改变文件的群组属性
# 改变文件 log2013.log 的群组属性,使 log2013.log 的群组属性和参考文件 log2012.log 的群组属性相同。
chgrp --reference=log2012.log log2013.log
[root@localhost test]# ll
---xrw-r-- 1 root bin 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log
[root@localhost test]# chgrp --reference=log2012.log log2013.log
[root@localhost test]# ll
---xrw-r-- 1 root bin 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log
chmod
参数
chmod (change mode) 命令是控制用户对文件的权限的命令。这个命令使用“用户组+/- 权限”的表达方式来增加或者删除权限。
chmod [-cfvR] [--help] [--version] mode file...
-
mode : 权限设定字串,格式如下 :
[ugoa...][[+-=][rwxX]...][,...]
- u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
- + 表示增加权限、- 表示取消权限、= 表示唯一设定权限,即将用户类型的所有权限重新设置。
- r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行。
-
-c : 若该文件权限确实已经更改,才显示其更改动作
-
-f : 若该文件权限无法被更改也不要显示错误讯息
-
-v : 显示权限变更的详细资料
-
-R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
-
–help : 显示辅助说明
-
–version : 显示版本
示例
# 以下两行代码效果相同,将文件 file1.txt 设为所有人皆可读取
chmod ugo+r file1.txt
chmod a+r file1.txt
# 将文件 file1.txt 与 file2.txt 设为该文件拥有者,与其所属同一个群体者可写入,
# 但其他以外的人则不可写入
chmod ug+w,o-w file1.txt file2.txt
# 为 ex1.py 文件拥有者增加可执行权限:
chmod u+x ex1.py
# 将目前目录下的所有文件与子目录皆设为任何人可读取
chmod -R a+r *
八进制
chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。
# | 权限 | rwx | 二进制 |
---|---|---|---|
7 | 读 + 写 + 执行 | rwx | 111 |
6 | 读 + 写 | rw- | 110 |
5 | 读 + 执行 | r-x | 101 |
4 | 只读 | r– | 100 |
3 | 写 + 执行 | -wx | 011 |
2 | 只写 | -w- | 010 |
1 | 只执行 | –x | 001 |
0 | 无 | — | 000 |
例如765 :
- 所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx,也就是 4+2+1,7。
- 用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw-,也就是 4+2+0,6。
- 其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x,也就是 4+0+1,5。
chmod可以用数字来表示权限,语法为 chmod abc file
# 把文件的权限修改为 rwxr–r–
chmod 744 Desktop
# 以下两行代码效果相同
chmod 777 file
chmod a=rwx file
# 以下两行代码效果相同
chmod 771 file
chmod ug=rwx,o=x file
附加权限
linux除了设置正常的读写操作权限外,还有关于一类设置也是涉及到权限,叫做Linxu附加权限。包括 SET位权限(suid,sgid)和粘滞位权限(sticky)。
suid (set User ID, set UID) 的意思是进程执行一个文件时通常保持进程拥有者的UID。然而,如果设置了可执行文件的suid位,进程就获得了该文件拥有者的UID。
sgid (set Group ID, set GID) 意思也是一样,只是把上面的进程拥有者改成了文件拥有组(group)
-rwsr-xr-x #表示设置了suid,且拥有者有可执行权限
-rwSr--r-- #表示suid被设置,但拥有者没有可执行权限
-rwxr-sr-x #表示sgid被设置,且群组用户有可执行权限
-rw-r-Sr-- #表示sgid被设置,但群组用户没有可执行权限
SET位权限可以通过chmod命令设置,给文件加suid和sgid的命令如下(类似于上面chmod赋予一般权限的命令):
chmod u+s filename #设置suid位
chmod u-s filename #去掉suid设置
chmod g+s filename #设置sgid位
chmod g-s filename #去掉sgid设置
粘滞位权限即sticky。一般用于为目录设置特殊的附加权限,当目录被设置了粘滞位权限后,即便用户对该目录有写的权限,也不能删除该目录中其他用户的文件数据。设置了粘滞位权限的目录,是用 ls
查看其属性时,其他用户权限处的x将变为t。 使用 chmod
命令设置目录权限时,+t、-t权限模式可分别用于添加、移除粘滞位权限。
-rwsr-xr-t #表示设置了粘滞位且其他用户组有可执行权限
-rwSr--r-T #表示设置了粘滞位但其他用户组没有可执行权限
在八进制的基础上,可以进一步使用4位数字赋值正常权限和附加权限:chmod sabc file
。因为SUID对应八进制数字是4,SGID对于八进制数字是2,则“4755”表示设置SUID权限,“6755”表示同时设置SUID、SGID权限。
-rw-r-Sr-- = 0 1 0 1 1 0 1 0 0 1 0 0 = 2644
-rwsr-xr-x = 1 0 0 1 1 1 1 0 1 1 0 1 = 4755
-rwsr-sr-x = 1 1 0 1 1 1 1 0 1 1 0 1 = 6755
-rwsr-sr-t = 1 1 1 1 1 1 1 0 1 1 0 1 = 7755
如netlogin,假如netlogin执行时需要访问一些只有root用户才有权访问的文件,那么 chmod 755 netlogin
会使得其他用户执行netlogin时因为权限不够还是不能上网。这种情况下,就可以用 chmod 4755 netlogin
设置其他用户在执行netlogin也有root用户的权限,从而顺利上网。
常用命令
命令 | 说明 |
---|---|
chmod a+r file | 给file的所有用户增加读权限 |
chmod a-x file | 删除file的所有用户的执行权限 |
chmod a+rw file | 给file的所有用户增加读写权限 |
chmod +rwx file | 给file的所有用户增加读写执行权限 |
chmod u=rw,go= file | 对file的所有者设置读写权限,清空该用户组和其他用户对file的所有权限(空格代表无权限) |
chmod -R u+r,go-r docs | 对目录docs和其子目录层次结构中的所有文件给用户增加读权限,而对用户组和其他用户删除读权限 |
chmod 664 file | 对file的所有者和用户组设置读写权限, 为其其他用户设置读权限 |
chmod 0755 file | 相当于u=rwx (4+2+1),go=rx (4+1 & 4+1)。0 没有特殊模式 |
chmod 4755 file | 4设置了设置用户ID位,剩下的相当于 u=rwx (4+2+1),go=rx (4+1 & 4+1) |
find path/ -type d -exec chmod a-x {}\; | 删除可执行权限对path/以及其所有的目录(不包括文件)的所有用户,使用’-type f’匹配文件 |
find path/ -type d -exec chmod a+x {}\; | 允许所有用户浏览或通过目录path/ |
参考
1、Linux文件和目录权限管理:chown和chmod
2、chgrp命令用法举例
3、Linux chmod命令修改文件与文件夹权限方法
4、Linux权限详解(chmod、600、644、700、711、755、777、4755、6755、7755)
5、RUNOOB.COM: chown, chgrp, chmod.