第六章、Linux 的文件权限与目录配置

使用者与群组


  1. 文件拥有者



  2. 群组概念

    假设有两组专题生在我的主机里面,第一个专题组别为projecta,里面的成员有class1, class2, class3;第二个专题组别为projectb,里面的成员有class4, class5, class6。这两个专题之间是有竞争性质的,都要缴交同一份报告。每组的组员之间必须要能够互相修改对方的数据,但是其他组的组员则不能看到本组自己的文件内容,此时该如何是好?

    如果teacher这个账号是projecta与projectb这两个专题的老师,他想要同时观察两者的进度,因此需要能够进入这两个群组的权限,你可以设定teacher这个账号『同时支持projecta与projectb这两个群组!』,也就是说:每个账号都可以有多个群组的支持

    假设有一家人,家里只有三兄弟,分别是王大毛、王二毛与王三毛,而这个家庭是登记在王大毛的名下!所以,『王大毛家有三个人,分别是王大毛、王二毛与王三毛』,而且这三个人都有自己的房间,并且共同拥有一个客厅!

    • 使用者的意义:由于王家三人各自拥有自己的房间,所以,王二毛虽然可以进入王三毛的房间,但是二毛不能翻三毛的抽屉!那样会被三毛K的!因为抽屉里面可能有三毛自己私人的东西,例如情书,日记等等的,这是『私人的空间』,所以当然不能让二毛拿!

    • 群组的概念:由于共同拥有客厅,所以王家三兄弟可以在客厅打开电视机、翻阅报纸、坐在沙发上面发呆等等! 反正,只要是在客厅的玩意儿,三兄弟都可以使用!因为大家都是一家人!

    『王大毛家』就是所谓的『群组』,至于三兄弟分别为三个『使用者』,而这三个使用者是在同一个群组里面!而三个使用者虽然在同一群组内,但是我们可以设定『权限』,好让某些用户个人的信息不被群组的拥有者查询,以保有个人『私人的空间』!而设定群组共享,则可让大家共同分享!

  3. 其他人的概念

    今天又有个人,叫做张小猪,他是张小猪家的人,与王家没有关系!这个时候,除非王家认识张小猪,然后开门让张小猪进来王家,否则张小猪永远没有办法进入王家,更不要说进到王三毛的房间!不过,如果张小猪透过关系认识了三毛,并且跟王三毛成为好朋友,那么张小猪就可以透过三毛进入王家!那个张小猪就是所谓的『其他人,Others』!

    在Linux里面,任何一个文件都具有『User, Group及Others』三种身份的权限


    图1.1、每个文件的拥有者、群组与其他人的示意图

    我们以王三毛为例,王三毛这个『文件』的拥有者为王三毛,他属于王大毛这个群组,而张小猪相对于王三毛,则只是一个『其他人(others)』而已。

    不过,这里有个特殊的人物要来介绍的,那就是『万能的天神』!这个天神具有无限的神力,所以他可以到达任何他想要去的地方!那个人在Linux系统中的身份代号是『 root 』!


Linux 用户身份与群组记录的文件

在Linux系统中,默认情况下,所有的账号信息,都是记录在/etc/passwd这个文件内。个人的密码则是记录在/etc/shadow这个文件下。Linux所有的组名都记录在/etc/group!


Linux 文件权限概念

Linux文件属性

[root@www ~]# ls -al
total 156
drwxr-x---   4    root   root     4096   Sep  8 14:06 .
drwxr-xr-x  23    root   root     4096   Sep  8 14:21 ..
-rw-------   1    root   root     1474   Sep  4 18:27 anaconda-ks.cfg
-rw-------   1    root   root      199   Sep  8 17:14 .bash_history
-rw-r--r--   1    root   root       24   Jan  6  2007 .bash_logout
-rw-r--r--   1    root   root      191   Jan  6  2007 .bash_profile
-rw-r--r--   1    root   root      176   Jan  6  2007 .bashrc
-rw-r--r--   1    root   root      100   Jan  6  2007 .cshrc
drwx------   3    root   root     4096   Sep  5 10:37 .gconf      <=范例说明处
drwx------   2    root   root     4096   Sep  5 14:09 .gconfd
-rw-r--r--   1    root   root    42304   Sep  4 18:26 install.log <=范例说明处
-rw-r--r--   1    root   root     5661   Sep  4 18:25 install.log.syslog
[    1   ][  2 ][   3  ][  4 ][    5   ][     6     ][       7          ]
[  权限  ][连结][拥有者][群组][文件容量][  修改日期 ][      檔名        ]
   

ls是『list』的意思,重点在显示文件的文件名与相关属性。而选项『-al』则表示列出所有文件详细的权限与属性(包含隐藏档,就是文件名第一个字符为『 . 』的文件)。


图2.1.1、文件属性的示意图

  • 第一栏代表这个文件的类型与权限(permission):

