本文目录索引:

 
  1. 1、
    (1)
    (2)
    (3)
  2. 2、
  3.              
  4.              
  5. 3、
  6.             
  7.             
  8. 4、
  9.              
  10.            

 文件与目录的默认权限与隐藏权限


 1、文件默认权限 --umask

 umask 就是指定 『目前使用者在创建文件或目录时候的权限默认值

 
  1. 查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字型态的权限配置分数, 一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了! 奇怪的是,怎么 umask 会有四组数字啊?不是只有三组吗?是没错啦,第一组是特殊权限用的。 
 
  1. 在默认权限的属性上,目录与文件是不一样的。从第六章我们知道 x 权限对於目录是非常重要的! 但是一般文件的创建则不应该有运行的权限,因为一般文件通常是用在於数据的记录嘛!当然不需要运行的权限了。 因此,默认的情况如下: 
  2.  
  3. 若使用者创建为『文件』则默认『没有可运行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下: 
  4. -rw-rw-rw- 
  5.  
  6. 若使用者创建为『目录』,则由於 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下: 
  7. drwxrwxrwx 
 
  1. 要注意的是,umask 的权限配置分数指的是『该默认值需要减掉的权限』 
  2.  
  3. root用户:umask 为 022 ,user 并没有被拿掉任何权限,不过 group 与 others 的权限被拿掉了 2 (也就是 w 这个权限)。所以如果 umask 订定为 022 ,那新建的数据只有使用者自己具有 w 的权限, 同群组的人只有 r 这个可读的权限而已,并无法修改喔! 
  4.  
  5. 创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r-- 
  6. 创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x 
  7.  
  8.  
  9. 一般身份使用者: umask 为 002 ,亦即保留同群组的写入权力! 
  10.  
  11. 创建文件时:(-rw-rw-rw-) - (-------w-) ==> -rw-rw--r-- 
  12. 创建目录时:(drwxrwxrwx) - (d------w-) ==> drwxrwxr-x 

例题:
假设你的 umask 为 003 ,请问该 umask 情况下,创建的文件与目录权限为?
答:
umask 为 003 ,所以拿掉的权限为 --------wx,因此:
文件: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
目录: (drwxrwxrwx) - (--------wx) = drwxrwxr--

 2、文件特殊权限

 
  1.  SUID 是表示当一个文件具有suid权限时,且该文件的所有者为a时,其他用户b也可取得与a一样的权限,它一般只对文件有效,对目录无效。 
  2.  
  3. SGID,当你将一个a目录置为sgid权限时候,其他人对于a目录有读取,执行和写入的权限时,别人在此目录中创建的任何文件和目录的所属组都为a目录的所属组..但所属主还是自己,对文件与目录都有效。 
  4.  
  5. SBIT 全称Sticky Bit.但是它只对目录有效,对文件却是无效的,它的作用就是让你不能随便删掉别人的资料。 

 (1) SUID--set UID

 
  1.  我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:『-r-------- 1 root root』,意思是这个文件仅有root可读且仅有root可以强制写入而已。
  2.  既然这个文件仅有 root 可以修改,那么鸟哥的 vbird 这个一般帐号使用者能否自行修改自己的密码呢? 你可以使用你自己的帐号输入『passwd』这个命令来看看,嘿嘿!一般使用者当然可以修改自己的密码了! 
  3.  
  4. 唔!有没有冲突啊!明明 /etc/shadow 就不能让 vbird 这个一般帐户去存取的,为什么 vbird 还能够修改这个文件内的密码呢? 
  5. 这就是 SUID 的功能啦!藉由上述的功能说明,我们可以知道
  6. 1、vbird 对於 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 vbird 能运行 passwd;
  7. 2、passwd 的拥有者是 root 这个帐号;
  8. 3、vbird 运行 passwd 的过程中,会『暂时』获得 root 的权限; 
  9. 4、/etc/shadow 就可以被 vbird 所运行的 passwd 所修改。 
  10. 但如果 vbird 使用 cat 去读取 /etc/shadow 时,他能够读取吗?因为 cat 不具有 SUID 的权限,所以 vbird 运行 『cat /etc/shadow』 时,是不能读取 /etc/shadow 的。我们用一张示意图来说明如下: 
  11. SUID程序运行的过程示意图
                                               图4.4.1、SUID程序运行的过程示意图
 
  1. 基本上SUID有这样的限制与功能(结合上面的例子说明): 
  2.  
  3. 1、SUID 权限仅对二进位程序(binary program)(passwd这个二进制可执行文件)有效; 
  4. 2、命令使用用户(上面例子为vbird)对於该程序需要具有 x 的可运行权限(即passwd这个二进制文件对其他人(o)具有x权限); 
  5. 3、命令使用用户将具有该程序拥有者 (owner) (上面的例子为root)的权限。 
  6. 4、本权限仅在运行该程序的过程中有效 (run-time); 

UID 仅可用在binary program 上, 不能够用在 shell script 上面!这是因为 shell script 只是将很多的 binary 运行档叫进来运行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的配置, 而不是 shell script 本身。当然,SUID 对於目录也是无效的。

