Linux权限(chmod、600、644、700、711、755、777、4755、6755、7755)suid、sgid、sticky详解
权限详解
1、Linux系统上对文件的权限有着严格的控制,如果想对某个文件执行操作,必须具有对应 的权限方可执行成功。
2、Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x 、等
3、Linux下权限的粒度有 拥有者 、群组 、其它组 三种。每个文件都可以针对三个粒度,设 置不同的rwx(读写执行)权限。通常情况下,一个文件只能归属于一个用户和组, 如果其 它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同 时归属于多个组。4、Linux文件的三种特殊权限分别是:suid权限、sgid权限、sticky权限;其中suid权限作用 于文件属主,sgid权限作用于属组上,sticky权限作用于other其他上。
Linux通常使用chmod命令对文件的权限进行设置和修改。
一、chmod使用
一般使用格式如下:
chmod [可选项] <mode> <file...>
可选项为: 可选参数
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]
其中
[u 、g、o、a]释义:
u 表示所有者,
g 表示所属组(group)者,
o 表示其他以外的人,
a 表示所有(包含上面三者)。
[+、-、=]释义:
+ 表示增加权限,
- 表示取消权限,
= 表示唯一设定权限。
[rwxX]
r 表示可读取,
w 表示可写入,
x 表示可执行,
X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
[file...]
文件列表(单个或者多个文件、文件夹)
范例:
设置所有用户可以读取a.txt
[root@ansible test1]# chmod ugo+r a.txt
[root@ansible test1]# ll
总用量 4
-r--r--r-- 1 root root 0 12月 21 14:50 a.txt
-rw-r--r-- 1 www www 5 10月 25 09:30 b.txt
[root@ansible test1]#
[root@ansible test1]# chmod a+r a.txt
设置a.txt拥有者可以读写及执行
[root@ansible test1]# chmod u+rwx a.txt
[root@ansible test1]# ll
总用量 4
-rwxr--r-- 1 root root 0 12月 21 14:50 a.txt
-rw-r--r-- 1 www www 5 10月 25 09:30 b.txt
设置文件 a.txt与b.txt 权限为所有者与其所属组 可读写,其它组可读不可写
[root@ansible test1]# chmod a+r,ug+w,o-w a.txt b.txt
[root@ansible test1]# ll
总用量 4
-rw-rw-r-- 1 root root 0 12月 21 14:50 a.txt
-rw-rw-r-- 1 www www 5 10月 25 09:30 b.txt
设置当前目录下的所有档案与子目录皆设为任何人可读写
[root@ansible test1]# chmod a+wr *
[root@ansible test1]# ll
总用量 4
-rw-rw-rw- 1 root root 0 12月 21 14:50 a.txt
-rw-rw-rw- 1 www www 5 10月 25 09:30 b.txt
[root@ansible test1]#
数字权限说明:
在linux中,首先我们需要了解数字如何表示权限。规定数字 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
[root@ansible test1]# chmod +777 a.txt
[root@ansible test1]# ll
总用量 4
-rwxrwxrwx 1 root root 0 12月 21 14:50 a.txt
---------- 1 www www 5 10月 25 09:30 b.txt
[root@ansible test1]#
若要同时设置 rw- (可读写不可执行)权限则将该权限位 设置 为 4 + 2 = 6
[root@ansible test1]# chmod +666 a.txt
[root@ansible test1]# ll
总用量 4
-rw-rw-rw- 1 root root 0 12月 21 14:50 a.txt
---------- 1 www www 5 10月 25 09:30 b.txt
[root@ansible test1]#
若要同时设置 r-x (可读可执行不可写)权限则将该权限位 设置 为 4 +1 = 5
[root@ansible test1]# chmod +500 a.txt
[root@ansible test1]# ll
总用量 4
-r-x------ 1 root root 0 12月 21 14:50 a.txt
---------- 1 www www 5 10月 25 09:30 b.txt
[root@ansible test1]#
二、chown命令使用
在linux系统中,每个的文件都有所有者,如果我们想变更文件的所有者(利用 chown 将文件拥有者加以改变),一般只有系统管理员(root)拥有此操作权限,而普通用户则没有权限修改所有者和所属组。
语法格式:
chown [可选项] user [:group] file...
使用权限:root
参数说明:
[可选项] :
-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
--dereference affect the referent of each symbolic link (this is
the default), rather than the symbolic link itself
-h, --no-dereference affect symbolic links instead of any referenced file
(useful only on systems that can change the
ownership of a symlink)
--from=当前所有者:当前所属组
只当每个文件的所有者和组符合选项所指定时才更改所
有者和组。其中一个可以省略,这时已省略的属性就不
需要符合原有的属性。
--no-preserve-root do not treat '/' specially (the default)
--preserve-root fail to operate recursively on '/'
--reference=RFILE use RFILE's owner and group rather than
specifying OWNER:GROUP values
-R, --recursive operate on files and directories recursively
user : 新的文件拥有者的使用者
group : 新的文件拥有者的使用者群体(group)
范例
设置文件 a.txt、b.txt的所有者设为 root 所属组www
[root@ansible test1]# chown root:www *
[root@ansible test1]# ll
总用量 4
-r-x------ 1 root www 0 12月 21 14:50 a.txt
---------- 1 root www 5 10月 25 09:30 b.txt
[root@ansible test1]#
设置当前目录下的所有文件的所有者设为 root 所属组tom
[root@ansible test1]# chown -R root:tom *
[root@ansible test1]# ll
总用量 4
-r-x------ 1 root tom 0 12月 21 14:50 a.txt
---------- 1 root tom 5 10月 25 09:30 b.txt
[root@ansible test1]#
常见数字授权如下:
-rw------- (600) 只有拥有者有读写权限。
-rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) 只有拥有者有读、写、执行权限。
-rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) 所有用户都有文件读、写权限。
-rwxrwxrwx (777) 所有用户都有读、写、执行权限。
常见权限符号如下:
d 代表的是目录(directory)
- 代表的是文件(regular file)
s 代表的是套字文件(socket)
p 代表的管道文件(pipe)或命名管道文件(named pipe)
l 代表的是符号链接文件(symbolic link)
b 代表的是该文件是面向块的设备文件(block-oriented device file)
c 代表的是该文件是面向字符的设备文件(charcter-oriented device file)
. 代表文件有selinux权限
t 代表文件有粘滞位权限
suid权限
作用:让普通用户临时拥有该文件的属主的执行权限,suid权限只能应用在二进制可执行文件(命令)上,而且suid权限只能设置在属主位置上。
suid权限使用s表示:
增加权限u+s,
移除权限u-s;
suid权限也可以使用数字形式表示:
0表示去除suid权限,
4表示添加suid权限,而且是在原权限的数字表达形式开头加0或4,
如下所示:
0755移除suid权限,
4755添加suid权限。
例如:普通用户执行执行passwd命令时需要去修改/etc/shaow等文件,但ll /etc/shaow发现该文件没有任何权限,
即普通用户对/etc/shaow文件是没有写入权限的,所以普通用户是怎么实现成功修改自己的密码的呢?
答案是临时拥有了root权限(root超级管理员可以对任何文件进行修改)来实现密码的修改,suid权限只能应用在二进制可执行文件上。
[root@ansible test1]# ll /etc/shadow
---------- 1 root root 753 12月 21 15:34 /etc/shadow
#这个文件没有任何权限 但是我们普通用户修改密码是如和实现的了,
其实是通过siud权限实现的如下/usr/bin/passwd/所示
[root@ansible test1]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
[root@ansible test1]#
去掉suid权限
[root@ansible test1]# chmod 0755 /usr/bin/passwd
[root@ansible test1]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
[root@ansible test1]#
添加suid权限
[root@ansible test1]# chmod 4755 /usr/bin/passwd
[root@ansible test1]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
[root@ansible test1]#
sgid权限
作用:sgid权限一般应用在目录上,当一个目录拥有sgid权限时,任何用户在该目录下创建的文件的属组都会继承该目录的属组。
sgid权限也使用s表示:
增加权限g+s,移除权限g-s;
sgid权限也可以使用数字形式表示:
0表示去除sgid权限,2表示添加sgid权限,
而且是在原权限的数字表达形式最前方 加0或2,如:0755移除sgid权限,2755添加sgid权限。
添加sgid权限
在未使用sgid时先创建一个目录和文件看权限情况
[root@ansible data01]# mkdir test
[root@ansible test]# touch ha.txt
[root@ansible data01]# ll test/
总用量 0
-rw-r--r-- 1 root root 0 12月 21 16:06 ha.txt
[root@ansible data01]#
在创建一个新目录和新文件 加上sgid权限 作对比
[root@ansible data01]# mkdir test1
[root@ansible test]# cd ../test1/
[root@ansible test1]# touch he.txt
[root@ansible data01]# chmod -R 2755 test1/ #添加sgid权限
[root@ansible data01]# cd test1/
[root@ansible test1]# ll #查看sgid权限
总用量 0
-rwxr-sr-x 1 root root 0 12月 21 16:12 a.txt
-rwxr-sr-x 1 root root 0 12月 21 16:10 he.txt
[root@ansible test1]#
去掉sgid权限
[root@ansible data01]# chmod -R 0755 test1/
[root@ansible data01]# ll test1/
总用量 0
-rwxr-xr-x 1 root root 0 12月 21 16:12 a.txt
-rwxr-xr-x 1 root root 0 12月 21 16:10 he.txt
[root@ansible data01]#
sticky权限
sticky权限
作用:sticky权限一般针对目录来设置,作用是只允该目录下的文件的创建者删除自己的创建的文件,不允许其他人删除文件。(root用户除外,因为root用户是超级管理员),而且sticky权限只能设置在other位置上。
sticky权限使用t表示,
增加权限o+t,移除权限o-t;
sticky权限也可以使用数字形式表示,0表示去除权限,1表示添加权限,
而且是在原权限的数字表达形式开头加0或1,如下:如:0755移除sticky权限,1755添加sticky权限。
添加sticky权限
我用普通用户www创建文件 用普通用户tom删除测试
[www@ansible hehe]$ ll
总用量 0
-rwxrwxrwx 1 www www 0 12月 21 16:29 a.txt #使用www新建文件
[www@ansible hehe]$
使用tom用户删除
-rwxrwxrwx 1 www www 0 12月 21 16:29 a.txt
[tom@ansible hehe]$ rm -rf a.txt
[tom@ansible hehe]$ ll
总用量 0
[tom@ansible hehe]$
为使用sticky权限是其他用户是可以删除www用户创建的文件的
添加了sticky权限后
[www@ansible home]$ chmod -R 1777 www/
[www@ansible hehe]$ touch b.txt
[www@ansible hehe]$ ll
总用量 0
-rw-rw-r-- 1 www www 0 12月 21 16:42 b.txt
[www@ansible hehe]$
在使用tom去删除b.txt文件
[tom@ansible hehe]$ ls
b.txt
[tom@ansible hehe]$
[tom@ansible hehe]$
[tom@ansible hehe]$
[tom@ansible hehe]$ rm -rf b.txt 发现tom用户无法删除www使用了sticky权限新建的文件
rm: 无法删除"b.txt": 不允许的操作
[tom@ansible hehe]$ ls
b.txt
[tom@ansible hehe]$
去掉sticky权限
[www@ansible home]$ chmod -R 0777 www/ #去掉sticky权限
[www@ansible home]$
[www@ansible home]$
[www@ansible home]$
[www@ansible home]$ cd /home/www/hehe/
[www@ansible hehe]$ ll
总用量 0
-rwxrwxrwx 1 www www 0 12月 21 16:42 b.txt
[www@ansible hehe]$
去使用tom用户删除b.txt文件 发现可以正常删除 这就是sticky权限的作用
[tom@ansible hehe]$ rm -rf b.txt
[tom@ansible hehe]$
[tom@ansible hehe]$
[tom@ansible hehe]$ ll
总用量 0
[tom@ansible hehe]$