Linux档案权限与目录配置

查看档案

『ls 』可查看档案权限!以 root 的身份登入 Linux 后,下达『ls -Al 』看
看,会看到底下的几个咚咚:

[root@localhost ~]# ls -Al
总用量 92
-rw-------. 1 root root  1749 1月   6 2017 anaconda-ks.cfg
-rw-------. 1 root root 19934 5月  25 18:04 .bash_history
-rw-r--r--. 1 root root    18 12月 29 2013 .bash_logout
-rw-r--r--. 1 root root   176 12月 29 2013 .bash_profile
-rw-r--r--  1 root root  2031 5月  23 2017 .bashrc
drwxr-xr-x. 3 root root    17 1月   6 2017 .cache
-rw-r--r--  1 root root  2573 12月  6 2016 Centos-7.repo
drwxr-xr-x. 3 root root    17 1月   6 2017 .config
-rw-r--r--. 1 root root   100 12月 29 2013 .cshrc
drwx------  2 root root    24 1月   7 2017 .docker
-rw-r--r--  1 root root    12 3月  22 14:05 index.html?release=7
drwxr-xr-x  3 root root    18 12月  4 20:36 .java
-rw-------  1 root root 12495 5月  22 13:43 .mysql_history
drwxr-xr-x  2 root root    39 1月  18 2017 .oracle_jre_usage
drwxr-----. 3 root root    18 1月   7 2017 .pki
-rw-------  1 root root   786 5月  25 16:50 .rediscli_history
drwx------  2 root root    24 1月   8 2017 .ssh
-rw-r--r--. 1 root root   129 12月 29 2013 .tcshrc
-rw-------  1 root root  9462 5月  29 11:30 .viminfo
-rw-r--r--. 1 root root  5052 1月   6 2017 wget-log

ls 是『list』的意思,重点在显示档案的文件名的相关属性。而选顷『-Al』则表示列出所有的档案详细的权限与属性 (包含隐藏文件,就是文件名第一个字符为『. 』的档案)。如上所示,在你第一次以 root身份登入 Linux 时, 如果你输入上述命令后,应该有上列的几个东西,先解释一下上面七个字段个别的意思:


Linux档案权限与目录配置_第1张图片
文件属性示意图.jpg
  • 第一栏代表这个档案的类型与权限(permission)。
    这个地方最需要注意了!仔细看的话,你应该可以发现这一栏其实共有十个字符:


    Linux档案权限与目录配置_第2张图片
    档案类型与权限内容.jpg
  1. 第一个字符代表这个档案是『目录价、档案或链接文件等等』:
    当为[ d ]则是目录,例如上表档名为『.cache』的那一行;
    当为[ - ]则是档案,例如上表档名为『.bash_logout』那一行;
    若是[ l ]则表示为链接文档link file);
    若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
    若是[ c ]则表示为装置文件里面的串行端口讴备,例如键盘、鼠标(一次怅读取装置)。
  2. 接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、 [ w ]代表可写(write)、 [ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
  3. 第一组为『档案拥有者的权限』,以『bash_logout.log』那个档案为例, 该档案的拥有者可以读写,但不可执行;
  4. 第事组为『同群组的权限』;
  5. 第三组为『其他非本群组的权限』。
  • 第二栏表示有多少文档名连结到此节点(i-node):
    每个档案都会将他的权限与属性记录到文件系统的 i-node 中,我们使用的目录树却是使用文件名来记录, 因此每个档名就会连结到一个 i-node 啰!这个属性记录的,就是有多少不同的档名连结到相同的一个 i-node 号码去就是了。
  • 第三栏表示这个档案(或目彔)的『拥有者账号』。
  • 第四栏表示这个档案的所属群组。
  • 第五栏为这个档案的容量大小,默讣单位为 bytes。
  • 第六栏为这个档案的建档日期或者是最近的修改日期。
[root@localhost ~]# ls -Al --full-time
总用量 92
-rw-------. 1 root root  1749 2017-01-06 09:01:50.976973219 +0800 anaconda-ks.cfg
-rw-------. 1 root root 19934 2018-05-25 18:04:26.548241405 +0800 .bash_history
-rw-r--r--. 1 root root    18 2013-12-29 10:26:31.000000000 +0800 .bash_logout
-rw-r--r--. 1 root root   176 2013-12-29 10:26:31.000000000 +0800 .bash_profile
-rw-r--r--  1 root root  2031 2017-05-23 11:08:50.942009054 +0800 .bashrc
drwxr-xr-x. 3 root root    17 2017-01-06 17:33:20.578862846 +0800 .cache
-rw-r--r--  1 root root  2573 2016-12-06 20:36:59.000000000 +0800 Centos-7.repo
drwxr-xr-x. 3 root root    17 2017-01-06 17:33:20.592862945 +0800 .config
-rw-r--r--. 1 root root   100 2013-12-29 10:26:31.000000000 +0800 .cshrc
drwx------  2 root root    24 2017-01-07 12:31:19.645243987 +0800 .docker
-rw-r--r--  1 root root    12 2018-03-22 14:05:10.846946486 +0800 index.html?release=7
drwxr-xr-x  3 root root    18 2017-12-04 20:36:04.875727278 +0800 .java
-rw-------  1 root root 12495 2018-05-22 13:43:06.878454015 +0800 .mysql_history
drwxr-xr-x  2 root root    39 2017-01-18 11:20:54.304297351 +0800 .oracle_jre_usage
drwxr-----. 3 root root    18 2017-01-07 10:36:27.540588216 +0800 .pki
-rw-------  1 root root   786 2018-05-25 16:50:36.418229328 +0800 .rediscli_history
drwx------  2 root root    24 2017-01-08 14:40:42.877009418 +0800 .ssh
-rw-r--r--. 1 root root   129 2013-12-29 10:26:31.000000000 +0800 .tcshrc
-rw-------  1 root root  9462 2018-05-29 11:30:26.335407337 +0800 .viminfo
-rw-r--r--. 1 root root  5052 2017-01-06 23:04:00.781524184 +0800 wget-log
  • 第七栏为这个档案的名称
    这个字段就是档名了。比较特殊的是:如果档名前多一个『. 』,则代表这个档案为『隐藏档』 。

改变文件属性与权限

我们现在知道档案权限对一个系统的安全重要性,也知道档案的权限对于使用者与群组的相关性,那么如何修改一个档案的属性与权限呢?又!有多少档案的权限我们可以修改呢? 我们先介绍几个常用于群组、拥有者、各种身份的权限修改的命令,如下所示:
chgrp :改变档案所属群组
chown :改变档案拥有者
chmod :改变档案的权限, SUID, SGID, SBIT 等等的特性
下面着重说明改变档案权限的用法,即chmod命令:
权限的设定方法有两种, 分别可以使用数字或者是符号改变权限。

  1. 数字类型改变档案权限
    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)的持续变更,亦即连同次目彔下的所有档案都会变更
  1. 符号类型改变档案权限
    还有一个改变权限的方法呦!前面的介绍中我们可以发现,基本上就九个权限分别是(1)user(2)group (3)others 三种身份啦!那举我们就可以藉由 u, g, o 来代表三种身份的权限!此外,a 则代表 all 亦即全部的身份!那么读写的权限就可以写成 r, w, x 啰!也就是可以使用底下的方式来看:
chmod u\g\o\a(全部) +(加入)\-(除去)\=(设定) r\w\x 档案或目录

来实操一下吧!假如我们要『设定定』一个档案的权限成为『-rwxr-xr-x』时,基本上就是:

user (u):具有可读、可写、可执行的权限;
group 与 others (g/o):具有可读不执行的权限
[root@localhost wwwroot]# chmod u=rwx,go=rx data_run.sh 
[root@localhost wwwroot]# ls -Al data_run.sh 
-rwxr-xr-x 1 root root 352 2月   3 2017 data_run.sh

此外,如果我不知道原先的文件属性,而我只想要增加data_run.sh这个档案的每个人均可写入的权限, 那举我就可以使用:

[root@localhost wwwroot]# chmod a+w data_run.sh 
[root@localhost wwwroot]# ls -Al data_run.sh 
-rwxrwxrwx 1 root root 352 2月   3 2017 data_run.sh

而如果是要将权限去掉而不更改其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:

[root@localhost wwwroot]# chmod a-x data_run.sh
[root@localhost wwwroot]# ls -Al data_run.sh 
-rw-rw-rw- 1 root root 352 2月   3 2017 data_run.sh

特别说明:
x (access directory):
目录的执行权限有啥用途啊?目录只是记录文件名而已,总不能拿来执行吧?没错!目录不可以被执行,目录的 x 代表的是用户能否进入该目录成为工作目录的用途! 所谓的工作目录(work directory)就是你目前所在的目录啦!举例来说,当你登入 Linux 时, 你所在的家目录就是你当下的工作目录。而变换目录的命令是『cd』 (change directory)啰。

Linux 档案种类

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

  1. 正规档案(regular file ):
    在由 ls -al 所显示出来的属性方面,第一个字符为 [-],例如 [-rwxrwxrwx ]。另外,依照档案的内容,又大致可以分为:
    纯文本档(ASCII)
    二进制文件(binary)
    数据格式文件(data)
  2. 目录(directory)
  3. 连结档(link):
    就是类似 Windows 系统底下的快捷方式啦! 第一个属性为 [ l ](英文 L 的小写)。
  4. 讴备与装置文件(device):
    与系统周边及储存等相关的一些档案, 通常都集中在/dev 这个目彔下!通常又分为两种:
    第一、 区块(block)设备档 :就是一些储存数据,以提供系统随机存取的接口设备,距离来说,硬盘与软盘等就是啦! 你可以随机的在硬盘的不同区块读写,这种装置就是成组设备啰!你可以自行查一下/dev/sda 看看, 会发现第一个属怅为[ b ]喔!
    喔!
    第二、 字符(character)设备文件:亦即是一些串行端口的接口讴备, 例如键盘、鼠标等等!这些讴备的特色就是『一次性读取』的,不能够截断输出。 举例来说,你不可能让鼠标『跳到』另一个画面,而是『滑动』到另一个地方啊!第一个属性为 [ c ]。
  5. 资料接口文件(sockets):
    既然被称为数据接口文件,这种类型的档案通常被用在网络上的数据承接了。我们可以启动一个程序来监听客户端的要求,而客户端就可以透过这个 socket 进行数据的沟通。第一个属性为 [ s ], 最常在/var/run 这个目录中看到这种文件类型了。
  6. 数据输送文件(FIFO, pipe):
    FIFO 也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个档案所造成的错误问题。 FIFO 是 first-in-first-out 的缩写。第一个属怅为[p] 。

Linux文件扩展名

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

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

  • *.sh : 脚本或批处理文件 (scripts),因为批处理文件为使用 shell 写成的,所以扩展名就编成 .sh ;
  • *Z, *.tar, *.tar.gz, *.zip, *.tgz: 经过打包的压缩文件。这是因为压缩软件分别为 gunzip, tar 等,由于不同的压缩软件,而取其相关的扩展名啰!
  • *.html, *.php:网页相关档案,分别代表 HTML 语法与 PHP 语法的网页档案!.html 的档案可使用网页浏觅器来直接打开,至于 .php 的档案, 则可以透过 client 端的浏觅器来 server 端浏觅,以得到运算后的网页结果呢!
    基本上,Linux 系统上的文件名真的只是了解该档案可能的用途而已, 真正的执行与否仍然需要权限的规范才行!

Linux 目录配置的依据--FHS

可分享的(shareable) 丌可分享的(unshareable)
不变的(static) /usr (软件放置处) /etc (配置文件)
/opt (第三方协议软件) /boot (开机不核心档)
可变劢的(variable) /var/mail (使用者邮件信箱) /var/run (程序相关)
/var/spool/news (新闻组) /var/lock (程序相关)

因为利用 Linux 来开发产品或distributions 的社群/公司不个人实在太多了, 如果每个人都用自己的想法来配置档案放置的目录,那么将可能造成很多管理上的困扰。 你能想象,你进入一个企业后,所接触到的 Linux 目录配置方法竟然跟你以前学的完全不同吗? 所以,后来就有所谓的Filesystem Hierarchy Standard (FHS)标准的出炉了。
事实上,FHS是根据过去的经验一直再持续的改版的,FHS 将目录定义成为四种交互作用的形态,用表格来说有点像底下这样:

