Skip to content

03 文件类型与目录权限

1. 文件种类

  • 正规文件(regular file):就是一般我们在进行存取的类型的文件。属性的第一个字符为-。根据文件内容,又可以大致分为以下几类:
    • 纯文本文件(ASCII):人类可以直接读到的数据。
    • 二进制文件(binary)
    • 数据格式文件( data) : 有些程序在运行的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件(data file)。
  • 目录(directory):属性的第一个字符为d
  • 链接文件(link):属性的第一个字符为l
  • 设备与设备文件(device):与系统周边及储存等相关的一些文件, 通常都集中在/dev这个目 录之下! 通常又分为 两 种:
    • 区块(block)设备文件 : 就是一些储存数据, 以提供系统随机存取的周边设备,例如硬盘。属性的第一个字符为b。你可以随机的在硬盘的不同区块读写 , 这种设备就是区块设备。
    • 字符(character)设备文件:亦即是一些序列埠的周边设备,例如键盘、鼠标。这些设备的特色就是“一次性读取”的, 不能够截断输出。属性的第一个字符为c
  • 数据接口文件(sockets): 这种类型的文件通常被用在网络上的数据承接了。属性的第一个字符为s
  • 数据输送文件( FIFO, pipe) : FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问 题。FIFO是first-in-first-out的缩写 。 第 一个属 性为p

2. 目录的权限解读

  • r(read contents in directory): 表示具有读取目录结构清单的权限, 所以当 你具有读取一个目录的权限时,表示你可以查询该目录下的文件名数据。 所以你就可以利用 ls 这个指令将该目录的内容列表显示出来!

  • w (modify contents of directory):

    • 创建新的文件与目录;
    • 删除已经存在的文件与目录( 不论该文件的权限为何! )
    • 将已存在的文件或目录进行更名;
    • 移动该目录内的文件、目录位置。
  • x (access directory):

    代表的是使用者能否进入该目录成为工作目录。有了此权限才可以切换到目录。如果你在某目录下不具有x的权限, 那么你就无法切换到该目录下,也就无法执行该目录下的任何指令, 即使你具有该目录的r或w的权限。

只具有r权限,其它用户可以获取文件列表,但是不能读取完整的文件信息:

[root@linux tmp]# ll
drwxr-xr--. 2 root root  16 Aug  2 13:44 test-permission

[shark@linux ~]$ ll /tmp/test-permission/
ls: cannot access /tmp/test-permission/t1: Permission denied
total 0
-????????? ? ? ? ?            ? t1

只具有x权限,其它用户可以直接读取目录中的内容,却不能获取文件列表:

[root@linux tmp]# ll
drwxr-x--x. 2 root root  16 Aug  2 13:44 test-permission

[shark@linux ~]$ ll /tmp/test-permission/
ls: cannot open directory /tmp/test-permission/: Permission denied
[shark@linux ~]$ ll /tmp/test-permission/t1
-rw-r--r--. 1 root root 0 Aug  2 13:44 /tmp/test-permission/t1
[shark@linux ~]$ cat /tmp/test-permission/t1
111

3. /lost+found

这个目录是使用标准的ext2/ext3/ext4文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下。不过如果使用的是 xfs 文件系统的话,就不会存在这个目录了!

4. 根目录

跟目录下也有...两目录,但是两者权限与属性完全相同。这代表根目录的上一层与根目录自己是同一个目录。

[shark@linux ~]$ ll -a /
total 20
dr-xr-xr-x.  17 root root  224 Jul 31 14:27 .
dr-xr-xr-x.  17 root root  224 Jul 31 14:27 ..

5. cp 命令的权限

选项与参数:

-a     -dr --preserve=all 的意思, 至于dr请参考下列说明;(常用)
-d  若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身;
-f  为强制(force)的意思,若目标文件已经存在且无法打开,则移除后 再尝试一次;
-i  若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l  进行硬式链接(hard link)的链接文件创建, 而非复制文件本身;
-p  连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用);
-r  递回持续复制,用于目录的复制行为;(常用)
-s  复制成为符号链接文件(symbolic link),亦即“捷径”文件;
-u  destination  source 旧才更新 destination,或 destination 不存在的情况下才复制。
--preserve=all  除了 -p 的权限相关参数外, 还加入 SELinux 的属性,links,xattr 等也复制了 

不同身份者执行这个指令会有不同的结果产生,尤其是-a, -p的选项, 对于不同身份来说,差异非常的大!

默认的条件中 , cp 的来源文件与目的文件的权限是不同的, **目的文件的拥有者通常会是指令操作者本身 。 **

[shark@linux ~]$ cp -a /var/log/wtmp /tmp/wtmp_shark
[shark@linux ~]$ ll /tmp/wtmp_shark /var/log/wtmp
-rw-rw-r--. 1 shark shark 19584 Aug  7 09:55 /tmp/wtmp_shark
-rw-rw-r--. 1 root  utmp  19584 Aug  7 09:55 /var/log/wtmp

由 于 shark 的身份并不能随意修改文件的拥有者与群组,因此虽然能够复制 wtmp 的相关权限与时间等属性。但是与拥有者、群组相关的,原本shark身份无法进行的动作, 即使加上 -a 选项,也是无法达成完整复制权限的!

6. 删除“--”开头的文件

不能直接删除,需要指定路径删除:

[shark@linux test]$ rm -a
rm: invalid option -- 'a'
Try 'rm ./-a' to remove the file ‘-a’.
Try 'rm --help' for more information.
[shark@linux test]$ rm --a
rm: unrecognized option '--a'
Try 'rm ./--a' to remove the file ‘--a’.
Try 'rm --help' for more information.

或者这样:

[shark@linux test]$ rm -- -a
[shark@linux test]$ rm -- --a

7. 特殊权限

# t 权限
[sink@dev ~]$ ll -d /tmp/
drwxrwxrwt. 24 root root 8192 Sep 20 11:00 /tmp/
# s权限
[sink@dev ~]$ ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

7.1 Set UID

指当 s 这个标志出现在文件拥有者的 x 权限上的情况,简称为 SUID 的特殊权限。

  • SUID 权限仅对二进制程序( binary program) 有效,对shell脚本及目录无效;
  • 执行者对于该程序需要具有 x 的可执行权限;
  • 本权限仅在执行该程序的过程中有效 ( run-time) ;
  • 执行者将具有该程序拥有者 ( owner) 的权限。

举例说明一下:

/usr/bin/passwd是属于root用户的,执行的时候会去修改/etc/shadow文件:

[sink@dev ~]$ ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd
# 可见该文件只有root才能强制修改
[root@dev playbooks]# ll /etc/shadow
----------. 1 root root 1349 Nov  8  2018 /etc/shadow

普通用户也有/usr/bin/passwd执行权限,但是如果是普通的-rwxr-xr-x权限的话,就会执行失败,因为普通用户没有对/etc/shadow的读写权限。此时s权限就派上用场了,它可以使普通用户在运行/usr/bin/passwd的时候临时获取/usr/bin/passwd拥有者root的权限,这样就可以修改/etc/shadow文件啦。

7.2 Set GID

SUID类似,SGID指的是当 s 这个标志出现在用户组的 x 权限上的情况。

7.2.1 在二进制文件上设置

  • 执行者对于该程序需要具有 x 的可执行权限;
  • 执行者在执行的过程中将会获得该程序群组的支持
# 所有执行locate的用户都可以临时获得slocate组的读取mlocate.db数据文件权限
[root@dev ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x. 1 root slocate    40520 Apr 11  2018 /usr/bin/locate
-rw-r-----  1 root slocate 14164378 Sep 23 03:38 /var/lib/mlocate/mlocate.db

7.2.2 在目录上设置

当一个目录设置了 SGID 的权限后,它将具有如下的功能:

  • 使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
  • 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
  • 用途:若使用者在此目录下具有 w 的权限( 可以新建文件),则使用者所创建的新文件的群组与此目录的群组相同 。
[root@dev ~]# cd /tmp/
[root@dev ~]# mkdir work-together
[root@dev ~]# chmod g+s,o=rwx work-together/
[root@dev ~]# ll
drwxr-srwx 2 root root    6 Sep 23 11:16 work-together
[root@dev tmp]# su sink
[sink@dev tmp]$ cd work-together/
[sink@dev work-together]$ touch sink-file1
# 普通用户sink创建的文件的用户组变为了root组
[sink@dev work-together]$ ll
total 0
-rw-rw-r-- 1 sink root 0 Sep 23 11:18 sink-file1

7.3 Sticky Bit

SBIT目前只针对目录有效。

当使用者对于此目录具有 w, x权限, 亦即具有写入的权限时,当使用者在该目录下创建文件或目录时,仅有自己与 root 才 有权力删除该文件。

[root@dev ~]# cd /tmp/
[root@dev tmp]# ll -d /tmp/
drwxrwxrwt. 25 root root 4096 Sep 23 13:57 /tmp/
[root@dev tmp]# touch root-f1
[root@dev tmp]# chmod 777 root-f1
[root@dev tmp]# ll root-f1
-rwxrwxrwx 1 root root 0 Sep 23 13:58 root-f1
[root@dev tmp]# su sink
[sink@dev tmp]$ rm -f root-f1
rm: cannot remove ‘root-f1’: Operation not permitted

7.4 权限设置

上述的权限可以通过数字或MODE([ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+)的形式来设置。

下面介绍一下如何通过数字设置特殊权限。

在普通权限的3个数字之前再加一个数字来代表特殊权限,分别为:

  • 4:SUID
  • 2:SGID
  • 1:SBIT
[root@dev tmp]# touch test-SUID
[root@dev tmp]# chmod 4755 test-SUID
[root@dev tmp]# ll test-SUID
-rwsr-xr-x 1 root root 0 Sep 23 14:32 test-SUID

# 也可以组合起来设置
[root@dev tmp]# chmod 6755 test-SUID
[root@dev tmp]# ll test-SUID
-rwsr-sr-x 1 root root 0 Sep 23 14:32 test-SUID

[root@dev tmp]# mkdir test-SBIT
[root@dev tmp]# chmod 1755 test-SBIT/
[root@dev tmp]# ll -d test-SBIT/
drwxr-xr-t 2 root root 6 Sep 23 14:36 test-SBIT/

当拥有者都没有执行权限时,会变为大写:

[root@dev tmp]# chmod -x test-SUID
[root@dev tmp]# ll test-SUID
-rwSr-Sr-- 1 root root 0 Sep 23 14:32 test-SUID