(2)SGID --Set GID

 
  1. 与 SUID 不同的是,SGID 可以针对文件或目录来配置! 
  2.  
  3. 如果是对文件来说, SGID 有如下的功能: 
  4. 1、SGID 对二进位程序有用; 
  5. 2、程序运行者对於该程序来说,需具备 x 的权限; 
  6. 3、运行者在运行的过程中将会获得该程序群组的支持! 
  7.  
  8. 如果是对目录来说, SGID 有如下的功能: 
  9. 1、使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录; 
  10. 2、使用者在此目录下的有效群组(effective group)将会变成该目录的群组; 
  11. 【用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。】 

 (3)SBIT --Sticky Bit

 
  1. SBIT 目前只针对目录有效, SBIT 对於目录的作用是: 
  2. 1、当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时; 
  3. 2、当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件 
 
  1. 当甲这个使用者于A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等操作。 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。 

 (4)SUID/SGID/SBIT 权限配置

 
  1. 现在你应该已经知道数字型态更改权限的方式为『三个数字』的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了! 
  2. 4 为 SUID 
  3. 2 为 SGID 
  4. 1 为 SBIT 
  5. 假设要将一个文件权限改为『-rwsr-xr-x』时,由於 s 在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来配置! 

数字法:

 
  1. chmod u+s test(其中之前u=rwx,g=rwx,o=rwx)等同于chmod 4777 test等同于chmod u=rwxs test 
  2.  
  3. 如果chmod 4677 test,则test的权限为为u=rwS,g=rw,o=rw 
  4.  
  5. SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t (前提是u、g、o之前都要有x权限),假如u之前没有x权限,如一个test1文件,其权限为u=rw,g=rwx,o=rwx,则执行chmod u+x test1之后其权限变为u=rwS(不是rws),g=rwx,o=rwx 
  6. 【此时test1权限为u=rwS,g=rwx,o=rwx,执行chmod u+x test1之后test1权限变为u=rws,g=rws,o=rws】 

符号法:

其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t (前提:文件权限a+x)

 
  1. 取消SUID,SGID,SBIT可用u-s,g-s,o-t 

 3、文件隐藏属性

 (1)配置文件隐藏属性 --chattr 

 不过要先强调的是,底下的chattr命令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个命令了

 

  (2)显示文件隐藏属性 --lsattr

更改文件权限(chmod)


 改变文件权限的数字类型:

 文件的权限字符为:『-rwxrwxrwx』, 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下: r:4 w:2 x:1

 每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数则是:

 owner = rwx = 4+2+1 = 7
 group = rwx = 4+2+1 = 7
 others= --- = 0+0+0 = 0 

而拥有此权限的文件的文件名为.bashrc,则变更它的权限如下:

 
  1. chmod 770  .bashrc 

 变更权限的指令chmod的语法是这样的:

 
  1.  chmod [-R] xyz 文件或目录 
  2. 选项与参数: 
  3. xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。 
  4. -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变 

注意:常常,我们以编辑一个shell的文字批处理文件后,他的权限通常是 -rw-rw-r-- 也就是664。

 更改文件权限的符号类型:

linux中的文件使用者与群组:u(user),g(group),o(others),a(all)

chmod

u

g
o
a

+(加入)

-(除去)
=(设定)

r

w
x

文件或目录

 假如我们要『设定』一个文件的权限成为『-rwxr-xr-x』时,基本上就是:

 user (u):具有可读、可写、可执行的权限;

group 与 others (g/o):具有可读与执行的权限。

所以就是:

 
  1. [root@www ~]# chmod  u=rwx,go=rx  .bashrc 
  2. # 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格! 
  3. [root@www ~]# ls -al .bashrc 
  4. -rwxr-xr-x  1 root root 395 Jul  4 11:45 .bashrc 

那么假如是『 -rwxr-xr-- 』这样的权限呢?可以使用『 chmod u=rwx,g=rx,o=r filename 』来设定。此外,如果我不知道原先的文件属性,而我只想要增加.bashrc这个文件的每个人均可写入的权限, 那么我就可以使用:

 
  1. [root@www ~]# ls -al .bashrc 
  2. -rwxr-xr-x  1 root root 395 Jul  4 11:45 .bashrc 
  3. [root@www ~]# chmod  a+w  .bashrc 
  4. [root@www ~]# ls -al .bashrc 
  5. -rwxrwxrwx  1 root root 395 Jul  4 11:45 .bashrc 

而如果是要将权限去掉而不更动其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:

 
  1. [root@www ~]# chmod  a-x  .bashrc 
  2. [root@www ~]# ls -al .bashrc 
  3. -rw-rw-rw-  1 root root 395 Jul  4 11:45 .bashrc 

知道 +, -, = 的不同点了吗?对啦! + 与 – 的状态下,只要是没有指定到的项目,则该权限『不会被变动』, 例如上面的例子中,由于仅以 – 拿掉 x 则其他两个保持当时的值不变

 linux权限的意义


 对文件而言

r (read):可读取此一文件的实际内容,如读取文本文件的文字内容等;

w (write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件);
x (execute):该文件具有可以被系统执行的权限。

 对目录而言