可分享的(shareable) 丌可分享的(unshareable)
不变的(static) /usr (软件放置处) /etc (配置文件)
/opt (第三方协议软件) /boot (开机不核心档)
可变劢的(variable) /var/mail (使用者邮件信箱) /var/run (程序相关)
/var/spool/news (新闻组) /var/lock (程序相关)

上表中的目录就是一些代表性的目录,什么是那四个类型?

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

事实上,FHS 针对目彔树架构仅定义出三层目录底下应该放置什么数据而已,分别是底下这三个目录的定义:
/ (root, 根目彔):与开机系统有关;
/usr (unix software resource):与软件安装/执行有关;
/var (variable):与系统运作过程有关。

根目录 (/) 的意义与内容:
FHS 标准建议:根目录(/)所在分割槽应该越小越好, 且应用程序所安装的软件最好与要与根目录放在同一个分割槽内,保持根目录越小越好。 如此不但效能较佳,根目录所在的文件系统也较不容易发生问题。

鉴于上述说明,因此 FHS 定义出根目录(/)底下应该要有这些次目录的存在才好:

目录 应放置档案内容
/bin 系统有很多放置执行文件的目录,但/bin比较特殊。因为/bin 放置的是在单人维护模式下还能够被操作的命令。 在/bin 底下的命令可以被 root与一般账号所使用,主要有:cat, chmod, chown, date, mv, mkdir, cp, bash 等等常用的挃令。
/root 这个目录主要放置开机会使用到的档案,包括 Linux 核心档案以及开机选单与开机所需配置文件等等。Linux kernel 常用的档名为vmlinuz,如果使用的是 grub 这个开机管理程序, 则还会存在/boot/grub/这个目彔喔!
/dev 在 Linux 系统上,任何装置与接口设备都是以档案的型态存在这个目录当中的。 你只要透过存取这个目录底下的某个档案,就等于存取某个装置啰~ 比要重要的档案有/dev/null, /dev/zero, /dev/tty, /dev/lp, /dev/hd, dev/sd*等等
/etc 系统主要的配置文件几乎都放置在这个目录内,例如人员的账号密码文件、 各种服务的启动文档等等。一般来说,这个目录下的各文件属性是可以让一般使用者查阅的, 但是只有 root 有权力修改。 FHS 建议不要放置可执行文件(binary)在这个目彔中喔。比较重要的档案有: /etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11/,/etc/fstab, /etc/sysconfig/ 等等。另外,其下重要的目录有:
1. /etc/init.d/:所有朋务的预设启动script 都是放在这里的,例如要启动或者关闭 iptables 的话:『/etc/init.d/iptables start』、『/etc/init.d/iptables stop』
2. /etc/xinetd.d/:这就是所谓的 super daemon 管理的各项服务的配置文件目录。
3. /etc/X11/:与X Window有关的各种配置文件都在这里,尤其是 xorg.conf这个 X Server 的配置文件。
/home 这是系统默认的用户家目录(home directory)。在你新增一个一般使用者账号时, 默认的用户家目录都会规范到这里来。比较重要的是,家目录有两种代号喔:
~:代表目前这个用户的家目彔.
~dmtsai :则代表 dmtsai 的家目彔!
/lib 系统的函式库非常的多,而/lib 放置的则是在开机时会用到的函式库, 以及在/bin或/sbin 底下的命令会呼叫的函式库而已。什么是函式库呢?妳可以将他想成是『外挂』,某些命令必项要有这些『外挂』才能够顺利完成程序的执行。 尤其重要的是/lib/modules/这个目录, 因为该目录会放置核心相关的模块(驱动程序)喔!
/media media 是『媒体』的英文,这个/media 底下放置的就是可移除的装置啦! 包括软盘、光盘、 DVD 等等装置都暂时挂载于此。常见的档名有:/media/floppy, /media/cdrom 等等。
/mnt 如果你想要暂时挂载某些额外的装置,一般建议你可以放置到这个目录中。 在更早的时候,这个目录的用途与/media 相同啦!只是有了/media 之后,这个目录就用来暂时挂载用了。
/opt 这个是给第三方协力软件放置的目彔。什么是第三方协力软件啊? 举例来说,KDE这个桌面管理系统是一个独立的计划,不过他可以安装到 Linux 系统中,因此 KDE的软件就建议放置到此目录下了。 另外,如果你想要自行安装额外的软件(非原本的distribution 提供的),那么也能够将你的软件安装到这里来。 在以前的 Linux 系统中,我们还是习惯放置在/usr/local 目彔下呢!
/root 系统管理员(root)的家目录。之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时, 该目录就能够拥有 root 的家目录,所以我们会希服 root 的家目录与根目录放置在同一个分割槽中。
/sbin Linux 有非常多命令用来设定系统环境的,这些命令只有 root 能够利用来『设定』系统,其他用户最多只能用来『查询』而已。 放在/sbin 底下的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的命令。 至于某些服务器软件程序,一般则放置到/usr/sbin/当中。本机自行安装的软件所产生的系统执行文件(system binary), 则放置到/usr/local/sbin/当中了。常见的命令包括:fdisk, fsck,ifconfig, init, mkfs 等等。
/srv srv 可以规为『service』的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录。 常见的服务例如 WWW, FTP 等等。举例来说,WWW 服务器需要的网页资料就可以放置在/srv/www/里面。
/tmp 这是让一般用户或正在执行的程序暂时放置档案的地方。 这个目录是任何人都能够存取的,所以你需要定期的清理一下。当然,重要数据不可放置在此目录! 因为FHS 甚至建议在开机时,应该要将/tmp 下的数据都删除!

事实上 FHS 针对根目录所定义的标准就仅有上面的咚咚,不过我们的 Linux 底下还有讲多目录你也需要了解一下的。 底下是几个在 Linux 当中也是非常重要的目录喔:

目录 应放置档案内容
/lost+found 这个目录是使用标准的 ext2/ext3 文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下。这个目录通常会在分割槽的最顶层存在, 例如你加装一颗硬盘于/disk 中,那在这个系统下就会自动产生一个这样的目彔『/disk/lost+found』
/porc 这个目录本身是一个『虚拟文件系统(virtual filesystem)』喔!他放置的数据都是在内存当中, 例如系统核心、进程信息(process)、周边装置的状态及网络状态等等。因为这个目录下的数据都是在内存当中, 所以本身不占任何硬盘空间啊!比较重要的档案例如:/proc/cpuinfo, /proc/dma, /proc/interrupts,/proc/ioports, /proc/net/* 等等。
/sys 这个目录其实跟/proc非常类似,也是一个虚拟的文件系统,主要也是记录与核心相关的信息。 包括目前已加载的内核模块与内核侦测到的硬件装置信息等等。这个目录同样不占硬盘容量喔!

因为根目录与开机有关,开机过程中仅有根目录会被挂载, 其他分割槽则是在开机完成之后才会持续的进行挂载的行为。就是因为如此,因此根目录下与开
机过程有关的目录, 就不能够与根目彔放到不同的分割槽去!那哪些目录不可与根目录分开呢?有底下这些:

  • /etc:配置文件
  • /bin:重要执行档
  • /dev:所需要的装置档案
  • /lib:执行档所需的函式库不核心所需的模块
  • /sbin:重要的系统执行文件

这五个目录千万不可与根目录分开在不同的分割槽!请背下来啊! 好了,谈完了根目录,接下来我们就来谈谈/usr 以及/var 啰!先看/usr 里面有些什么东西:
usr 是 Unix Software Resource 的缩写, 也就是『Unix操作系统软件资源』所放置的目录,而不是用户的数据啦!这点要注意。 FHS 建议所有软件开发者,应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。
如果/usr 是安装时会占用较大硬盘容量的目录,那么/var 就是在系统运作后才会渐渐占用硬盘容量的目录。 因为/var目录主要针对常态性变动的档案,包括快取(cache)、登录档(log file)以及某些软件运作所产生的档案, 包括程序档案(lock file, run file),戒者例如 MySQL 数据库的档案等等。

如果我们将整个目录树以图标的方法来显示,将较为重要的档案数据列出来的话,那举目录树架构有点像这样:


Linux档案权限与目录配置_第3张图片
Linux目录结构图.jpg

你可能感兴趣的:(Linux档案权限与目录配置)