https://blog.csdn.net/wangking407/article/details/100139409

# Linux 文件权限与目录配置

在 Linux 中,默认情况下,所有的系统下的账号与一般身份使用者,还有 root 的相关信息,都是记录在 /etc/passwd 这个文件内的。至于个人的密码则都是记录在 /etc/shadow 这个文件下。此外,Linux 所有的组名都记录在 /etc/group 内!这三个文件可以说是 Linux 系统里面账号、密码、群组信息的集中地,不要随便删除这三个文件。

# Linux 文件权限概念

当你屏幕出现【Permission deny】时,“肯定是权限设置错了啦”。

# Linux 文件属性
/home/user/data # ls -al                                                        
total 5                                                                         
drwxr-sr-x    9 user     user           272 Dec  8 02:27 .                      
drwxr-sr-x   10 user     user           311 Dec  8 02:27 ..                                    
-rw-r--r--    1 user     user             1 Dec  8 02:28 1.txt                  
-rw-r--r--    1 user     user             1 Dec  8 02:28 2.txt                  
-rw-r--r--    1 user     user             1 Dec  8 02:28 3.txt                  
drwxr-sr-x    2 root     user             0 Dec  8 03:46 .config                 
-rw-r--r--    1 root     user             1 Dec  8 03:47 initial-setup-ks.cfg   
drwxr-sr-x    2 root     user             0 Dec  8 03:47 rules 
   [1]       [2] [3]      [4]           [5]     [6]        [7]
  [权限]   [连结][拥有者] [群组]       [文件容量] [修改日期]  [档名]

ls 是 list 的意思,重点在显示文件的文件名与相关属性。而选项 -al 则表示列出所有文件详细的权限与属性(包含隐藏文件,就是文件名第一个字符为。的文件)。

文件属性示意图

第一栏代表这个文件的类型与权限,可以发现这一栏其实共有 10 个字符

文件的类型与权限内容

  • 第一个字符代表这个文件是目录、文件或者连结文件等:

    • 当为 d 则是目录,例如上面名为 .config 的那行
    • 当为 - 则是文件,例如上面名为 initial-setup-ks.cfg 那行
    • 若为 l 则表示为连结档(link file)
    • 若为 b 则表示为装置文件里面的可供存储的接口设备(可随机存储装置)
    • 若是 c 则表示装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)
  • 接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合,其中 r 表示可读、w 表示可写、x 表示可执行。要注意,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。

    • 第一组为 “文件拥有者可具备的权限”,以 initial-setup-ks.cfg 文件为例,该文件的拥有者可以读写,但不可执行
    • 第二组为 “加入此群组之账号的权限”
    • 第三组为 “非本人且没有加入本群组之其它账号的权限”

第二栏表示有多少档名连结到此节点(i-node)

每个文件都会将它的权限与属性记录到文件系统的 i-node 中,不过我们使用的目录树却是使用文件名来记录,因此每个档名就会连结到一个 i-node

第三栏表示这个文件 / 目录的拥有者账号

第四栏表示这个文件的所属群组

在 Linux 系统下,你的账号会加入一个或多个群组中比如 class1、class2、class3 属于 project-a 群租,有一个 project-b 群组,且有文件的权限为(-rwxrwx—),则 class1~3 三人对该文件都具有可读可写可执行的权限,但如果不属于 project-a 的其它账号,则就不具有任何权限

第六栏表示这个文件的建档日期或者最近的修改日期

[root@study ~]# ll /etc/services /root/initial-setup-ks.cfg
-rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
-rw-r--r--. 1 root root 1864 May 4 18:01 /root/initial-setup-ks.cfg
# 如上所示,/etc/services 为 2013 年所修改过的文件,离现在太远之故,所以只显示年份;
# 至于 /root/initial-setup-ks.cfg 是今年 (2015) 所建立的,所以就显示完整的时间了。

第七栏表示这个文件的档名

如果档名之前多一个 . ,则表示这个文件为隐藏档,你可以使用 ls 或 ls -a 来查询

# 如何改变文件属性与权限

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

假设你是 root 用户,你的目录有一个名为 initial-setup-ks.cfg 的文件,如何将该文件的群组改变一下?假设在 /etc/group 中已经存在一个名为 users 的群组,但是 testing 这个群组名字不存在 /etc/group 中,此时改变群组成为 users 与 testing 会发生什么

[root@study ~]# chgrp [-R] dirname/filename ...
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件、目录
 都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。
范例:
[root@study ~]# chgrp users initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root users 1864 May 4 18:01 initial-setup-ks.cfg
[root@study ~]# chgrp testing initial-setup-ks.cfg
chgrp: invalid group: `testing' <== 发生错误讯息啰~找不到这个群组名~
# 改变文件拥有者 chown

用户必须是已经存在系统中的账号,也就是在 /etc/passwd 这个文件中有记录的用户名称才能改变

chown 还可以顺便直接修改群组的名称,此外,如果要连目录下的所有次目录或文件同时更改文件拥有者的话,直接加上 - R 即可

[root@study ~]# chown [-R] 账号名称 文件或目录
[root@study ~]# chown [-R] 账号名称:组名 文件或目录
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更
范例:将 initial-setup-ks.cfg 的拥有者改为 bin 这个账号:
[root@study ~]# chown bin initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 bin users 1864 May 4 18:01 initial-setup-ks.cfg
范例:将 initial-setup-ks.cfg 的拥有者与群组改回为 root:
[root@study ~]# chown root:root initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg

什么时候会使用到 chown 或 chgrp 呢?比如你复制文件给你之外的其他人

[root@study ~]# cp 来源文件 目标文件

假如将.bashrc 文件拷贝成.bashrc_test 档名

[root@study ~]# cp .bashrc .bashrc_test
[root@study ~]# ls -al .bashrc*
-rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc
-rw-r--r--. 1 root root 176 Jun 3 00:04 .bashrc_test <==新文件的属性没变

由于复制行为(cp)会复制执行者的属性与权限,所以,.bashrc_test 还是属于 root,如果将该文件给其它使用者,他仍然无法修改,所以你可以通过改变权限。

# 改变权限 chmod

权限的设定方法有两种,分别可以使用数字或符号来进行权限的变更

Linux 文件的基本权限就有九个,分别是 owner/group/others 三种身份各有自己的 read/write/execute 权限

  • 数字类型改变文件权限
    • 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

[root@study ~]# chmod [-R] xyz 文件或目录
选项与参数:
xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更

如果要将.bashrc 下所有文件的权限都设定启用

[root@study ~]# ls -al .bashrc
-rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc
[root@study ~]# chmod 777 .bashrc
[root@study ~]# ls -al .bashrc
-rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc

如果要将权限变成 [-rwxr-xr–],那么权限的分数就为 [4+2+1][4+0+1][4+0+0]=754,所以只要 chmod 754 filename。

常常我们以 shell 编辑一个批处理后,它的权限通常是 - rw-rw-r–,也就是 644,如果要变为可执行文件,并且不要让他人修改,就需要 -rwxr-xr-x 这样的权限,chmod 755 test.sh

如果有些文件不希望被其他人看到,那么应该将文件的权限设定为:[-rwxr-----],chmod 740 filename。

# 符号类型改变文件权限

基本权限分别是 user、group、others 三种身份,我们可以用 u、g、o 来代替三种身份的权限,a 则代表 all,全部身份,那么读写权限就可以写成 r、w、x。

假如我们要设定一个文件的权限为 [-rwxr-xr-x] 时,基本上就是:

  • user(u):具有可读、可写、可执行的权限
  • group 与 others(g/o):具有可读可执行的权限
[root@study ~]# chmod u=rwx,go=rx .bashrc
# 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格符!
[root@study ~]# ls -al .bashrc
-rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc

如果我不知道原先的文件属性,而我只想增加.bashrc 这个文件的每个人均可写入的权限,我们可以这样

[root@study ~]# ls -al .bashrc
-rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc
[root@study ~]# chmod a+w .bashrc
[root@study ~]# ls -al .bashrc
-rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc

如果要将权限去掉而不更动其它已存在的权限,例如拿掉所有人的可执行权限

[root@study ~]# chmod a-x .bashrc
[root@study ~]# ls -al .bashrc
-rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc
[root@study ~]# chmod 644 .bashrc # 测试完毕得要改回来喔!

# 目录与文件之权限意义

前面已知道能使用 chown、chgrp、chmod 修改权限与属性,可以使用 ls -l 来查看属性

# 那么权限对于文件的重要性

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

  • r(read):可读取此文件的实际内容
  • w(write):可以编辑、新增或者修改文件的内容(但不含删除文件)
  • x(execute):该文件具有可以被执行的权限
# 权限对目录的重要性

目录主要的内容在记录文件名列表,文件名与目录有强烈的关连,针对目录时,rwx 的意义是什么?

  • r(read contents in directory):表示具有读取目录结构列表的权限,当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据,所以你就可以利用 ls 将该目录的内容显示出来
  • w(modify contents of directory):这个可写入的权限对目录来说,非常了不起,因为它表示你具有异动该目录结构列表的权限,也就是以下的权限:
    • 建立新的文件与目录
    • 删除已存在的文件与目录(不论该文件的权限如何!)
    • 将已存在的文件或目录进行更名
    • 搬移该目录内的文件、目录位置
  • x(access directory):目录的执行权限有什么用途?目录只是记录文件名而已,并不能执行,而 x 代表的是用户能否进入该目录成为工作目录的用途。所谓工作目录(work directory)就是你目前所在的目录
组件 内容 迭代物件 r w x
文件 详细资料 data 文件文件夹 读到文件内容 修改文件内容 执行文件内容
目录 档名 可分类抽屉 读到档名 修改档名 进入该目录的权限(key)

例题:有个目录的权限如下所示 drwxr–r-- 3 root root 4096 Jun 25 08:35 .ssh 系统有个账号名称为 vbird,这个账号并没有支持 root 群组,请问 vbird 对这个目录有何权限?是否可切换到此目录中?
答:vbird 对其目录具有 r 的权限,因此 vbird 可以查询此目录下的文件名列表,但 vbird 不具有 x 权限,所以 vbird 并不能切换到该目录内。

例题:假设有个账号名称为 dmtsai,他的家目录在 /home/dmtsai/,dmtsai 对此目录具有 [rwx] 的权限。 若在此目录下有个名为 the_root.data 的文件,该文件的权限如下:-rwx------ 1 root root 4365 Sep 19 23:20 the_root.data,请问 dmtsai 对此文件的权限为何?可否删除此文件?
答:由于 dmtsai 对文件来说是 others 身份,因此它无法读、写、执行,但是由于这个文件在它的家目录下,它具有此目录下 rwx 的完整权限,所以 the_root.data 文件对于它,dmtsai 用户是能够删除这个文件的。

# 用户操作功能与权限

假设有两个档名,分别为:

  • /dir1/file1
  • /dir2

现在系统使用 dmtsai 账号,那么这个账号针对 /dir1、/dir1/file1、/dir2 三个档名来说,分别需要哪些最小的权限能达成目的?

操作动作 /dir1 /dir1/file1 /dir2 重点
读取 file1 内容 x r - 要能够进入 /dir1 才能读到里面的文件数据
修改 file1 内容 x rw - 能够进入 /dir1 且修改 file1 才行
执行 file1 内容 x rx - 能够进入 /dir1 且 file1 能运作才行
删除 file1 内容 wx - - 能够进入 /dir1 具有目录修改的权限即可
将 file1 复制到 /dir2 x r wx 能够读取 file1 且能够修改 /dir2 内的数据

为什么有时候 /dir1 不必需要 r,但还是加上了,其实 r 是非必要的,只不过没有 r 的话,在你使用 tab 时,它就无法帮你补全(相当于摸黑)

# Linux 文件种类与扩展名

在我们使用 ls -l 时,观察第一栏字符,第一个字符为文件的类型。除了常见的文件(-)和目录文件(d),还有其他类型

  • 正规文件(regular file):第一个字符为 -,例如 - rwxrwxrwx,依照文件的内容,又可以分为:
    • 纯文本档(ASCII):这是 Linux 系统重最多的一种文件类型,称为纯文本档,是因为内容为我们人类可以直接读到的数据,例如数字、字母等,几乎只要我们可以用来作为设定的文件都属于这一种文件类型。例如使用 cat ~/.bashrc 就可以看到该文件的内容(cat 是将一个文件的内容读出来的指令)。
    • 二进制文件(binary):系统其实仅认识且可以执行二进制文件(binary file)吧?刚刚的 cat 指令就是一个 binary file
    • 数据格式文件(data):有些程序在运作的过程中会读取某些特定格式的文件,那些文件可以被称为数据文件(data file)。比如 Linux 在使用者登录时,都会将登录的数据记录在 /var/log/wtmp 文件内,该文件是一个 data file,它能透过 last 这个指令读出来,但使用 cat 时,会读出乱码,因为它是一个特殊格式的文件。
  • 目录(directory):就是目录啰~第一个属性为 d,例如 drwxrwxrwx。
  • 连结档(link):类型 window 的快捷方式,第一个属性为 l,例如 lrwxrwxrwx。
  • 设备与装置文件(device):与系统周边及存储等相关的一些文件,通常都集中在 /dev 目录下,通常又分为两种:
    • 区块(block)设备档:就是一些存储数据,以提供系统随机存取的接口设备,比如硬盘与软盘,你可以随机的在硬盘的不同区块读写,这种装置就是成组设备,可以查一下 /dev/sda,会发现第一个属性为 b。
    • 字符(character)设备文件:一些串行端口的接口设备,例如键盘、鼠标等,这些设备的特色就是一次性读取的,不能够截断输出,比如你不可能让鼠标跳到另一个画面,而是连续性滑动到另一个地方,第一个属性为 c。
  • 资料接口文件(sockets):既然称为数据接口文件,那么这种类型的文件通常被用在网络上的数据承接了。我们可以启动一个程序来监听客户端的请求,而客户端就可以透过这个 socket 来进行数据的沟通了。第一个属性为 s,最常在 /run 或 /tmp 这些目录中看到这种类型文件。
  • 数据传输文件(FIFO,pipe):FIFO 也是一种特殊的文件类型,它主要的目的在解决多个程序同时存取一个文件所造成的错误问题。FIFO 是 first in first out 的缩写。第一个属性为 p。

Linux 文件名的限制,最好可以避免一些特殊字符比较好,比如:* ? > <; & ! [] | \ ’ " ` ( )

