• Linux文件基本属性(以ls -l输出为例解释)


    Linux文件类型及权限

    简介

      在Linux中,我们可以通过ls -l [path]命令查看文件的基本属性,其中path是可选参数,不指定path会默认以当前目录为查询目录,例如:

    ydqun@VM-0-9-ubuntu chapter7 % ls -l                                                                                                                                                                      [0]
    total 40
    -rw-r--r-- 1 ydqun root 164 Jan 23 19:03 1.test.sh
    -rw-r--r-- 1 ydqun root  14 Jan 24 14:23 1.txt
    -rw-r--r-- 1 ydqun root  41 Jan 23 19:03 2.true.false.sh
    -rw-r--r-- 1 ydqun root 495 Jan 23 19:09 3.file_type.sh
    -rw-r--r-- 1 ydqun root 319 Jan 23 19:09 4.check.termimal.sh
    -rw-r--r-- 1 ydqun root 322 Jan 23 19:12 5.check.file.sh
    -rw-r--r-- 1 ydqun root 196 Jan 23 19:14 6.same.file.sh
    -rw-r--r-- 1 ydqun root 159 Jan 23 19:17 7.campare_int.sh
    -rw-r--r-- 1 ydqun root 263 Jan 23 19:24 8.campare.str.sh
    -rwxr--r-- 1 ydqun root  33 Jan 23 18:59 test.sh
    

      这里输出的第一行为查询目录的所有文件所占的block的存储大小,每一个块的大小为4k(4096bytes),total 40表示该目录下所有文件所占的块的存储大小为40k,这里特别注意,因为该目录下有10个文件,即使每个文件的大小小于4k,也占用一个block,所以一共有10block,共40k的大小。
      接下来,就是以长列表形式输出文件的七个详细属性的字段,分别为文件权限属性,文件硬链接数,文件所有者,文件所属用户组,文件大小,文件修改时间和文件名称,如图所示

    上图只是一个总结,具体每一个字段,我们详细讲解。

    文件类型与文件权限

      第一个字段由10个字符组成,主要包含两部分文件属性信息,为文件类型和文件权限,其中第一个字符表示文件类型,具体对应关系如下:

    “-”表示普通文件;
    “d”表示目录;
    “l”表示链接文件;
    “p”表示管道文件;
    “b”表示块设备文件;
    “c”表示字符设备文件;
    “s”表示套接字文件

      接着剩下的九个字符,每三个表示一组,分别表示文件所有者,文件所属组,其他用户对该文件拥有的读(r),写(w)和可执行(x)三个基本权限,例如对于cowsay这个文件,文件的所有者root用户拥有该文件的可读可写可执行权限,另外,我们可以用八进制数值来表示一个权限值,因为每一组有三个字符,占三位,我们可以用位数对应的八进制数值来表示权限值,所以我们又可以说root对文件cowsay拥有的权限为7。类似的,我们也可以推导出文件所属组的用户对该文件可读可执行,其他用户对该文件可读可执行。
      这里,我们需要解释一下何为可读,可写,可执行,这里主要分为目录文件和非目录文件两个部分
    对于目录而言:
    1.读权限允许用户可以读取目录中的文件名,但不能进入该目录,也不能查看到该目录下个文件的属性。
    2.写权限允许用户修改目录,例如创建、移动、复制和删除
    3.执行权限允许用户进入该目录,或者搜索该目录
    对于非目录文件:
    1.读权限允许用户可以读取该文件的内容或者查看该文件的属性
    2.写权限允许用户可以修改该文件的属性(例如修改内容等)
    3.可执行权限主要是针对二进制可执行文件或者某些脚本文件而言,拥有可执行文件意味着用户可以去执行这两种文件
      上面讲述的只是文件的基本属性,还有一些特殊属性,分别为:set uidset gidsticky Bit

    SUID(set uid)

      是为了让普通用户在执行某些程序时,能够暂时具有该程序的拥有者权限。这里最典型的例子就是/usr/bin/passwd这个命令去修改/etc/shadow(Linux系统中记录用户密码的文件,修改密码就是修改这个文件里面的密码记录)中的密码,当我们用ls -l分别取查看/etc/shadow/usr/bin/passwd文件时,有以下结果。

    ydqun@VM-0-9-ubuntu /tmp % ls -l /usr/bin/passwd                                                             
    -rwsr-xr-x 1 root root 59640 Mar 23  2019 /usr/bin/passwd
    ydqun@VM-0-9-ubuntu /tmp % sudo ls -l /etc/shadow                                                            
    [sudo] password for ydqun:
    -rw-r----- 1 root shadow 1675 Jan 15 22:05 /etc/shadow
    

      我们可以看到,在原本文件所有者权限的可执行权限x变成了小写的s,这里就是设置了suid,所以其他用户组本来没有写权限(w),但是因为该文件设置了suid,这样其他用户也可以暂时拥有文件所有者的权限,具体就是其他用户即使没有拥有对/etc/shadow的可写权限,也可以通过passwd这个命令暂时拥有写权限去修改/etc/shadow里面的密码。

    SGID (set gid)

    SBIT

      SBIT就是Sticky Bit,如果在设置了SBit属性的目录中,用户在该目录下拥有w和x权限,那么当用户在该目录下新建文件时,只有文件拥有者和root才有权利删除。这里最典型的例子就是/tmp目录,如下:

    ydqun@VM-0-9-ubuntu /tmp % ls -la /tmp | head -n 2                                                             
    total 280
    drwxrwxrwt 17 root  root   4096 Jan 26 00:10 .
    

    我们通过ls -l去查看/tmp/目录的的文件权限时,发现在其他用户的可执行权限的位置上,原来的x变成了t,这就是表示/tmp/具有Sticky Bit权限,所以即使任意用户对于/tmp都拥有可读可写可执行权限,但是当前登录的用户只能在/tmp目录下删除文件所有者为自身的文件。例如:

    ydqun@VM-0-9-ubuntu /tmp % ls -l net_affinity.log                                                                                                                                                         
    -rwxr--rwx 1 root root 140 Oct  1 16:42 net_affinity.log                                                                                 
    ydqun@VM-0-9-ubuntu /tmp % rm net_affinity.log                                                                
    rm: remove write-protected regular file 'net_affinity.log'? y
    rm: cannot remove 'net_affinity.log': Operation not permitted
    

    在以上的例子中,我们可以看到,即使当前用户ydqun对文件net_affinity.log具有可写权限,但是还是没办法删除它。

    文件硬链接数

      介绍硬链接数前,我们先介绍一下链接。
      链接文件主要是Linux文件系统提供的一种可以通过多个文件来访问文件的手段。
      Linux中有两种链接文件:硬链接(hard link)和软连接(soft link),我们可以通过ln [-s] <file>命令来创建链接文件,其中-s是常用命令权限,加上-s表示创建一个软连接文件,不加默认创建一个硬链接文件,至于软硬链接的区别,这里先不细究。
      需要注意的是,ls -l列出来的第二个字段表示的是硬链接数,而不是软链接数或者软硬链接数之和。这里我们测试一下。

    ydqun@VM-0-9-ubuntu /tmp % ls -l 1.txt                                                                        
    -rw-rw-r-- 1 ydqun ydqun 3567 Jan 25 21:51 1.txt
    ydqun@VM-0-9-ubuntu /tmp % ln 1.txt 1.txt.hard                                                                
    ydqun@VM-0-9-ubuntu /tmp % ls -l 1.txt                                                                        
    -rw-rw-r-- 2 ydqun ydqun 3567 Jan 25 21:51 1.txt
    ydqun@VM-0-9-ubuntu /tmp % ln -s 1.txt 1.txt.soft                                                            
    ydqun@VM-0-9-ubuntu /tmp % ls -l 1.txt                                                                       
    -rw-rw-r-- 2 ydqun ydqun 3567 Jan 25 21:51 1.txt
    
    

      由上述例子可验证,确实是硬连接数。

    文件所有者和文件所属组

      第三和第四个字段,分别表示文件所有者(user)和文件所属组(group),我们可以通过chown去修改文件所有者和文件所属组,当然我们一般用chgrp来修改文件所属组更为容易理解。

    文件大小

      第五个字段表示文件大小,单位为字节,这里有一个比较需要掌握的知识点,就是Linux文件系统有一个叫block的概念,一个block为4096个字节(4k),一般文件存放在文件系统中是以block为单位,不足4096个字节也归为一个block。这里简单提一下。

    文件修改时间(modify time)

      文件有三个时间,不清楚的可以访问这里https://www.cnblogs.com/ydqblogs/p/14300625.html

    文件名称

      没啥好说,就是文件的名称。

  • 相关阅读:
    RWIGS and LORBIT (1)
    时间档案:飞秒、皮秒、纳秒、微秒、毫秒、秒 (转自新浪)
    Linux Shell 文本处理工具集锦(转载)
    awk——getline
    PERL 正则表达式简介
    算法的性能
    排序算法与稳定性的理解
    实现双端队列
    实现栈
    实现队列
  • 原文地址:https://www.cnblogs.com/ydqblogs/p/14323747.html
Copyright © 2020-2023  润新知