r (read contents in directory):表示具有读取目录结构列表的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据。 所以你就可以利用 ls 这个指令将该目录的内容列表显示出来!

w (modify contents of directory):这个可写入的权限对目录来说,是很了不起的! 因为他表示你具有异动该目录结构列表的权限,也就是底下这些权限:

建立新的文件与目录;

删除已经存在的文件与目录(不论该文件的权限为何!)
将已存在的文件或目录进行更名;
搬移该目录内的文件、目录位置。

x (access directory):目录只是记录文件名而已,总不能拿来执行吧?没错!目录不可以被执行,目录的x代表的是用户能否进入该目录成为工作目录的用途! 

具体的例子如下:

例题:
有个目录的权限如下所示:
drwxr--r--  3  root  root  4096   Jun 25 08:35   .ssh
系统有个账号名称为vbird,这个账号并没有支持root群组,请问vbird对这个目录有何权限?是否可切换到此目录中?
答:
vbird对此目录仅具有r的权限,因此vbird可以查询此目录下的文件名列表。因为vbird不具有x的权限, 因此vbird并不能切换到此目录内!(相当重要的概念!)

例题:
假设有个账号名称为dmtsai,他的家目录在/home/dmtsai/,dmtsai对此目录具有[rwx]的权限。 若在此目录下有个名为the_root.data的文件,该文件的权限如下:
-rwx------ 1 root  root  4365 Sep 19 23:20  the_root.data
请问dmtsai对此文件的权限为何?可否删除此文件?
答:
如上所示,由于dmtsai对此文件来说是『others』的身份,因此这个文件他无法读、无法编辑也无法执行, 也就是说,他无法变动这个文件的内容就是了。
但是由于这个文件在他的家目录下, 他在此目录下具有rwx的完整权限,因此对于the_root.data这个『档名』来说,他是能够『删除』的! 结论就是,dmtsai这个用户能够删除the_root.data这个文件!

 更改文件的属性


 改变所属群组(chgrp)

假设你是以root的身份登入Linux系统的,那么在你的家目录内有一个install.log的文件, 如何将该文件的群组改变一下呢?假设你已经知道在/etc/group里面已经存在一个名为users的群组, 但是testing这个群组名字就不存在/etc/group当中了,此时改变群组成为users与testing分别会有什么现象发生呢?

 
  1. [root@www ~]# chgrp [-R] dirname/filename ...  
  2. 选项与参数:  
  3. -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件、目录  
  4.      都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。  
  5. 范例:  
  6. [root@www ~]# chgrp users install.log  
  7. [root@www ~]# ls -l  
  8. -rw-r--r--  1 root users 68495 Jun 25 08:53 install.log  
  9. [root@www ~]# chgrp testing install.log  
  10. chgrp: invalid group name `testing' <== 发生错误讯息啰~找不到这个群组名~  

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

 改变文件拥有者(chown)

chown的用途还满多的,他还可以顺便直接修改群组的名称呢!此外,如果要连目录下的所有次目录或文件同时更改文件拥有者的话,直接加上 -R 的选项即可!我们来看看语法与范例:

 
  1. [root@www ~]# chown [-R] 账号名称 文件或目录 
  2. [root@www ~]# chown [-R] 账号名称:组名 文件或目录 
  3. 选项与参数: 
  4. -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更 
  5.  
  6. 范例:将install.log的拥有者改为bin这个账号: 
  7. [root@www ~]# chown bin install.log 
  8. [root@www ~]# ls -l 
  9. -rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log 
  10.  
  11. 范例:将install.log的拥有者与群组改回为root: 
  12. [root@www ~]# chown root:root install.log 
  13. [root@www ~]# ls -l 
  14. -rw-r--r--  1 root root 68495 Jun 25 08:53 install.log 

注意:用户必须是已经存在系统中的账号,也就是在/etc/passwd 这个文件中有纪录的用户名称才能改变。

 更改文件属性的意义

知道如何改变文件的群组与拥有者了,那么什么时候要使用chown或chgrp呢?或许你会觉得奇怪吧? 是的,确实有时候需要变更文件的拥有者的,最常见的例子就是在复制文件给你之外的其他人时, 我们使用最简单的cp指令来说明好了:

 
  1. [root@www ~]# cp 来源文件 目标文件 

假设你今天要将.bashrc这个文件拷贝成为.bashrc_test档名,且是要给bin这个人,你可以这样做:

 
  1. [root@www ~]# cp .bashrc .bashrc_test 
  2. [root@www ~]# ls -al .bashrc* 
  3. -rw-r--r--  1 root root 395 Jul  4 11:45 .bashrc 
  4. -rw-r--r--  1 root root 395 Jul 13 11:31 .bashrc_test  <==新文件的属性没变 

由于复制行为(cp)会复制执行者的属性与权限,所以!怎么办?.bashrc_test还是属于root所拥有, 如此一来,即使你将文件拿给bin这个使用者了,那他仍然无法修改的(看属性/权限就知道了吧), 所以你就必须要将这个文件的拥有者与群组修改一下啰!

本文内容出自: