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 uid
、set gid
和sticky 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
文件名称
没啥好说,就是文件的名称。