# Linux 目录配置

# Linux 目录配置的依据 - FHS

根据 FHS 的标准文件指出,它们的目的是希望使用者可以了解到已安装软件通常放置于哪个目录下,所以它们希望独立的软件开发商、操作系统制作者、以及想要维护系统的用户,都能够遵守 FHS 的标准。也就是说 FHS 的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。这样的好处非常多,因为 Linux 系统能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。

上图中的目录是一些代表性的目录,先了解下那四个类型

  • 可分享的:可以分享给其它系统挂载使用的目录,所以包括执行文件与用户的邮件等数据,是能够分享给网络上其它主机挂载用的目录
  • 不可分享的:自己机器上面运作的装置文件,或者是与程序有关的 socket 文件等,由于仅与自身机器有关,所以当然就不适合分享给其它主机了
  • 不变的:有些数据是不会经常变动的,跟随着 distribution 而不变动。例如函式库、文件说明、系统管理员所管理的主机服务配置文件等
  • 可变动的:经常改变的数据,例如登录文件、一般用户可自行收受的新闻组等

事实上,FHS 针对目录树架构仅定义三层目录底层应该放置什么数据而已,分别是底下这三个目录的定义:

  • /(root,根目录):与开机系统有关
  • /usr(unix software resource):与软件安装 / 执行有关
  • /var(variable):与系统运作过程有关
