Linux 系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。
Linux的文件权限有以下设定:
- Linux 下文件的权限类型一般包括读、写、执行,对应字母为
r
、w
、x
- Linux 下权限的属组有:拥有者 、群组 、其它组,总共三种
如果我们要表示一个文件的所有权限详情,有两种方式:
- 十位二进制表示法,(三个属组每个使用二进制位,再加一个最高位共十位),可简化为三位八进制形式
- 十二位二进制表示法(十二个二进制位),可简化为四位八进制形式
1. 十位权限
1-rw------- (600) 只有拥有者有读写权限
2-rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限
3-rwx------ (700) 只有拥有者有读、写、执行权限
4-rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限
5-rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限
6-rw-rw-rw- (666) 所有用户都有文件读、写权限
7-rwxrwxrwx (777) 所有用户都有读、写、执行权限
8
9# 其中:- 代表无权限,r 代表读权限,w 代表写权限,x 代表执行权限
1.1 第一位:表示文件类型
1d 代表的是目录(directroy)
2- 代表的是文件(regular file)
3s 代表的是套字文件(socket)
4p 代表的管道文件(pipe)或命名管道文件(named pipe)
5l 代表的是符号链接文件(symbolic link)
6b 代表的是该文件是面向块的设备文件(block-oriented device file)
7c 代表的是该文件是面向字符的设备文件(charcter-oriented device file)
1.2 后九位:不同属组的三种操作权限
Linux 权限总共有三个属组,这里给每个属组使用三个位置来定义三种操作权限,后九位每个位置的意义(代表某个属组的某个权限)都是固定的,可以用三位二进制数表示为:
1r-- = 100
2-w- = 010
3--x = 001
4--- = 000
转换成八进制数,r=4
, w=2
, x=1
, -=0
(数字设置权限:4
代表读,2
代表写,1
代表执行),所以文件的权限可以表示为三位八进制数。
1.3 chmod 修改权限
可以使用八进制数字或者字母形式修改:
1# 使所有用户获取 a.sh 全权限
2chmod ugo+r a.sh
3chmod a+r a.sh
4
5# u g o 代表不同的属组
6# a 可以指代全部属组
7# +- 用于增加删除 rwx 权限
8
9# 复杂案例
10chmod a+r,ug+w,o-w a.conf b.xml
2. 十二位权限(Linux附加权限)
Linux 除了设置正常的读写操作权限外,还有一类 Linxu 附加权限,包括:
- SET位权限
suid
,sgid
- 粘滞位权限
sticky
2.1 SET位权限
suid
/sgid
是为了使“没有取得特权用户要完成一项必须要有特权才可以执行的任务”而产生的。 一般用于给可执行的程序或脚本文件进行设置。
其中 suid
表示对属主用户增加SET位权限,sgid
表示对属组内用户增加SET位权限。执行文件被设置了 suid
、sgid
权限后,任何用户执行该文件时,将获得该文件属主、属组账号对应的身份。
不恰当地使用这些位可能使系统的安全遭到破坏。所以应该尽量避免使用SET位权限程序。
suid
(set User ID,set UID):进程执行一个文件时通常保持进程拥有者的UID。如果设置了suid
位,进程就获得了该文件拥有者的UIDsgid
(set Group ID,set GID):进程就获得了进程组的UID
2.2 SET位权限表示形式(10位权限)
如果一个文件被设置了 suid
或 sgid
位,会分别表现在所有者或同组用户的权限的可执行位上:
- 如果文件设置了
suid
,还设置了x
,则相应的执行位表示为s
(小写) - 如果文件设置了
suid
,但没有设置x
位,它将表示为S
(大写)
1-rwsr-xr-x 表示设置了suid,且拥有者有可执行权限
2-rwSr--r-- 表示suid被设置,但拥有者没有可执行权限
3-rwxr-sr-x 表示sgid被设置,且群组用户有可执行权限
4-rw-r-Sr-- 表示sgid被设置,但群组用户没有可执行权限
2.3 SET位权限修改
SET位权限可以通过chmod
命令设置,给文件加suid
和sgid
的命令如下(类似于上面chmod赋予一般权限的命令):
1chmod u+s filename # 设置suid位
2chmod u-s filename # 去掉suid设置
3chmod g+s filename # 设置sgid位
4chmod g-s filename # 去掉sgid设置
2.4 粘滞位权限
粘滞位权限即sticky
。一般用于为目录设置特殊的附加权限,当目录被设置了粘滞位权限后,即便用户对该目录有写的权限,也不能删除该目录中其他用户的文件数据。
设置了粘滞位权限的目录,使用ls
查看其属性时,其他用户权限处的x
将变为t
。
2.5 粘滞位权限表示形式(10位权限)
一个文件或目录被设置了粘滞位权限,会表现在其他组用户的权限的可执行位上:
- 如果文件设置了
sticky
,还设置了x
,其他组用户的权限的可执行位为t
(小写) - 如果文件设置了
sticky
,没有设置x
位,它将表示为T
(大写)
2.6 粘滞位权限修改
使用chmod
命令设置目录权限时,+t
、-t
权限模式可分别用于添加、移除粘滞位权限。
2.7 十二位的权限表示方法
附加权限除了用十位权限形式表示外,还可以用用十二位字符表示:
111 10 9 8 7 6 5 4 3 2 1 0
2S G T r w x r w x r w x
在这十二位的每一位上都置值。如果有相应的权限则为1
, 没有此权限则为0
:
1-rw-r-sr-- 的值为: 0 1 0 1 1 0 1 0 0 1 0 0
2-rwsr-xr-x 的值为: 1 0 0 1 1 1 1 0 1 1 0 1
3-rwsr-sr-x 的值为: 1 1 0 1 1 1 1 0 1 1 0 1
4-rwsr-sr-t 的值为: 1 1 1 1 1 1 1 0 1 1 0 1
如果将则前三位SGT也转换成一个二进制数,则:
- suid 的八进制数字是4
- sgid 的代表数字是 2
- sticky 位代表数字是1
十二位权限便可以转化为4个八进制数。
假设 netlogin 是 root 用户创建的一个上网认证程序,如果其他用户要上网也要用到这个程序,
那就需要 root 用户运行 chmod 755 netlogin 命令,使其他用户也能运行 netlogin。但假如 netlogin 执行时需要访问一些只有 root 用户才有权访问的文件,
那么其他用户执行 netlogin 时可能因为权限不够还是不能上网。这种情况下,就可以用 chmod 4755 netlogin,
设置其他用户在执行 netlogin 也有 root 用户的权限,从而顺利上网。
参考链接 - Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)
版权声明:本文遵循 CC BY-SA 4.0 版权协议,转载请附上原文出处链接和本声明。
Copyright statement: This article follows the CC BY-SA 4.0 copyright agreement. For reprinting, please attach the original source link and this statement.