权限简介
- Linux系统上对文件的权限有着严格的控制,如果对某个文件执行某种操作,必须具有相对应的权限方可成功
- Linux下文件的权限类型一般包括读、写、可执行。对应的字母为r、w、x.
- Linux下权限的粒度有 拥有者u 、群组g 、其它组o 三种。每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。
- Linux通常使用chmod命令对文件的权限进行设置和更改
一、快速入门
1.更改文件权限(chmod)
一般使用格式
chmod [参数] <mode> <file...>
参数说明
[参数]
-c, --changes like verbose but report only when a change is made (若该档案权限确实已经更改,才显示其更改动作)
-f, --silent, --quiet suppress most error messages (若该档案权限无法被更改也不要显示错误讯息)
-v, --verbose output a diagnostic for every file processed(显示权限变更的详细资料)
--no-preserve-root do not treat '/' specially (the default)
--preserve-root fail to operate recursively on '/'
--reference=RFILE use RFILE's mode instead of MODE values
-R, --recursive change files and directories recursively (以递归的方式对目前目录下的所有档案与子目录进行相同的权限变更)
--help 显示此帮助信息
--version 显示版本信息
[mode]
权限设定字串,详细格式如下 :
[ugoa...][[+-=][rwxX]...][,...],
其中
[ugoa...]
u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示所有(包含上面三者)。
[+-=]
+ 表示增加权限,- 表示取消权限,= 表示唯一设定权限。
[rwxX]
r 表示可读取(read),w 表示可写入(write),x 表示可执行(execute),X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
[file...]
文件列表(单个或者多个文件、文件夹)
范例:
- 设置所有用户可读取文件a.conf
chmod a+x a.cnof
- 设置c.sh只有拥有者可以读写及可执行
chmod u+rwx c.sh
- 设置当前目录下的所有档案与子目录皆设为任何人可读写
chmod -R a+rw *
数字权限使用格式
在这种使用方式中,首先我们需要了解数字如何表示权限。 首先,我们规定 数字 4 、2 和 1表示读、写、执行权限(具体原因可见下节权限详解内容),即 r=4,w=2,x=1 。此时其他的权限组合也可以用其他的八进制数字表示出来,
如:
rwx = 4 + 2 + 1 = 7
rw = 4 + 2 = 6
rx = 4 +1 = 5
即
若要同时设置 rwx (可读写运行) 权限则将该权限位 设置 为 4 + 2 + 1 = 7
若要同时设置 rw- (可读写不可运行)权限则将该权限位 设置 为 4 + 2 = 6
若要同时设置 r-x (可读可运行不可写)权限则将该权限位 设置 为 4 +1 = 5
上面我们提到,每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。即我们可以用用三个8进制数字分别表示 拥有者 、群组 、其它组( u、 g 、o)的权限详情,并用chmod直接加三个8进制数字的方式直接改变文件权限。语法格式为 :
chmod <abc> file..
其中 a b c 各表示一个数字, 分别标识user、group other的权限
相当于简化版的
chmod u=xx g=xx o=xx file
而次数的xx将用8进制的数字来表示读、写、可执行的权限
范例:
- 设置所有人可以读写及可执行
chmod 777 file (等价于 chmod u=rwx,g=rwx,o=rwx file )
- 设置拥有者可读写,其他人不可执行读写
chmod 600 file (等价于 chmod u=rw,g=0,o=0 file 或者 chmod u=rw go-rwx file)
2.更改文件拥有者(chown)
linux/Unix 是多人多工作业系统,每个的文件都有拥有者(所有者),如果我们想变更文件的拥有者(利用 chown 将文件拥有者加以改变),一般只有系统管理员(root)拥有此操作权限,而普通用户则没有权限将自己或者别人的文件的拥有者设置为别人。
语法格式:
chown [参数] user[:group] file...
使用权限 root
说明
[参数] 同上面的chmod
[user] 新的文件拥有者的使用者
[group] 新的文件拥有者的使用者群体
范例:
- 设置文件d.key的拥有者为users组下的tom
chown tom:users d.key
- 设置当前目录下与子目录下的所有文件的拥有者为users群体的james
chown -R james:users *
二、Linux权限详解
十位权限表示
- 后九位解析:
Linux权限总共有三个属组,这里我们给每个属组使用三个位置来定义三种操作(读、写、执行)权限,合起来则是权限的后九位。-rw------- (600) 只有拥有者有读写权限。 -rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。 -rwx------ (700) 只有拥有者有读、写、执行权限。 -rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。 -rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。 -rw-rw-rw- (666) 所有用户都有文件读、写权限。 -rwxrwxrwx (777) 所有用户都有读、写、执行权限。
- 第一位解析
代表的是文件的类型,类型可以是下面几个中的一个:d代表的是目录(directroy) -代表的是文件(regular file) s代表的是套字文件(socket) p代表的管道文件(pipe)或命名管道文件(named pipe) l代表的是符号链接文件(symbolic link) b代表的是该文件是面向块的设备文件(block-oriented device file) c代表的是该文件是面向字符的设备文件(charcter-oriented device file)
十二位权限(Linux附加权限)
linux除了设置正常的读写操作权限外,还有关于一类设置也是涉及到权限,叫做Linxu附加权限。包括 SET位权限(suid,sgid)和粘滞位权限(sticky)。
- SET位权限:
- suid(set User ID,set UID)意思是进程执行一个文件时通常保持进程拥有者的UID
- sgid(set Group ID,set GID)意思是进程执行一个文件时通常保持进程拥有者的进程组的GID
设置方式: chmod u+s filename 设置suid位 chmod u-s filename 去掉suid设置 chmod g+s filename 设置sgid位 chmod g-s filename 去掉sgid设置 权限说明: -rwsr-xr-x 表示设置了suid,且拥有者有可执行权限 -rwSr--r-- 表示suid被设置,但拥有者没有可执行权限 -rwxr-sr-x 表示sgid被设置,且群组用户有可执行权限 -rw-r-Sr-- 表示sgid被设置,但群组用户没有可执行权限
- 粘滞位权限(sticky)
一个文件或目录被设置了粘滞位权限,会表现在其他组用户的权限的可执行位上设置方式:chmod + t <文件列表..> -rwsr-xr-t 表示设置了粘滞位且其他用户组有可执行权限 -rwSr--r-T 表示设置了粘滞位但其他用户组没有可执行权限
表示方法
用十二位字符表示如下图
如果将则前三位SGT也转换成一个二进制数,则
- suid 数字是4-(100)
- sgid 数字是 2-(010)
- sticky 数字是1-(001)
即为附加权限的八进制表示
chmod <sabc> file
如下表示
-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
也就有了以下命令:
chmod 4755 a.txt
为什么要设置4755 而不是 755?
假设netlogin是root用户创建的一个上网认证程序,如果其他用户要上网也要用到这个程序,那就需要root用户运行chmod 755 netlogin命令使其他用户也能运行netlogin。但假如netlogin执行时需要访问一些只有root用户才有权访问的文件,那么其他用户执行netlogin时可能因为权限不够还是不能上网。这种情况下,就可以用 chmod 4755 netlogin 设置其他用户在执行netlogin也有root用户的权限,从而顺利上网。