CentOS学习笔记--文件权限概念,centos学习笔记


Linux 文件权限概念

当你的屏幕出现了『Permission deny』的时候,不要担心,『肯定是权限设定错误』啦!(以下节选自 鸟哥的 Linux 私房菜 第六章、Linux 的文件权限与目录配置 2. Linux文件权限概念)

Linux文件属性

在你以root的身份登入Linux之后,下达『 ls -al 』看看,会看到底下的几个咚咚:

[root@localhost ~]# ls -al
total 64
dr-xr-x---.  2 root root  4096 Dec 18 09:28 .
dr-xr-xr-x. 22 root root  4096 Nov 14 16:08 ..
-rw-------.  1 root root  1098 Nov  3 19:57 anaconda-ks.cfg
-rw-------.  1 root root 12288 Dec 18 09:28 .anaconda-ks.cfg.swp
-rw-------.  1 root root  1517 Dec 18 10:36 .bash_history
-rw-r--r--.  1 root root    18 May 20  2009 .bash_logout
-rw-r--r--.  1 root root   176 May 20  2009 .bash_profile
-rw-r--r--.  1 root root   176 Sep 23  2004 .bashrc
-rw-r--r--.  1 root root   100 Sep 23  2004 .cshrc
-rw-r--r--.  1 root root  8726 Nov  3 19:57 install.log
-rw-r--r--.  1 root root  3190 Nov  3 19:56 install.log.syslog
-rw-r--r--.  1 root root   129 Dec  4  2004 .tcshrc
[1]         [2][3]  [4]   [5]  [6]          [7]
[权限]  [连接][拥有者][群组][文件大小][修改日期][文件]

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

文件的类型与权限之内容

    • 第一个字符代表这个文件是『目录、文件或链接文件等等』:
      • 当为[ d ]则是目录,例如上表档名为『.』的那一行;
      • 当为[ - ]则是文件,例如上表档名为『install.log』那一行;
      • 若是[ l ]则表示为连结档(link file);
      • 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
      • 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)
    • 接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
      • 第一组为『文件拥有者的权限』,以『install.log』那个文件为例, 该文件的拥有者可以读写,但不可执行;
      • 第二组为『同群组的权限』;
      • 第三组为『其他非本群组的权限』。
  • 第二栏表示有多少档名连结到此节点(i-node):
  • 第三栏表示这个文件(或目录)的『拥有者账号』
  • 第四栏表示这个文件的所属群组
  • 第五栏为这个文件的容量大小,默认单位为bytes;
  • 第六栏为这个文件的建档日期或者是最近的修改日期:
  • 第七栏为这个文件的档名。
    • 这个字段就是档名了。比较特殊的是:如果档名之前多一个『 . 』,则代表这个文件为『隐藏档』。

如何改变文件属性与权限

常用于群组、拥有者、各种身份的权限之修改的指令,如下所示:

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

改变所属群组, chgrp

改变一个文件的群组真是很简单的,直接以chgrp来改变即可,咦!这个指令就是change group的缩写嘛!这样就很好记了吧! ^_^。不过,请记得,要被改变的组名必须要在/etc/group文件内存在才行,否则就会显示错误!