图2.1.2、文件的类型与权限之内容

  • 第一个字符代表这个文件是『目录、文件或链接文件等等』:

    • 当为[ d ]则是目录,例如上表档名为『.gconf』的那一行;
    • 当为[ - ]则是文件,例如上表档名为『install.log』那一行;
    • 若是[ l ]则表示为连结档(link file);
    • 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
    • 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。

  • 接下来的字符中,以三个为一组,且均为『rwx』的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]。

    • 第一组为『文件拥有者的权限』,以『install.log』那个文件为例,该文件的拥有者可以读写,但不可执行;
    • 第二组为『同群组的权限』;
    • 第三组为『其他非本群组的权限』。

例题:
若有一个文件的类型与权限数据为『 -rwxr-xr--』,请说明其意义为何?
答:
先将类型与权限数据分开查阅,并将十个字符整理成为如下所示:
[-][rwx][r-x][r--]
 1  234  567  890
 1 为:代表这个文件名为目录或文件,本例中为文件(-);
234为:拥有者的权限,本例中为可读、可写、可执行(rwx);
567为:同群组用户权力,本例中为可读可执行(rx);
890为:其他用户权力,本例中为可读(r)


同时注意到,rwx所在的位置是不会改变的,有该权限就会显示字符,没有该权限就变成减号(-)。

目录与文件的权限意义并不相同,这是因为目录与文件所记录的数据内容不相同所致。

  • 第二栏表示有多少档名连结到此节点(i-node):

每个文件都会将他的权限与属性记录到文件系统的i-node中,不过,我们使用的目录树却是使用文件名来记录,因此每个档名就会连结到一个i-node!这个属性记录的,就是有多少不同的档名连结到相同的一个i-node号码去。

  • 第三栏表示这个文件(或目录)的『拥有者账号』
  • 第四栏表示这个文件的所属群组

在Linux系统下,你的账号会附属于一个或多个的群组中。举刚刚我们提到的例子,class1, class2, class3均属于projecta这个群组,假设某个文件所属的群组为projecta,且该文件的权限如图2.1.2所示(-rwxrwx---),则class1, class2, class3三人对于该文件都具有可读、可写、可执行的权限(看群组权限)。但如果是不属于projecta的其他账号,对于此文件就不具有任何权限了。

  • 第五栏为这个文件的容量大小,默认单位为bytes;
  • 第六栏为这个文件的建档日期或者是最近的修改日期:

这一栏的内容分别为日期(月/日)及时间。如果这个文件被修改的时间距离现在太久了,那么时间部分会仅显示年份而已。如下所示:

[root@www ~]# ls -l /etc/termcap /root/install.log
-rw-r--r-- 1 root root 807103 Jan  7  2007 /etc/termcap
-rw-r--r-- 1 root root  42304 Sep  4 18:26 /root/install.log
# 如上所示,/etc/termcap 为 2007 年所修改过的文件,离现在太远之故;
# 至于 install.log 是今年 (2009) 所建立的,所以就显示完整的时间了。

如果想要显示完整的时间格式,可以利用ls的选项,亦即:『ls -l --full-time』就能够显示出完整的时间格式了!包括年、月、日、时间。另外,如果你当初是以繁体中文安装你的Linux系统,那么日期字段将会以中文来显示。可惜的是,中文并没有办法在纯文本的终端机模式中正确的显示,所以此栏会变成乱码。那你就得要使用『LANG=en_US』来修改语系!

如果想要让系统默认的语系变成英文的话,那么你可以修改系统配置文件『/etc/sysconfig/i18n』使LANG这个变量成为上述的内容即可。

  • 第七栏为这个文件的档名

这个字段就是档名了。比较特殊的是:如果档名之前多一个『 . 』,则代表这个文件为『隐藏档』,例如上表中的.gconf那一行,该文件就是隐藏档。你可以使用『ls』及『ls -a』这两个指令去感受一下什么是隐藏档!

   


例题:
假设test1, test2, test3同属于testgroup这个群组,如果有下面的两个文件,请说明两个文件的拥有者与其相关的权限为何?
-rw-r--r--  1 root     root          238 Jun 18 17:22 test.txt 
-rwxr-xr--  1 test1    testgroup    5238 Jun 19 10:25 ping_tsai
答:
  • 文件test.txt的拥有者为root,所属群组为root。至于权限方面则只有root这个账号可以存取此文件,其他人则仅能读此文件;

  • 另一个文件ping_tsai的拥有者为test1,而所属群组为testgroup。其中:
    • test1 可以针对此文件具有可读可写可执行的权力;
    • 而同群组的test2, test3两个人与test1同样是testgroup的群组账号,则仅可读可执行但不能写(亦即不能修改);
    • 至于非testgoup这一个群组的人则仅可以读,不能写也不能执行!

例题:
如果我的目录为底下的样式,请问testgroup这个群组的成员与其他人(others)是否可以进入本目录?
    drwxr-xr--   1 test1    testgroup    5238 Jun 19 10:25 groups/