目录 应放置文件内容
第一部分:FHS要求必须要存在的目录
/bin 系统有很多放置执行文件的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被操作的指令。在/bin底下的指令可以被root与一般账号所使用,主要有:cat、chmod、chown、date、mv、mkdir、cp、bash等常用指令
/boot 这个目录主要放置开机会使用到的文件,包括Linux核心文件以及开机选单与开机所需配置文件等。Linux kernel常用的档名为:vmlinuz,如果使用的是grub2这个开机管理程序,则还会存在/boot/grub2这个目录
/dev 在Linux系统上,任何装置与接口设备都是以文件的形态存在于这个目录中,只要透过存取这个目录底下的某个文件,就等于存取某个装置,比较重要的文件有/dev/null、/dev/zero、/dev/tty、/dev/loop*、/dev/sd* 等
/etc 系统主要的配置文件几乎都放置在这个目录内,例如人员的账号密码、各种服务的启始档等。一般来说,这个目录下的各文件属性是可以让一般使用者查阅的,但是只有root有权力修改。FHS建议不要放置可执行文件(binary)在这个目录中。比较重要的文件有:/etc/modprobe.d、/etc/passwd、/etc/fstab、/etc/issue等。另外FHS还规范几个重要的目录最好要存在/etc/目录下: 1. /etc/opt(必要):这个目录在放置第三方协力软件/opt的相关配置文件 2. /etc/X11(建议):与X Window有关的各种配置文件都在这里,尤其是xorg.conf这个X Server的配置文件 3. /etc/sgml(建议):与SGML格式有关的各项配置文件 4. /etc/xml(建议):与XML格式有关的各项配置文件
/lib 系统的函式库非常多,而/lib放置的则是在开机时会用到的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库而已。/lib/modules/这个目录主要放置可抽换式的核心相关的模块(驱动程序)
/media media是媒体的英文,底下放置的就是可移除的装置,包括软盘、光盘、DVD等等装置都暂时挂载于此。常见的档名又:/media/floppy、/media/cdrom
/mnt 如果想要暂时挂载某些额外的装置,一般建议你可以放置到这个目录中。在以前,这个目录的用户与/media相同,只是有了/media之后,这个目录就用来暂时挂载用了
/opt 这个是给第三方协力软件放置的目录。什么是第三方协力软件啊?举例来说,KDE这个桌面管理系统是一个独立的计划,不过他可以安装到Linux系统中,因此KDE的软件就建议放置到此目录下了。另外,如果妳想要自行安装额外的软件(非原本的 distribution 提供的),那么也能够将你的软件安装到这里来。不过,以前的Linux系统中,我们还是习惯放置在/usr/local目录下
/home 这时系统默认的用户家目录(home directory)。你在新增一个一般使用者账号时,默认的用户家目录都会规范到这里。家目录有两种代号,~:代表目前这个用户的家目录。~dmtsai:则代表dmtsai的家目录
/root 系统管理员(root)的家目录,之所以放这里,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有root的家目录,所以我们会希望root的家目录与根目录放置在同一个分区槽中