[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 这个文件中有纪录的用户名称才能改变。

[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

改变权限, 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)的持续变更,亦即连同次目录下的所有文件都会变更
  • 如果要将权限变成『 -rwxr-xr-- 』呢?那么权限的分数就成为 [4+2+1][4+0+1][4+0+0]=754 啰!所以你需要下达『 chmod 754 filename』。 另外,在实际的系统运作中最常发生的一个问题就是,常常我们以vi编辑一个shell的文字批处理文件后,他的权限通常是 -rw-rw-r-- 也就是664, 如果要将该文件变成可执行文件,并且不要让其他人修改此一文件的话, 那么就需要-rwxr-xr-x这样的权限,此时就得要下达:『 chmod 755 test.sh 』的指令啰!
    另外,如果有些文件你不希望被其他人看到,那么应该将文件的权限设定为例如:『-rwxr-----』,那就下达『chmod 740 filename 』吧!

  • 符号类型改变文件权限
    还有一个改变权限的方法呦!从之前的介绍中我们可以发现,基本上就九个权限分别是(1)user (2)group (3)others三种身份啦!那么我们就可以藉由u, g, o来代表三种身份的权限!此外, a 则代表 all 亦即全部的身份!那么读写的权限就可以写成r, w, x!也就是可以使用底下的方式来看:


    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系统内文件的三种身份(拥有者、群组与其他人),知道每种身份都有三种权限(rwx), 已知道能够使用chown, chgrp, chmod去修改这些权限与属性,当然,利用ls -l去观察文件也没问题。那么,这些文件权限对于一般文件与目录文件有何不同呢? 有大大的不同啊!


权限对文件的重要性

文件是实际含有数据的地方,包括一般文本文件、数据库内容文件、二进制可执行文件(binary program)等等。 因此,权限对于文件来说,他的意义是这样的:

  • r (read):可读取此一文件的实际内容,如读取文本文件的文字内容等;
  • w (write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件);
  • x (execute):该文件具有可以被系统执行的权限。

那个可读(r)代表读取文件内容是还好了解,那么可执行(x)呢?这里你就必须要小心啦! 因为在Windows底下一个文件是否具有执行的能力是藉由『 扩展名 』来判断的, 例如:.exe, .bat, .com 等等,但是在Linux底下,我们的文件是否能被执行,则是藉由是否具有『x』这个权限来决定的!跟档名是没有绝对的关系的!

至于最后一个w这个权限呢?当你对一个文件具有w权限时,你可以具有写入/编辑/新增/修改文件的内容的权限, 但并不具备有删除该文件本身的权限!对于文件的rwx来说, 主要都是针对『文件的内容』而言,与文件档名的存在与否没有关系喔!因为文件记录的是实际的数据嘛!


权限对目录的重要性

文件是存放实际数据的所在,那么目录主要是储存啥玩意啊?目录主要的内容在记录文件名列表,文件名与目录有强烈的关连啦! 所以如果是针对目录时,那个 r, w, x 对目录是什么意义呢?

  • r (read contents in directory):
    表示具有读取目录结构列表的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据。 所以你就可以利用 ls 这个指令将该目录的内容列表显示出来!
  • w (modify contents of directory):
    这个可写入的权限对目录来说,是很了不起的! 因为他表示你具有异动该目录结构列表的权限,也就是底下这些权限:
    • 建立新的文件与目录;
    • 删除已经存在的文件与目录(不论该文件的权限为何!)
    • 将已存在的文件或目录进行更名;
    • 搬移该目录内的文件、目录位置。

    总之,目录的w权限就与该目录底下的文件名异动有关就对了啦!
  • x (access directory):
    咦!目录的执行权限有啥用途啊?目录只是记录文件名而已,总不能拿来执行吧?没错!目录不可以被执行,目录的x代表的是用户能否进入该目录成为工作目录的用途! 所谓的工作目录(work directory)就是你目前所在的目录啦!举例来说,当你登入Linux时, 你所在的家目录就是你当下的工作目录。而变换目录的指令是『cd』(change directory)啰!

文件种类:

我们在刚刚提到使用『ls -l』观察到第一栏那十个字符中,第一个字符为文件的类型。 除了常见的一般文件(-)与目录文件(d)之外,还有哪些种类的文件类型呢?

  • 正规文件(regular file ):
    就是一般我们在进行存取的类型的文件,在由 ls -al 所显示出来的属性方面,第一个字符为 [ - ],例如 [-rwxrwxrwx ]。另外,依照文件的内容,又大略可以分为:
    • 纯文本档(ASCII):这是Linux系统中最多的一种文件类型啰, 称为纯文本档是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。 几乎只要我们可以用来做为设定的文件都属于这一种文件类型。 举例来说,你可以下达『 cat ~/.bashrc 』就可以看到该文件的内容。
    • 二进制文件(binary):Linux当中的可执行文件(scripts, 文字型批处理文件不算)就是这种格式的啦~ 举例来说,刚刚下达的指令cat就是一个binary file。
    • 数据格式文件(data): 有些程序在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件 (data file)。举例来说,我们的Linux在使用者登入时,都会将登录的数据记录在 /var/log/wtmp那个文件内,该文件是一个data file,他能够透过last这个指令读出来! 但是使用cat时,会读出乱码~因为他是属于一种特殊格式的文件。瞭乎?
  • 目录(directory):
    就是目录啰~第一个属性为 [ d ],例如 [drwxrwxrwx]。
  • 连结档(link):
    就是类似Windows系统底下的快捷方式啦! 第一个属性为 [ l ](英文L的小写),例如 [lrwxrwxrwx] ;
  • 设备与装置文件(device):
    与系统周边及储存等相关的一些文件, 通常都集中在/dev这个目录之下!通常又分为两种:
    • 区块(block)设备档 :就是一些储存数据, 以提供系统随机存取的接口设备,举例来说,硬盘与软盘等就是啦! 你可以随机的在硬盘的不同区块读写,这种装置就是成组设备啰!你可以自行查一下/dev/sda看看, 会发现第一个属性为[ b ]喔!
    • 字符(character)设备文件:亦即是一些串行端口的接口设备, 例如键盘、鼠标等等!这些设备的特色就是『一次性读取』的,不能够截断输出。 举例来说,你不可能让鼠标『跳到』另一个画面,而是『滑动』到另一个地方啊!第一个属性为 [ c ]。
  • 数据接口文件(sockets):
    既然被称为数据接口文件, 想当然尔,这种类型的文件通常被用在网络上的数据承接了。我们可以启动一个程序来监听客户端的要求, 而客户端就可以透过这个socket来进行数据的沟通了。第一个属性为 [ s ], 最常在/var/run这个目录中看到这种文件类型了。
  • 数据输送文件(FIFO, pipe):
    FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。 FIFO是first-in-first-out的缩写。第一个属性为[p] 。

相关内容