18.云计算&大数据_linux基础知识(17)什么是linux_Linux 的文件权限

使用者与群组

    1. 文件拥有者

      初次接触Linux的朋友大概会觉得很怪异,怎么『Linux有这么多使用者, 还分什么群组,有什么用?』。这个『用户与群组』的功能可是相当健全而好用的一个安全防护呢!怎么说呢? 由于Linux是个多人多任务的系统,因此可能常常会有多人同时使用这部主机来进行工作的情况发生, 为了考虑每个人的隐私权以及每个人喜好的工作环境,因此,这个『文件拥有者』的角色就显的相当的重要了!

      例如当你将你的e-mail情书转存成文件之后,放在你自己的家目录,你总不希望被其他人看见自己的情书吧? 这个时候,你就把该文件设定成『只有文件拥有者,就是我,才能看与修改这个文件的内容』, 那么即使其他人知道你有这个相当『有趣』的文件,不过由于你有设定适当的权限, 所以其他人自然也就无法知道该文件的内容啰!

    2. 群组概念

      那么群组呢?为何要配置文件案还有所属的群组?其实,群组最有用的功能之一,就是当你在团队开发资源的时候啦! 举例来说,假设有两组专题生在我的主机里面,第一个专题组别为projecta,里面的成员有 class1, class2, class3三个;第二个专题组别为projectb,里面的成员有class4, class5, class6。 这两个专题之间是有竞争性质的,但却要缴交同一份报告。每组的组员之间必须要能够互相修改对方的数据, 但是其他组的组员则不能看到本组自己的文件内容,此时该如何是好?

      在Linux底下这样的限制是很简单啦!我可以经由简易的文件权限设定,就能限制非自己团队(亦即是群组啰) 的其他人不能够阅览内容啰!而且亦可以让自己的团队成员可以修改我所建立的文件! 同时,如果我自己还有私人隐密的文件,仍然可以设定成让自己的团队成员也看不到我的文件数据。 很方便吧!

      另外,如果teacher这个账号是projecta与projectb这两个专题的老师, 他想要同时观察两者的进度,因此需要能够进入这两个群组的权限时,你可以设定teacher这个账号, 『同时支持projecta与projectb这两个群组!』,也就是说:每个账号都可以有多个群组的支持呢!
    3. 其他人的概念
      因此,我们就可以知道啦,在Linux里面,任何一个文件都具有『User, Group及Others』三种身份的个别权限, 我们可以将上面的说明以底下的图示来解释:

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

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

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

      无论如何,『使用者身份』,与该使用者所支持的『群组』概念,在Linux的世界里面是相当的重要的, 他可以帮助你让你的多任务Linux环境变的更容易管理!

 

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

在我们Linux系统当中,默认的情况下,所有的系统上的账号与一般身份使用者,还有那个root的相关信息, 都是记录在/etc/passwd这个文件内的。至于个人的密码则是记录在/etc/shadow这个文件下。 此外,Linux所有的组名都纪录在/etc/group内!这三个文件可以说是Linux系统里面账号、密码、群组信息的集中地

Linux 文件权限概念

嗯!既然要让你了解Linux的文件属性,那么有个重要的也是常用的指令就必须要先跟你说啰!那一个?就是『 ls 』这一个察看文件的指令啰!在你以root的身份登入Linux之后,下达『 ls -al 』看看,会看到底下的几个咚咚:

[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』则表示列出所有的文件详细的权限与属性 (包含隐藏档,就是文件名第一个字符为『 . 』的文件)。如上所示,在你第一次以root身份登入Linux时, 如果你输入上述指令后,应该有上列的几个东西,先解释一下上面七个字段个别的意思:

文件属性的示意图
图2.1.1、文件属性的示意图
  • 第一栏代表这个文件的类型与权限(permission):

这个地方最需要注意了!仔细看的话,你应该可以发现这一栏其实共有十个字符:(图2.1.1及图2.1.2内的权限并无关系)

文件的类型与权限之内容
图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号码去就是了。 关于i-node的相关数据我们会在第八章谈到文件系统时再加强介绍的。

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

  • 第五栏为这个文件的容量大小,默认单位为bytes;
  • 第六栏为这个文件的建档日期或者是最近的修改日期:
    • 这一栏的内容分别为日期(月/日)及时间。如果这个文件被修改的时间距离现在太久了,那么时间部分会仅显示年份而已。如果想要显示完整的时间格式,可以利用ls的选项,亦即:『ls -l --full-time』就能够显示出完整的时间格式了!

  • 第七栏为这个文件的档名
    • 这个字段就是档名了。比较特殊的是:如果档名之前多一个『 . 』,则代表这个文件为『隐藏档』
  • Linux文件权限的重要性:

与Windows系统不一样的是,在Linux系统当中,每一个文件都多加了很多的属性进来,尤其是群组的概念,这样有什么用途呢? 其实,最大的用途是在『数据安全性』上面的。

    • 系统保护的功能:
      举个简单的例子,在你的系统中,关于系统服务的文件通常只有root才能读写或者是执行,例如/etc/shadow这一个账号管理的文件,由于该文件记录了你系统中所有账号的数据, 因此是很重要的一个配置文件,当然不能让任何人读取(否则密码会被窃取啊),只有root才能够来读取啰!所以该文件的权限就会成为[ -rw------- ]啰!

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

    • 未将权限设定妥当的危害:
      再举个例子来说,如果你的目录权限没有作好的话,可能造成其他人都可以在你的系统上面乱搞啰! 例如本来只有root才能做的开关机、ADSL的拨接程序、新增或删除用户等等的指令,若被你改成任何人都可以执行的话, 那么如果使用者不小心给你重新启动啦!重新拨接啦!等等的!那么你的系统不就会常常莫名其妙的挂掉啰! 而且万一你的用户的密码被其他不明人士取得的话,只要他登入你的系统就可以轻而易举的执行一些root的工作!

 

 

 

如何改变文件属性与权限

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

    改变一个文件的群组真是很简单的,直接以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' <== 发生错误讯息啰~找不到这个群组名~
    

    发现了吗?文件的群组被改成users了,但是要改成testing的时候, 就会发生错误~注意喔!发生错误讯息还是要努力的查一查错误讯息的内容才好! 将他英文翻译成为中文,就知道问题出在哪里了。


    • 改变文件拥有者, chown

    如何改变一个文件的拥有者呢?很简单呀!既然改变群组是change group,那么改变拥有者就是change owner啰!BINGO!那就是chown这个指令的用途,要注意的是, 用户必须是已经存在系统中的账号,也就是在/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
    

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

    [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

    文件权限的改变使用的是chmod这个指令,但是,权限的设定方法有两种, 分别可以使用数字或者是符号来进行权限的变更。我们就来谈一谈:

    • 数字类型改变文件权限

      Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限, 先复习一下刚刚上面提到的数据:文件的权限字符为:『-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』。 另外,在实际的系统运作中最常发生的一个问题就是,常常我们以vim编辑一个shell的文字批处理文件后,他的权限通常是 -rw-rw-r-- 也就是664, 如果要将该文件变成可执行文件,并且不要让其他人修改此一文件的话, 那么就需要-rwxr-xr-x这样的权限,此时就得要下达:『 chmod 755 test.sh 』的指令啰!

      另外,如果有些文件你不希望被其他人看到,那么应该将文件的权限设定为例如:『-rwxr-----』,那就下达『 chmod 740 filename 』吧!
posted @ 2019-11-06 22:58  芝麻鹄  阅读(183)  评论(0编辑  收藏  举报