# 重点回顾

  • Linux 的每个文件中,可分别给予使用者、群组与其他人三种身份个别的 rwx 权限
  • 群组最有用的功能之一,就是当你在团队开发资源的时候,且每个账号都可以有多个群组的支持
  • 利用 ls -l 显示的文件属性中,第一个字段是文件的权限,共有十个位,第一位是文件类型,接下来三个为一组,共三组,为使用者、群组、其他人的权限,权限有 r,w,x 三种
  • 如果档名之前多一个.,则表示这个文件为隐藏档
  • 若需要 root 的权限时,可以使用 su - 这个指令来切换身份。处理完毕则使用 exit 离开 su 的指令环境
  • 更改文件的群组支持可用 chgrp,修改文件的拥有者可用 chown,修改文件的权限可用 chmod
  • chmod 修改权限的方法有两种,分别是符号法与数字法,数字法中 r、w、x 分数为 4、2、1
  • 对于文件来讲,权限的效能为:
    • r:可读取此一文件的实际内容,如读取文本文件的文字内容等
    • w:可以编辑、新增或者修改该文件的内容(但不含删除该文件)
    • x:该文件具有可以被系统执行的权限
  • 对于目录来说,权限的效能为:
    • r:read contents in directory
    • w:modify contents of directory
    • x:access directory
  • 要开放目录给任何人浏览时,应该至少也要给予 r 及 x 的权限,但 w 权限不可随便给
  • 能够读取到某个文件内容,跟该文件所在的目录权限也有关系(目录至少需要有 x 的权限)
  • Linux 档名的限制为:单一文件或目录的最大容许文件名为 255 个英文字符或 128 个汉字字符
  • 根据 FHS 的官方文件指出,它们的主要目的是希望让使用者可以了解到已安装软件通常放置于哪个目录下
  • FHS 订定出来的四种目录特点为:shareable、unshareable、static、variable 等四类
  • FHS 所定义的三层主目录为:/,/var,/usr 三层
  • 绝对路径文件名为从根目录 / 开始写起,否则都是相对路径的文件名