文件的权限: chown,chmod,chattr,SUID,SGID,sticky bit

作者:jicanmeng

时间:2016年06月05日


  1. chown: 改变文件的拥有者
  2. chgrp: 改变文件所属的群组
  3. chmod: 改变文件的权限
  4. chattr和lsattr: 设定和显示文件的隐藏属性
  5. SUID,SGID,sticky bit

1. chown: 改变文件的拥有者

命令格式如下:

chown [-R] 帐号名称 文件或目录
chown [-R] 帐号名称:群组 文件或目录
chown [-R] 帐号名称.群组 文件或目录
chown的用途还满多的,他还可以顺便直接修改群组的名称呢!此外,如果要连目录下的所有次目录或文件同时更改文件拥有者的话,直接加上 -R 的选项即可!示例如下:
[root@andy tmp]# ll limux.pdf
                    -rw-rw-rw-. 1 jicanmeng jicanmeng 387988 May 30 21:56 limux.pdf
                [root@andy tmp]# chown bin limux.pdf
                [root@andy tmp]# ll limux.pdf
                    -rw-rw-rw-. 1 bin jicanmeng 387988 May 30 21:56 limux.pdf
                [root@andy tmp]# chown bin:sshd limux.pdf
                [root@andy tmp]# ll limux.pdf
                    -rw-rw-rw-. 1 bin sshd 387988 May 30 21:56 limux.pdf
                [root@andy tmp]#

此外,chown也能单纯的修改所属群组呢!示例如下:

[root@andy tmp]# ll limux.pdf
                    -rw-rw-rw-. 1 jicanmeng jicanmeng 387988 May 30 21:56 limux.pdf
                [root@andy tmp]# chown :sshd limux.pdf
                [root@andy tmp]# ll limux.pdf
                    -rw-rw-rw-. 1 jicanmeng sshd 387988 May 30 21:56 limux.pdf
                [root@andy tmp]# chown .bin limux.pdf
                [root@andy tmp]# ll limux.pdf
                    -rw-rw-rw-. 1 jicanmeng bin 387988 May 30 21:56 limux.pdf
                [root@andy tmp]#

请记得,要被改变的帐号名称必须要在/etc/passwd文件内存在才行,否则就会显示错误!

2. chgrp: 改变文件所属的群组

命令格式如下:

chgrp [-R] 群组名称 文件或目录
[root@andy tmp]# ll limux.pdf
                    -rw-rw-rw-. 1 jicanmeng jicanmeng 387988 May 30 21:56 limux.pdf
                [root@andy tmp]# chgrp sshd limux.pdf
                [root@andy tmp]# ll limux.pdf
                    -rw-rw-rw-. 1 jicanmeng sshd 387988 May 30 21:56 limux.pdf
                [root@andy tmp]# chgrp abcd limux.pdf
                    chgrp: invalid group: `abcd'
                [root@andy tmp]#

请记得,要被改变的组名必须要在/etc/group文件内存在才行,否则就会显示错误!

3. chmod: 改变文件的权限

命令格式如下:

chmod [-R] 权限 文件或目录

权限的设定方法有两种, 分别可以使用数字或者是符号来进行权限的变更。

  1. 使用数字的方式设定权限:读权限为4,写权限为2,执行权限为1。例如,将limux.pdf修改为owner可读可写,同组的只可读,其他人不能读写:
    [root@andy tmp]# ll limux.pdf
                                -rw-rw-rw-. 1 jicanmeng jicanmeng 387988 May 30 21:56 limux.pdf
                            [root@andy tmp]# chmod 640 limux.pdf
                            [root@andy tmp]# ll limux.pdf
                                -rw-r-----. 1 jicanmeng jicanmeng 387988 May 30 21:56 limux.pdf
                            [root@andy tmp]#
  2. 使用符号的方式设定权限:
    chmodu
    g
    o
    a
    +(加入)
    -(除去)
    =(设定)
    r
    w
    x
    文件或目录

    u表示user,g表示group,o表示others,a表示all。例如:还是上面的要求,将limux.pdf修改为owner可读可写,同组的只可读,其他人不能读写:
    [root@andy tmp]# ll limux.pdf
                                -rw-rw-rw-. 1 jicanmeng jicanmeng 387988 May 30 21:56 limux.pdf
                            [root@andy tmp]# chmod u=rx,g=r limux.pdf
                            [root@andy tmp]# ll limux.pdf
                                -rw-r-----. 1 jicanmeng jicanmeng 387988 May 30 21:56 limux.pdf
                            [root@andy tmp]#

4. chattr和lsattr: 设定和显示文件的隐藏属性

除了文件分别针对user,group,others的可读,可写,可执行属性外,文件还有一些隐藏属性。

chattr用于设定文件的隐藏属性,命令格式如下:

chattr [+-=][ai] 档案或目录名称

lsattr用于设定文件的隐藏属性,命令格式如下:

lsattr [-adR] 档案或目录名称
[root@andy tmp]# lsattr limux.pdf
                    -------------e- limux.pdf
                [root@andy tmp]# chattr +i limux.pdf
                [root@andy tmp]# lsattr limux.pdf
                    ----i--------e- limux.pdf
                [root@andy tmp]# rm limux.pdf
                    rm: remove regular file `limux.pdf'? y
                    rm: cannot remove `limux.pdf': Operation not permitted
                [root@andy tmp]# df -hT .
                    Filesystem      Type  Size  Used Avail Use% Mounted on
                    /dev/sda3        ext4  247G  127G  108G   54% /
                [root@andy tmp]#

《鸟哥的linux私房菜》中提到,chattr命令只能在ext2/ext3档案系统上面应用。我的档案系统是ext4,也可以应用。

5. SUID,SGID,sticky bit

首先看三个例子:

[root@andy tmp]# ll /usr/bin/passwd
                    -rwsr-xr-x. 1 root root 30768 Feb 22  2012 /usr/bin/passwd
                [root@andy tmp]# ll /etc/shadow
                    ----------. 1 root root 1067 Jun  5 14:56 /etc/shadow
                [root@andy tmp]#
                [root@andy tmp]# ll /usr/bin/locate
                    -rwx--s--x. 1 root slocate 38464 Oct 10  2012 /usr/bin/locate
                [root@andy tmp]# ll /var/lib/mlocate/mlocate.db
                    -rw-r-----. 1 root slocate 7315108 Jun  5 15:20 /var/lib/mlocate/mlocate.db
                [root@andy tmp]#
                [root@andy tmp]# ll -d /tmp
                    drwxrwxrwt. 27 root root 4096 Jun  5 22:48 /tmp
                [root@andy tmp]#
  1. 当 s 这个标志出现在文件拥有者的 x 权限上时,例如 /usr/bin/passwd 这个文件的权限状态:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 的特殊权限。 那么SUID的权限对於一个文件的特殊功能是什么呢?基本上SUID有这样的限制与功能:

    • SUID 权限仅对二进位程序(binary program)有效;
    • 运行者对於该程序需要具有 x 的可运行权限;
    • 本权限仅在运行该程序的过程中有效 (run-time);
    • 运行者将具有该程序拥有者 (owner) 的权限。

    还是以 /usr/bin/passwd 这个文件来举例,它用于修改用户的密码。而用户的密码是保存在 /etc/shadow 文件中的,这个文件只有root才可以强制写入。但是一般用户也的确可以修改自己的密码的,也就是说,的确修改了 /etc/shadow 文件的内容。这是怎么一回事呢? 原因就在于 /usr/bin/passwd 可执行文件的权限。/etc/shadow文件是由/usr/bin/passwd文件修改的,普通用户在执行/usr/bin/passwd可执行文件时,会暂时具有root的权限,所以可以修改/etc/shadow的内容。

    有一个问题:既然普通用户执行 /usr/bin/passwd 时获取了root的权限,那么这个普通用户是不是可以修改任意一个用户的密码呢? 答案是否定的。因为 /usr/bin/passwd 这个程序在运行时会调用系统调用getuid()来得到用户ID,如果发现是个普通用户,但却要修改其他人的密码,会直接拒绝的。

    还有亮点:1. SUID 仅可用在binary program 上, 不能够用在 shell script 上面! 2. SUID 对于目录也是无效的~这点要特别留意。

  2. 当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID 喽!是这样没错!^_^。但与 SUID 不同的是,SGID 可以针对文件或目录来配置!

    1. 如果是对文件来说, SGID 有如下的功能:
      • SGID 对二进位程序有用;
      • 程序运行者对於该程序来说,需具备 x 的权限;
      • 运行者在运行的过程中将会获得该程序群组的支持!

      以上面提到的 /usr/bin/locate 这个可执行文件和 /var/lib/mlocate/mlocate.db 文件来举例,普通用户在调用locate命令时,会从 /var/lib/mlocate/mlocate.db 文件中读取信息。但这个文件只有root用户和属于slocate群组的用户才可以读取。由于locate具有SGID,所以普通用户在调用locate命令时加入slocate群组,从而可以读取/var/lib/mlocate/mlocate.db 文件。

    2. 当一个目录配置了 SGID 的权限后,他将具有如下的功能:
      • 使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
      • 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
      • 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。

      目前没有遇到过目录具有SGID的情况,这里就不举例了。

  3. 这个 Sticky Bit, SBIT 目前只针对目录有效,对於文件已经没有效果了。 SBIT 对於目录的作用是:

    • 当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
    • 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件

    /tmp目录就具有sticky bit权限,普通用户在这个目录下创建的文件,只有自己才可以删除,其它普通用户无法删除。


使用chmod命令设置SUID,SGID,Sticky Bit权限。SUID对应于4,SGID对应于2,sticky bit对应于1。举例如下:

[root@andy tmp]# touch test
                [root@andy tmp]# ls -l test
                    -rw-r--r--. 1 root root 0 Jun  6 00:03 test
                # 添加SUID权限
                [root@andy tmp]# chmod 4755 test; ls -l test
                    -rwsr-xr-x. 1 root root 0 Jun  6 00:03 test
                [root@andy tmp]#
                # 添加SUID和SGID权限
                [root@andy tmp]# chmod 6755 test; ls -l test
                    -rwsr-sr-x. 1 root root 0 Jun  6 00:03 test
                [root@andy tmp]#
                # 添加sticky bit权限
                [root@andy tmp]# mkdir emptyDir; ls -ld emptyDir
                    drwxr-xr-x. 2 root root 4096 Jun  6 00:05 emptyDir/
                [root@andy tmp]# chmod 1755 emptyDir; ls -ld emptyDir
                    drwxr-xr-t. 2 root root 4096 Jun  6 00:05 emptyDir/
                [root@andy tmp]#
                # 空的SUID、SGID、sticky bit权限
                [root@andy tmp]# chmod 7666 test; ls -l test
                    -rwSrwSrwT. 1 root root 0 Jun  6 00:03 test
                [root@andy tmp]#

特别要注意最后一个例子:怎么会出现大写的 S 与 T 呢?不都是小写的吗? 因为 s 与 t 都是取代 x 这个权限的,但是你有没有发现阿,我们是下达 7666 喔!也就是说, user, group 以及 others 都没有 x 这个可运行的标志( 因为 666 嘛 ),所以,这个 S, T 代表的就是『空的』啦!怎么说? SUID 是表示『该文件在运行的时候,具有文件拥有者的权限』,但是文件 拥有者都无法运行了,哪里来的权限给其他人使用?当然就是空的啦! ^_^

而除了数字法之外,你也可以透过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t 喽!来看看如下的范例:

[root@andy tmp]# chmod u=rwxs,go=x test; ls -l test
                    -rws--x--x. 1 root root 0 Jun  6 00:03 test
                [root@andy tmp]#
                [root@andy tmp]# chmod g+s,o+t test; ls -l test
                    -rws--s--t. 1 root root 0 Jun  6 00:03 test
                [root@andy tmp]#

参考资料

  1. 鸟哥的linux私房菜
    http://vbird.dic.ksu.edu.tw/linux_basic/0210filepermission.php
    http://vbird.dic.ksu.edu.tw/linux_basic/0220filemanager.php
  2. Unix/Linux编程实践教程
    https://book.douban.com/subject/2622187/
  3. Linux下普通用户能否修改其它用户的密码?
    https://segmentfault.com/q/1010000003886765