基本权限
Linux文件(包括目录)通过相对权限进行管理,这里的相对是指相对文件所有者,权限分为文件所有者权限(user),所有者同组用户权限(group)和其他用户权限(other),通过 ll
命令可以查看用户对文件的操作权限,权限分为r:读权限,w:写权限,x:执行权限。如:通过 ll
命令显示文件的权限为:-rwxr-xr
,为便于说明,图示如下。
- 第9位:文件类型,-表示普通文件,d表示目录,还有软连接等其他类型
- 第6-8位:文件所有者权限
- 第3-5位:文件所有者同组用户权限
- 第0-2位:其他用户权限
每个类型的用户权限又可以描述为一个3位的二进制,为便于更直观说明,借网图一张。
- r为第2位,十进制值为4
- w为第1位,十进制值为2
- x为第0位,十进制值为1
权限位和十进制对应如下:
- rwx = bin(111) = 4 + 2 + 1 = 7
- r-x = bin(101) = 4 + 0 + 1 = 5
- r-- = bin(100) = 4 + 0 + 0 = 4
rwx
对于文件和目录的权限意义:
权限 | 简写 | 对普通文件的权限 | 对目录的权限 |
---|---|---|---|
读取Read | r | 查看文件内容 | 列出目录内容(ls) |
写入Write | w | 编辑文件内容 | 添加、删除、移动(重命名)目录中的文件 |
执行eXecute | x | 作为程序运行文件 | 进入目录(cd) |
umask
umask(user file-creation mode mask)为用户创建文件时的掩码,是创建文件和目录时控制默认权限的基础,如果没有设置umask,文件默认权限为0666,目录默认权限为0777。
umask的作用是在创建文件和目录时,使用“默认权限-umask值”为创建的对象设置权限,大多数Linux中的默认umask为022,则创建的文件默认权限为0666 - 022 = 0644
,创建目录的默认权限为0777 - 022 = 0755
SUID、SGID和Sticky
Linux中还有三个和权限相关的属性
SUDI:Set User ID,控制位:4
SGID:Set Group ID,控制位:2
Sticky:控制位:1
SUID
该属性只对可执行文件(Shell除外)有效,执行具有SUID权限的程序时,程序将以文件所有者的权限执行,而不是启动程序的用户。比如,一个程序的所有者为root,普通用户执行该文件时,程序将以root的权限运行,程序可以访问只有root用户才有访问权限的文件,这为一些特殊场景的程序运行带来了方便,同时也存在一定的安全隐患。
在程序运行时,Linux中有两组用户权限,一组为启动程序的用户权限,另一组为执行程序的用户权限,分别说明如下:
- effective user id:进程访问文件权限相关的UID,简写为
euid
- effective group id:进程访问文件权限相关的GID,简写为
egid
- real user id:创建该进程的用户登录系统时的UID,简写为
ruid
- real group id : 创建该进程的用户登录系统时的GID,简写为
rgid
- saved set user id:拷贝自 euid
- saved set group id:拷贝自 egid
此属性的一个典型场景为用户修改密码使用的 /usr/bin/passwd
程序,用户修改密码时需要向 /etc/passwd
和 /etc/shadow
写入数据,而这两个文件是只有root采用写入权限的,通过给 /usr/bin/passwd
文件设置SUID,普通用户执行此文件修改密码时,进程的 euid
为root,将获得root用户权限,可以向以上配置文件写入新密码。
SUDI通过s表示,当程序设置了SUID后,文件所有者权限的 x
位将会变为 s
,如通过 ll
查看 /usr/bin/passwd
文件的权限为 -rwsr-xr-x。
SGID
对于可执行文件,该属性的作用和SUID类似,引发程序运行的权限为组用户权限,设置SGID后,组用户权限的 x
为会变为 s
。
对于目录,设置此属性后,会引发在此目录下创建的文件的所属组和此目录相同。
Sticky
此属性仅对目录有效,设置了Sticky属性的目录中的文件仅可被目录的所有者删除和改名,其他用户无此权限,可以防止文件误删,系统中的/tmp目录就利用了此属性。设置了Sticky后,目录的其他用户权限的 x
位将会变为 t
。通过 ll
命令查看 /tmp
目录的权的权限为 drwxrwxrwt。
由于SUID、SGID、Sticky都设置在 x
位上,当对应 x
位未设置时,显示位大写的 S
,S
,T
。
chown & chmod
chown
chown
为 change owner 的缩写,用于设置文件的所有者和所属组,只有root用户和文件的所有者才能执行此命令,命令格式如下:
chown [-cfhvR] [--help] [--version] user[:group] file...
参数说明如下:
- user : 新的文件所有者名称或用户ID
- group : 新的文件所有组的名称或组ID
- -c : 显示更改的部分的信息
- -f : 忽略错误信息
- -h :修复符号链接
- -v : 显示详细的处理信息
- -R : 处理指定目录以及其子目录下的所有文件
- --help : 显示辅助说明
- --version : 显示版本
修改文件的所有者和所属组命令示例如下:
chown user1:group1 file1.txt
chmod
chmod
为 change mode 的缩写,用于设置文件的权限,只有root用户和文件所有者才能执行此命令,命令格式如下:
chmod [-cfvR] [--help] [--version] mode file...
参数说明如下:
- -c : 若该文件权限确实已经更改,才显示其更改动作
- -f : 若该文件权限无法被更改也不要显示错误讯息
- -v : 显示权限变更的详细资料
- -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
- --help : 显示辅助说明
- --version : 显示版本
mode 是权限设定参数,Linux提供了两种设置方法:
- 用户对象 + 操作模式 + 操作权限组合模式
- 8进制直接设置模式
用户对象 + 操作模式 + 操作权限位模式
此模式下,权限设置参数格式如下
[ugoa][[+-=][rwxXst]...][,...]
[ugoa]表示要操作的用户对象
u
表示文件所有者g
表示所有者同组用户o
表示其他用户a
表示所有用户
[+-=]表示操作的方式
+
表示增加权限-
表示取消权限=
表示唯一设定权限
[rwxXst]表示要操作权限位
r
表示读取权限w
表示写入权限x
表示执行权限X
只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行s
设置SUID或SGIDt
设置Sticky位
命令示例:
- 为所有用户添加对file1.txt文件的读权限
chmod ugo+r file1.txt
chmod a+r file1.txt
- 将当前目录下的所有文件与子目录设置为任何人可读取
chmod -R a+r *
8进制设置模式
使用8进制模式时,用一位8进制的0-7表示一组用户的权限,如 rwx=bin(111) = 4+2+1 = 7
。
rwxr-x--x = *754,表示:
- 文件所有者拥有rwx=7
- 同组用户拥有r-x=5
- 其他用户拥有x--=1
此模式不能使用 + -
为用户增量设置权限,而是需要一次性全部设置。
命令示例:
- 为把file1.txt文件的权限设置为rwxr-x--x
chmod 751 file1.txt
另外SUID(4)、SGID(2)、Sticky(1)可以用第4位8进制表示(第4位未设置时可省略),如为rwxr-xr--权限的文件添加SUDI权限,则把第4为设置为4,命令为:
chmod 4754 file1.txt
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。