zoukankan      html  css  js  c++  java
  • Linux学习之CentOS(四)----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-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          ]
    [  权限  ][文件数][拥有者][群组]  [文件大小] [   修改日期  ] [      文件名       ]

    如果这个文件被修改的时间距离现在太久了,那么时间部分会仅显示年份而已。 如下所示:

    [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) 所建立的,所以就显示完整的时间了。

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

    第七栏为这个文件的档名

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

    这七个字段的意义是很重要的!务必清楚的知道各个字段代表的意义!尤其是第一个字段的九个权限, 那是整个Linux文件权限的重点之一。

    总结如下

    通过查看ls -l命令可以查看文件的详细列表信息(如文件类型、所在组、文件名等)
    如:-rwxrw-r-- 1 501 502 100 Mar Test.java
    【-rwxrw-r--】各个段的含义
    将【-rwxrw-r--】拆分为 【-| rwx| rw-| r--】四段
    第一段【-】代表的是文件类型,一般有三种(-代表是文件)、(d代表是文件夹)、(l代表是链接)可以用字符表示的文件类型 
    -:普通文件
    d:目录文件
    l:链接文件
    b:块设备文件
    c:字符设备文件
    p:管道文件
     【rwx代表的含义】,在linux系统中,r代表用户对该文件或者文件夹拥有可读权限、w代表可写权限、x代表可执行权限
    在linux系统中,每个权限都有一个数字来表示,r(可读权限)用数字4表示,w(可写权限)用数字2表示,x(可执行权限)用数字1表示
    第二段【rwx】代表的是该文件(或文件夹)的【所有者(谁创建了该文件,谁就是该文件的所有者)】对该文件的访问权限,如该所有者对该文件的权限是可读、可写、可执行
    第三段【rw-】代表的是该用户【所在组的其它用户】对该文件的访问权限,如该用户组其它用户对该文件的访问权限是可读、可写
    第四段【r--】代表的是【除了该用户所在组的其他组】对该文件的访问权限,如其他组用户对该文件的访问权限是可读
    【注:权限都可以用数字来代替,例如 rwx 可用 4+2+1 =7 来表示,rw可用数字6来表示等】
    绿色文件: 可执行文件,可执行的程序 
     
    红色文件:压缩文件或者包文件
     
    蓝色文件:目录
     
    白色文件:一般性文件,如文本文件,配置文件,源码文件等 
     
    浅蓝色文件:链接文件,主要是使用ln命令建立的文件
     
    红色闪烁:表示链接的文件有问题
     
    黄色表示设备文件
     
    灰色:表示其他文件
     
      1 501 502 100 Mar Test.java各个字段含义
    1:代表的文件个数,如果是文件则是1,若是文件夹,则显示该文件夹下子文件数目
    501:代表哪个用户,在每创建一个用户时,都会为该用户创建一个唯一的用户id,501就是指代该用户的id
    502:代表该用户所在组,在创建每一个组时,linux也会为该组创建一个唯一的组id,502就是代表该用户所在组的id
    100:代表文件的大小
    Mar:代表文件创建时间
    Test.java:代表文件名

    如何改变文件属性与权限

    linux系统文件权限分为三种:(1)使用者(2)群组(3)其他人

           我们现在知道文件权限对于一个系统的安全重要性了,也知道文件的权限对于使用者与群组的相关性, 那么如何修改一个文件的属性与权限呢?又!有多少文件的权限我们可以修改呢? 其实一个文件的属性与权限有很多!我们先介绍几个常用于群组、拥有者、各种身份的权限之修改的指令,如下所示:

    • 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 』吧!

    符号类型改变文件权限

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

            u        +        r
    chmod   g        -        w        文件或目录
            o        =        x
            a

    来实作一下吧!假如我们要『设定』一个文件的权限成为『-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文件种类与扩展名

    我们在基础篇一直强调一个概念,那就是:任何装置在Linux底下都是文件, 不仅如此,连数据沟通的接口也有专属的文件在负责~所以,你会了解到,Linux的文件种类真的很多~ 除了前面提到的一般文件(-)与目录文件(d)之外,还有哪些种类的文件呢?

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

    • 正规文件(regular file ):
      就是一般我们在进行存取的类型的文件,在由 ls -al 所显示出来的属性方面,第一个字符为 [ - ],例如 [-rwxrwxrwx ]。另外,依照文件的内容,又大略可以分为:

      • 纯文本档(ASCII):这是Linux系统中最多的一种文件类型啰, 称为纯文本档是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。 几乎只要我们可以用来做为设定的文件都属于这一种文件类型。 举例来说,你可以下达『 cat ~/.bashrc 』就可以看到该文件的内容。 (cat 是将一个文件内容读出来的指令)

      • 二进制文件(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] 。

    除了设备文件是我们系统中很重要的文件,最好不要随意修改之外(通常他也不会让你修改的啦!), 另一个比较有趣的文件就是连结档。如果你常常将应用程序捉到桌面来的话,你就应该知道在 Windows底下有所谓的『快捷方式』。同样的,你可以将 linux下的连结档简单的视为一个文件或目录的快捷方式。 至于socket与FIFO文件比较难理解,因为这两个咚咚与程序(process)比较有关系, 这个等到未来你了解process之后,再回来查阅吧!此外, 你也可以透过man fifo及man socket来查阅系统上的说明!

    Linux文件扩展名

    基本上,Linux的文件是没有所谓的『扩展名』的,我们刚刚就谈过,一个Linux文件能不能被执行,与他的第一栏的十个属性有关, 与档名根本一点关系也没有。这个观念跟Windows的情况不相同喔!在Windows底下, 能被执行的文件扩展名通常是 .com .exe .bat等等,而在Linux底下,只要你的权限当中具有x的话,例如[ -rwx-r-xr-x ] 即代表这个文件可以被执行喔!

    不过,可以被执行跟可以执行成功是不一样的~举例来说,在root家目录下的install.log 是一个纯文本档,如果经由修改权限成为 -rwxrwxrwx 后,这个文件能够真的执行成功吗? 当然不行~因为他的内容根本就没有可以执行的数据。所以说,这个x代表这个文件具有可执行的能力, 但是能不能执行成功,当然就得要看该文件的内容啰~

    虽然如此,不过我们仍然希望可以藉由扩展名来了解该文件是什么东西,所以, 通常我们还是会以适当的扩展名来表示该文件是什么种类的。底下有数种常用的扩展名:

    • *.sh : 脚本或批处理文件 (scripts),因为批处理文件为使用shell写成的,所以扩展名就编成 .sh ;

    • *Z, *.tar, *.tar.gz, *.zip, *.tgz: 经过打包的压缩文件。这是因为压缩软件分别为 gunzip, tar 等等的,由于不同的压缩软件,而取其相关的扩展名啰!

    • *.html, *.php:网页相关文件,分别代表 HTML 语法与 PHP 语法的网页文件啰! .html 的文件可使用网页浏览器来直接开启,至于 .php 的文件, 则可以透过 client 端的浏览器来 server 端浏览,以得到运算后的网页结果呢!

    基本上,Linux系统上的文件名真的只是让你了解该文件可能的用途而已, 真正的执行与否仍然需要权限的规范才行!例如虽然有一个文件为可执行文件, 如常见的/bin/ls这个显示文件属性的指令,不过,如果这个文件的权限被修改成无法执行时, 那么ls就变成不能执行啰!

    上述的这种问题最常发生在文件传送的过程中。例如你在网络上下载一个可执行文件,但是偏偏在你的 Linux系统中就是无法执行!呵呵!那么就是可能文件的属性被改变了!不要怀疑,从网络上传送到你的 Linux系统中,文件的属性与权限确实是会被改变的喔!

    Linux文件长度限制

    在Linux底下,使用预设的Ext2/Ext3文件系统时,针对文件的档名长度限制为:

    • 单一文件或目录的最大容许文件名为 255 个字符;
    • 包含完整路径名称及目录 (/) 之完整档名为 4096 个字符。

    是相当长的档名喔!我们希望Linux的文件名可以一看就知道该文件在干嘛的, 所以档名通常是很长很长!而用惯了Windows的人可能会受不了,因为文件名通常真的都很长, 对于用惯Windows而导致打字速度不快的朋友来说,嗯!真的是很困扰.....不过,只得劝你好好的加强打字的训练!

    Linux文件名的限制:

    由于Linux在文字接口下的一些指令操作关系,一般来说,你在设定Linux底下的文件名时, 最好可以避免一些特殊字符比较好!例如底下这些:

    * ? > < ; & ! [ ] | ' " ` ( ) { }

    因为这些符号在文字接口下,是有特殊意义的!另外,文件名的开头为小数点『.』时, 代表这个文件为『隐藏档』喔!同时,由于指令下达当中,常常会使用到 -option 之类的选项, 所以你最好也避免将文件档名的开头以 - 或 + 来命名啊!

     文章参考 
     
     
  • 相关阅读:
    线程范围内共享数据
    Swagger+ springfox +Spring mvc
    Nginx代理实现跨域
    实现AJAX跨域访问方式一
    Tomcat 调优及 JVM 参数优化
    REST接口设计规范
    IDEA里面添加lombok插件,编写简略风格Java代码
    intelliJ idea 使用技巧&方法
    IntelliJ IDEA 创建maven项目
    IntelliJ IDEA + Maven创建Java Web项目
  • 原文地址:https://www.cnblogs.com/qzqdy/p/7988232.html
Copyright © 2011-2022 走看看