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]$