答:
  • 文件拥有者test1[rwx]可以在本目录中进行任何工作;
  • 而testgroup这个群组[r-x]的账号,例如test2, test3亦可以进入本目录进行工作,但是不能在本目录下进行写入的动作;
  • 至于other的权限中[r--]虽然有r ,但是由于没有x的权限,因此others的使用者,并不能进入此目录!

  • Linux文件权限的重要性:


  • 系统保护的功能:

  • 团队开发软件或数据共享的功能:
    如果你有一个软件开发团队,在你的团队中,你希望每个人都可以使用某一些目录下的文件,而非你的团队的其他人则不予以开放。以上面的例子来说,testgroup的团队共有三个人,分别是test1, test2, test3,那么我就可以将团队所需的文件权限订为[ -rwxrwx--- ]!

  • 未将权限设定妥当的危害:






如何改变文件属性与权限


  • chgrp :改变文件所属群组
  • chown :改变文件拥有者
  • chmod :改变文件的权限, SUID, SGID, SBIT等等的特性

  • 改变所属群组, chgrp

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

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

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




  • 改变文件拥有者, chown

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

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

[root@www ~]# chown [-R] 账号名称 文件或目录
[root@www ~]# chown [-R] 账号名称:组名 文件或目录
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更

范例:将install.log的拥有者改为bin这个账号:
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log

范例:将install.log的拥有者与群组改回为root:
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r--  1 root root 68495 Jun 25 08:53 install.log
Tips:
事实上,chown也可以使用『chown user.group file』,亦即在拥有者与群组间加上小数点『.』也行!不过很多朋友设定账号时,喜欢在账号当中加入小数点(例如vbird.tsai这样的账号格式),这就会造成系统误判!所以我们比较建议使用冒号『:』来隔开拥有者与群组!此外,chown也能单纯的修改所属群组!例如『chown .sshd install.log』就是修改群组
 

需要变更文件的拥有者:在复制文件给你之外的其他人时:

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

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

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

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


  • 改变权限, 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
    所以等一下我们修改权限时,该文件的权限数字就是770!变更权限的指令chmod的语法是这样的:
    [root@www ~]# chmod [-R] xyz 文件或目录
    选项与参数:
    xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
    -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
    
    举例来说,如果要将.bashrc这个文件所有的权限都设定启用,那么就下达:
    [root@www ~]# ls -al .bashrc
    -rw-r--r--  1 root root 395 Jul  4 11:45 .bashrc
    [root@www ~]# chmod 777 .bashrc
    [root@www ~]# ls -al .bashrc
    -rwxrwxrwx  1 root root 395 Jul  4 11:45 .bashrc
    
    那如果要将权限变成『 -rwxr-xr-- 』呢?那么权限的分数就成为[4+2+1][4+0+1][4+0+0]=754 !所以你需要下达『chmod 754 filename』。

    另外,如果有些文件你不希望被其他人看到,那么应该将文件的权限设定为『-rwxr-----』,那就下达『chmod 740 filename 』!

    例题:
    将刚刚你的.bashrc这个文件的权限修改回-rw-r--r--的情况吧!
    答:
    -rw-r--r--的分数是644,所以指令为:
    chmod 644 .bashrc

  • 符号类型改变文件权限



    chmod u
    g
    o
    a
    +(加入)
    -(除去)
    =(设定)
    r
    w
    x
    文件或目录

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

    • user (u):具有可读、可写、可执行的权限;
    • group 与 others (g/o):具有可读与执行的权限。

    所以就是:
    [root@www ~]# chmod  u=rwx,go=rx  .bashrc
    # 注意!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格!
    [root@www ~]# ls -al .bashrc
    -rwxr-xr-x  1 root root 395 Jul  4 11:45 .bashrc
    
    那么假如是『 -rwxr-xr-- 』这样的权限呢?可以使用『 chmod u=rwx,g=rx,o=r filename 』来设定。此外,如果不知道原先的文件属性,而只想要增加.bashrc这个文件的每个人均可写入的权限,那么我就可以使用:
    [root@www ~]# ls -al .bashrc
    -rwxr-xr-x  1 root root 395 Jul  4 11:45 .bashrc
    [root@www ~]# chmod  a+w  .bashrc
    [root@www ~]# ls -al .bashrc
    -rwxrwxrwx  1 root root 395 Jul  4 11:45 .bashrc
    
    而如果是要将权限去掉而不更动其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:
    [root@www ~]# chmod  a-x  .bashrc
    [root@www ~]# ls -al .bashrc
    -rw-rw-rw-  1 root root 395 Jul  4 11:45 .bashrc
    
     + 与 – 的状态下,只要是没有指定到的项目,则该权限『不会被变动』,例如上面的例子中,由于仅以 – 拿掉 x 则其他两个保持当时的值不变!举例来说,你想要教一个朋友如何让一个程序可以拥有执行的权限,但你又不知道该文件原本的权限为何,此时,利用『chmod a+x filename』 ,就可以让该程序拥有执行的权限了。





你可能感兴趣的:(第六章、Linux 的文件权限与目录配置)