第7章、 Linux 档案与目录管理

7.1. 目录与路径
7.1.1. 相对路径与绝对路径
一、定义:

  • 绝对路径:路径写法『一定由根目录 / 写起』
  • 相对路径:路径写法『不是由 / 写起』,相对路径意指『相对于目前工作目录路径!』

二、绝对路径的用途
如果是在写程序 (shell scripts) 来管理系统条件下,务必使用绝对路径写法。因为绝对路径写法虽然比较麻烦,但是可以肯定这个写法绝对不会有问题。

7.1.2. 目录的相关操作: cd, pwd, mkdir, rmdir
记下来:
这里写图片描述
常见的处理目录的指令:

  1. cd:变换目录(Change Directory)
  2. pwd:显示当前目录(Print working directory)
  3. mkdir:建立一个新目录 (make directory)
  4. rmdir:删除一个空目录 (remove directory)

1.cd:变换目录
特殊目录:
这里写图片描述
cd是用来变换工作目录的指令。目录名称与cd指令之间存在一个空格。
我们的提示字符,就已经有指出当前目录了, 刚登入时会到自己的家目录,而家目录还有一个代码,那就是『 ~ 』符号!
Linux 默认指令列模式 (bash shell) 具有档案补齐功能, 要常常利用 [tab] 按键来达成你的目录完整性。

2.pwd:显示当前目录
这里写图片描述
这里写图片描述
pwd也就是显示目前所在目录的指令。
那个 -P 选项可以让我们取得正确目录名称,而不是以链接文件路径来显示的。

3.mkdir:建立一个新目录
这里写图片描述
这里写图片描述
mkdir 在预设的情况下, 需要目录得一层一层的建立才行!
现在有个更简单有效的方法是加上 -p 这个选项。
预设权限:我们可以利用 -m 来强制给予一个新的目录相关的权限, 例如上表当中,我们给予 -m 711 来给予新的目录 drwx–x–x 的权限。不过,如果没有给予 -m 选项时, 那么默认的新建目录权限又是什么呢?这个跟 umask 有关,我们在本章后头会加以介绍的。

4.rmdir:删除一个空目录
这里写图片描述
目录需要一层一层的删除才行!而且被删除的目录里面必定不能存在其他的目录或档案! 这也是所谓的空目录(empty directory)的意思!如果要将所有目录下的东西都杀掉这个时候就必须使用『 rm -r test 』!不过,还是使用 rmdir 比较不危险!也可以尝试以 -p 的选项加入,来删除上层的目录!

7.1.3. 关于执行文件路径的变量: $PATH
当我们在执行一个指令的时候,系统会依照PATH的设定去每个PATH定义的目录下搜寻文件名为ls的可执行文件, 如果在PATH定义的目录中含有多个文件名为ls的可执行文件,那么先搜寻到的同名指令先被执行!
请下达『echo $PATH』来看看到底有哪些目录被定义出来了? echo有『显示、印出』的意思,而 PATH 前面加的 $ 表示后面接的是变量,所以会显示出目前的 PATH!
这里写图片描述
PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开, 每个目录是有『顺序』之分的。仔细看一下上面的输出,你可以发现到无论是root还是vbird都有/bin 这个目录在PATH变量内,所以当然就能够在任何地方执行ls来找到/bin/ls执行档!
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
而由上面几个例题我们也可以知道几件事情:

  • 不同身份使用者预设的PATH不同,默认能够随意执行的指令也不同(如root与vbird);
  • PATH是可以修改的,所以一般使用者还是可以透过修改PATH来执行某些位于/sbin或/usr/sbin下的指令来查询;
  • 使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻PATH来的正确;
  • 指令应该要放置到正确目录下,执行才会比较方便;
  • 本目录(.)最好不要放到PATH当中。

对于PATH更详细的『变量』说明,我们会在第三篇的bash shell中详细说明!

7.2. 档案与目录管理
7.2.1. 档案与目录的检规: ls
这里写图片描述
当你只有下达 ls 时,默认显示的只有:非隐藏档的档名、 以档名进行排序及文件名代表的颜色显示如此而已。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
其实 ls 的用法还有很多,包括查阅档案所在 i-node 号码的 ls -i 选项,以及用来进行档案排序的 -S 选项,还有用来查阅不同时间的动作的 –time=atime 等选项(更多时间说明请参考本章后面touch的说明)。而这些选项的存在都是因为 Linux 文件系统记录了很多有用的信息的缘故。那么 Linux 的文件系统中,这些与权限、属性有关的数据放在 i-node 里面。
ls 最常被使用到的功能还是那个 -l 的选项,为此,很多 distribution 在预设的情况中, 已经将 ll (L 的小写) 设定成为 ls -l 的意思了!其实,那个功能是 Bash shell 的 alias 功能。也就是说,我们直接输入 ll 就等于是输入 ls -l 是一样的。

7.2.2. 复制、删除与移动: cp, rm, mv
1.cp (复制档案或目录)
这里写图片描述
复制(cp)这个指令在不同身份者执行这个指令会有不同的结果产生,尤其是那个-a, -p的选项, 对于不同身份来说,差异则非常的大!底下的练习中,有的身份为root有的身份为一般账号,开始来做复制的练习与观察:
这里写图片描述
这里写图片描述
cp 这个指令的用途:

  • 复制档案
  • 建立连结档 (快捷方式)
  • 比对两档案的新旧而予以更新
  • 复制整个目录

复制在预设的条件中, cp 的来源档与目的档的权限是不同的,目的档的拥有者通常会是指令操作者本身
由于具有这个特性,因此当我们在进行备份的时候,某些需要特别注意的特殊权限档案, 例如密码文件 (/etc/shadow) 以及一些配置文件,就不能直接以 cp 来复制,而必须要加上 -a 或者是 -p 等等可以完整复制档案权限的选项才行!另外,如果你想要复制档案给其他的使用者, 也必须要注意到档案的权限(包含读、写、执行以及档案拥有者等等), 否则,其他人还是无法针对你给予的档案进行修订的动作!
这里写图片描述
范例四使用 -l 及 -s 都会建立所谓的连结档(link file),但是这两种连结档却有不一样的情况。那个 -l 就是所谓的实体链接(hard link),至于 -s 则是符号链接(symbolic link), 简单来说,bashrc_slink 是一个『快捷方式』,这个快捷方式会连结到bashrc去!所以你会看到档名右侧会有个指向(->)的符号!
至于bashrc_hlink档案与bashrc的属性与权限完全一模一样,与尚未进行连结前的差异则是第二栏的link数由1变成2了!
这里写图片描述
这里写图片描述
这里写图片描述
总之,在复制时,你必须要清楚的了解到:

  • 是否需要完整的保留来源档案信息?
  • 来源档案是否为连结档 (symbolic link file)?
  • 来源档是否为特殊档案,例如 FIFO, socket 等?
  • 来源文件是否为目录?

2.rm (移除档案或目录)
这里写图片描述
这里写图片描述
移除的指令(remove)通常在Linux系统下,为了怕档案被误杀,所以很多distributions 都已经默认加入 -i 这个选项!而如果要连目录下的东西都一起杀掉的话, 那就要使用 -r 这个选项了!不过,使用『 rm -r 』这个指令之前,请千万注意了,因为该目录或档案『肯定』会被 root 杀掉 !因为系统不会再次询问你是否要砍掉!所以那是个超级严重指令下达!
另外,范例四的档名最好不要使用 “-” 号开头, 因为 “-” 后面接的是选项,因此,单纯的使用『 rm -aaa- 』系统指令就会误判! 那如果使用后面会谈到的正规表示法时,还是会出问题!所以,只能用避过首位字符是 “-” 的方法! 就是加上本目录『 ./ 』即可!如果 man rm 的话,其实还有一种方法,那就是『 rm – -aaa- 』也可以!

3.mv (移动档案与目录,或更名)
这里写图片描述
这里写图片描述
搬移 (move) :移动档案或目录。也可以使用 -u ( update )来测试新旧档案,看看是否需要搬移! 另外一个用途就是『变更档名 !』,我们可以很轻易的使用 mv 来变更一个档案的档名!在 Linux 才有的指令当中,有个 rename , 可以用来更改大量档案的档名。

7.2.3. 取得路径的文件名与目录名称
利用斜线 (/) 来分辨哪个是档名哪个是目录名! 取得文件名或者是目录名称,一般的用途应该是在写程序的时候,用来判断用的, 所以,这部分的指令可以用在第三篇内的 shell scripts 里头! 底下我们简单的以几个范例来谈一谈 basename 与 dirname 的用途!
这里写图片描述

7.3. 档案内容查阅:
查阅一个档案内容时各个指令的用途:

  • cat 由第一行开始显示档案内容
  • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
  • nl 显示的时候,顺道输出行号!
  • more 一页一页的显示档案内容
  • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
  • head 只看头几行
  • tail 只看尾巴几行
  • od 以二进制的方式读取档案内容!

7.3.1. 直接检规档案内容: cat, tac, nl
1.cat(concatenate)
这里写图片描述
这里写图片描述
这里写图片描述
cat 是 Concatenate (连续)的简写, 主要功能是将一个档案内容连续的印出在屏幕上面!
当你档案内容的行数超过 40 行以上,根本来不及在屏幕上看到结果! 所以,配合等一下要介绍的 more 或者是 less 来执行比较好!此外,如果是一般的 DOS 档案时,就需要特别留意一些奇奇怪怪的符号了, 例如断行与 [tab] 等,要显示出来,就得加入 -A 指类的选项了!

2.tac (反向列示)
这里写图片描述
tac 刚好是将 cat 反写过来,所以他的功能就跟 cat 相反。

3.nl (添加行号打印)
这里写图片描述
这里写图片描述
这里写图片描述
nl 可以将输出的档案内容自动加上行号!其预设的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。

7.3.2. 可翻页检规: more, less
1.more (一页一页翻动)

  • 空格键 (space):代表向下翻一页;
  • Enter :代表向下翻『一行』;
  • /字符串 :代表在这个显示的内容当中,向下搜寻『字符串』这个关键词;
  • :f :立刻显示出文件名以及目前显示的行数;
  • q :代表立刻离开 more ,不再显示该档案内容。
  • b 或 [ctrl]-b :代表往回翻页,不过这动作只对档案有用,对管线无用。

比较有用的是搜寻字符串的功能,举例来说,我们使用『 more /etc/man.config 』来观察该档案, 若想要在该档案内搜寻 MANPATH 这个字符串时,可以这样做:
这里写图片描述
如同上面的说明,输入了 / 之后,光标就会跑到最底下一行,等待你的输入, 你输入了字符串并按下[enter]之后, more 就会开始向下搜寻。而重复搜寻同一个字符串, 可以直接按下 n !最后按下 q 即可离开 !

2.less (一页一页翻动)
使用了 less 时,就可以使用[pageup] [pagedown]等按键功能来往前往后翻看文件,可以输入的指令有:

  • 空格键 :向下翻动一页;
  • [pagedown]:向下翻动一页;
  • [pageup] :向上翻动一页;
  • /字符串 :向下搜寻『字符串』的功能;
  • ?字符串 :向上搜寻『字符串』的功能;
  • n :重复前一个搜寻 (与 / 或 ? 有关!)
  • N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
  • q :离开 less 这个程序;

man这个指令就是呼叫 less 来显示说明文件的内容的!

7.3.3. 资料撷取: head, tail
head 与 tail 都是以『行』为单位来进行数据撷取的。
1.head (取出前面几行)
这里写图片描述
若没有加上 -n 这个选项时,默认只显示十行,若只要一行呢?那就加入『 head -n 1 filename 』即可!
如果接的是负数,例如上面范例的-n -100时,代表列前的所有行数, 但不包括后面100行。

2.tail (取出后面几行)
这里写图片描述
默认也是显示十行,若要显示非十行,就加 -n number的选项即可。
范例一其实与head -n -xx有异曲同工之妙。当下达『tail -n +100 /etc/man.config』 代表该档案从100行以后都会被列出来,同样的,在man.config共有141行,因此第100~141行就会被列出来! 前面的99行都不会被显示出来!
至示范例二中,由于/var/log/messages随时会有数据写入,你想要让该档案有数据写入时就立刻显示到屏幕上, 就利用 -f 这个选项,他可以一直测/var/log/messages这个档案,新加入的数据都会被显示到屏幕上。 直到按下[crtl]-c才会离开tail的侦测!
这里写图片描述

7.3.4. 非纯文本档: od
上面提到的,都是在查阅纯文本档的内容。事实上,由于执行档通常是 binary file ,使用上头提到的指令来读取他的内容时, 会产生类似乱码的数据。这时就可以利用 od 这个指令来读取了。
这里写图片描述
这里写图片描述
利用这个指令,可以将 data file 或者是 binary file 的内容数据读出来。 虽然读出来的数值预设是使用非文本文件,亦即是 16 进位的数值来显示的, 不过,我们还是可以透过 -t c 的选项与参数来将数据内的字符以 ASCII 类型的字符来显示, 对于工程师来说, 这个指令可以将 binary file 的内容作一个大致的输出,他们可以看得出东西的。
纯文本文件使用这个指令可以发现到 ASCII 与字符的对照表!例如上述的范例二,每个英文字 e 对照到的数字都是 145,转成十进制就是 101 。

7.3.5. 修改档案时间与建置新档: touch
有三个主要的变动时间:

  • modification time (mtime):
    当该档案的『内容数据』变更时,就会更新这个时间!
  • status time (ctime):
    当该档案的『状态 (status)』改变时,就会更新这个时间,例如权限与属性。
  • access time (atime):
    当『该档案的内容被取用』时,就会更新这个读取时间 (access)。

我们来看一看你自己的 /etc/man.config 这个档案的时间!
这里写图片描述
在默认的情况下,ls 显示出来的是该档案的 mtime ,也就是这个档案的内容上次被更动的时间。 那么万一我发现了一个档案来自未来,该如何让该档案的时间变成『现在』的时刻呢? 就用『touch』这个指令即可!
这里写图片描述
这里写图片描述
ll=”ls -l”。 至于分号『 ; 』则代表连续指令的下达。
至于执行的结果当中,数据的内容与属性是被复制过来的,因此档案内容时间(mtime)与原本档案相同。 但是由于这个档案是刚刚被建立的,因此状态(ctime)与读取时间就变成现在的时间了。 那如果你想要变更这个档案的时间呢?可以这样做:
这里写图片描述
透过 touch 这个指令,我们可以轻易的修订档案的日期与时间。并且也可以建立一个空的档案! 不过,即使我们复制一个档案时,复制所有的属性,但也没有办法复制 ctime 这个属性的。 ctime 可以记录这个档案最近的状态 (status) 被改变的时间。 我们平时看的文件属性中,比较重要的还是属于那个 mtime !我们关心的常常是这个档案的『内容』 是什么时候被更动的。touch 这个指令最常被使用的情况是:

  • 建立一个空的档案;
  • 将某个档案日期修订为目前 (mtime 与 atime) ;

7.4. 档案与目录的默认权限与隐藏权限
除了基本r, w, x权限外,在Linux的Ext2/Ext3文件系统下,我们还可以设定其他的系统隐藏属性, 这部份可使用 chattr 来设定,而以 lsattr 来查看,最重要的属性就是可以设定其不可修改的特性!就连档案的拥有者都不能进行修改! 这个属性可是相当重要的,尤其是在安全机制上面 (security) ! 首先,先来复习一下上一章谈到的权限概念,将底下的例题看一看先:
这里写图片描述

7.4.1. 档案预设权限:umask
基本上, umask 就是指定 『目前用户在建立档案或目录时候的权限默认值』, 他的指定条件以底下的方式来指定:
这里写图片描述
查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字型态的权限设定分数, 一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了!
在默认权限的属性上,目录与档案是不一样的。从第六章我们知道 x 权限对于目录是非常重要的! 但是一般档案的建立则不应该有执行的权限,因为一般档案通常是用在于数据的记录!当然不需要执行的权限了。 因此,预设的情况如下:

  • 若使用者建立为『档案』则预设『没有可执行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分,预设权限如下: -rw-rw-rw- ;
  • 若用户建立为『目录』,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,预设权限如下: drwxrwxrwx;

umask 的分数指的是『该默认值需要减掉的权限 !』当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉执行与写入的权限,也就是 3 分,5 分就是读与执行的权限。 如果以上面的例子来说明的话,因为 umask 为 022 ,所以 user 并没有被拿掉任何权限,不过 group 与 others 的权限被拿掉了 2 (也就是 w 这个权限),那么当使用者:

  • 建立档案时:(-rw-rw-rw-) - (—–w–w-) ==> -rw-r–r–;
  • 建立目录时:(drwxrwxrwx) - (d—-w–w-) ==> drwxr-xr-x ;

这里写图片描述

Umask的利用与重要性:专题制作
如果你跟同学在同一部主机里面工作时,因为你们两个正在进行同一个专题, 老师也帮你们两个的账号建立好了相同群组的状态,并且将 /home/class/ 目录做为你们两个人的专题目录。 想象一下,有没有可能你所制作的档案你的同学无法编辑?果真如此的话,那就伤脑筋了!
这个问题很常发生啊!举上面的案例来看就好了, 你看一下 test1 的权限是几分? 644 !意思是『如果 umask 订定为 022 ,那新建的数据只有用户自己具有 w 的权限, 同群组的人只有 r 这个可读的权限而已,并无法修改!』
所以,当我们需要新建档案给同群组的使用者共同编辑时,那么 umask 的群组就不能拿掉 2 这个 w 的权限! 所以 umask 就得要是 002 之类的才可以!这样新建的档案才能够是 -rw-rw-r—的权限模样! 那么如何设定 umask 呢?直接在 umask 后面输入 002 就好了!
这里写图片描述
所以说,这个 umask 对于新建档案与目录的默认权限是很有关系的!这个概念可以用在任何服务器上面, 尤其是未来在你架设文件服务器 (file server) ,举例来说, SAMBA Server 或者是 FTP server 时, 都是很重要的观念!这牵涉到你的使用者是否能够将档案进一步利用的问题!
在预设的情况中, root 的 umask 会拿掉比较多的属性,root 的 umask 默认是 022 , 至于一般身份使用者,通常他们的 umask 为 002 ,亦即保留同群组的写入权力! 其实,关于预设 umask 的设定可以参考 /etc/bashrc 这个档案的内容,不过,不建议修改该档案。

7.4.2. 档案隐藏属性: chattr, lsattr
底下的chattr指令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个指令了。
1.chattr (配置文件案隐藏属性)
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
由于这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性!其中,个人认为最重要的当属 +i 与 +a 这个属性了。+i 可以让一个档案无法被更动,对于需要强烈的系统安全的人来说, 真是相当的重要的!里头还有相当多的属性是需要 root 才能设定的!
此外,如果是 log file 这种的登录档,就更需要 +a 这个可以增加,但是不能修改旧有的数据与删除的参数了!未来提到登录档 (十九章) 的认知时,我们再来聊一聊如何设定他吧!

2.lsattr (显示档案隐藏属性)
这里写图片描述
使用 chattr 设定后,可以利用 lsattr 来查阅隐藏的属性。不过, 这两个指令在使用上必须要特别小心,否则会造成很大的困扰。

7.4.3. 档案特殊权限:SUID, SGID, SBIT, 权限设定
前面一直提到关于档案的重要权限,那就是 rwx 这三个读、写、执行的权限。 怎么我们的 /tmp 和 /usr/bin/passwd 怪怪的?
这里写图片描述
因为 s 与 t 这两个权限的意义与系统的账号 (第十四章)及系统的程序(process, 第十七章)较为相关, 所以等到后面的章节谈完后你才会比较有概念! 先知道s放在哪里称为SUID/SGID以及如何设定即可,等系统程序章节读完后,再回来看看!

一、Set UID
当 s 这个标志出现在档案拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个档案的权限状态:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 的特殊权限。基本上SUID有这样的限制与功能:

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

我们的 Linux 系统中,所有账号的密码都记录在 /etc/shadow 这个档案里面,这个档案的权限为:『-r——– 1 root root』,意思是这个档案仅有root可读且仅有root可以强制写入而已。 既然这个档案仅有 root 可以修改,那么一般账号使用者怎么能自行修改自己的密码呢? 这就是 SUID 的功能!藉由上述的功能说明,我们可以知道 :

  1. vbird 对于 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 vbird 能执行 passwd;
  2. passwd 的拥有者是 root 这个账号;
  3. vbird 执行 passwd 的过程中,会『暂时』获得 root 的权限
  4. /etc/shadow 就可以被 vbird 所执行的 passwd 所修改

但如果 vbird 使用 cat 去读取 /etc/shadow 时,他能够读取吗?因为 cat 不具有 SUID 的权限,所以 vbird 执行 『cat /etc/shadow』 时,是不能读取 /etc/shadow 的。我们用一张示意图来说明如下:
这里写图片描述
另外,SUID 仅可用在binary program 上, 不能够用在 shell script 上面 !这是因为 shell script 只是将很多的 binary 执行档叫进来执行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的设定, 而不是 shell script 本身。当然,SUID 对于目录也是无效的。

二、Set GID
当 s 标志在档案拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID 。 你可以用底下的指令来观察到具有 SGID 权限的档案:
这里写图片描述
与 SUID 不同的是,SGID 可以针对档案或目录来设定!如果是对档案来说, SGID 有如下的功能:

  • SGID对二进制程序有用;
  • 程序执行者对于该程序来说,需具备 x 的权限;
  • 执行者在执行的过程中将会获得该程序群组的支持!

上面的 /usr/bin/locate 这个程序可以去搜寻 /var/lib/mlocate/mlocate.db 这个档案的内容 (详细说明会在下节讲述), mlocate.db 的权限如下:
这里写图片描述
与 SUID 非常的类似,若我使用 vbird 这个账号去执行 locate 时,那 vbird 将会取得 slocate 群组的支持, 因此就能够去读取 mlocate.db !
除了 binary program 之外,事实上 SGID 也能够用在目录上, 当一个目录设定了 SGID 的权限后,他将具有如下的功能:

  1. 用户若对于此目录具有 rx 的权限时,该用户能够进入此目录;
  2. 用户在此目录下的有效群组(effective group)将会变成该目录的群组
  3. 用途:若用户在此目录下具有 w 的权限(可以新建档案),则使用者所建立的新档案,该新档案的群组与此目录的群组相同

SGID 对于项目开发来说是非常重要的!因为这涉及群组权限的问题,您可以参考一下本章后续情境模拟的案例!

三、 Sticky Bit
这个 Sticky Bit, SBIT 目前只针对目录有效,对于档案已经没有效果了。 SBIT 对于目录的作用是:

  1. 当用户对于此目录具有 w, x 权限,亦即具有写入的权限时;
  2. 当用户在该目录下建立档案或目录时,仅有自己与 root 才有权力删除该档案 。

换句话说:当甲这个用户于 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示『甲用户对该目录内任何人建立的目录或档案均可进行 “删除/更名/搬移” 等动作。』 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己建立的档案或目录进行删除/更名/移动等动作,而无法删除他人的档案。
举例来说,我们的 /tmp 本身的权限是『drwxrwxrwt』, 在这样的权限内容下,任何人都可以在 /tmp 内新增、修改档案,但仅有该档案/目录建立者与 root 能够删除自己的目录或档案。这个特性也是挺重要的啊!你可以这样做个简单的测试:

  1. 以 root 登入系统,并且进入 /tmp 当中;
  2. touch test,并且更改 test 权限成为 777 ;
  3. 以一般使用者登入,并进入 /tmp;
  4. 尝试删除 test 这个档案!

由于 SUID/SGID/SBIT 牵涉到程序的概念,因此再次强调,这部份的数据在您读完第十七章关于程序方面的知识后,要再次的回来瞧瞧!

四、SUID/SGID/SBIT 权限设定
前面介绍过 SUID 与 SGID 的功能,那么如何配置文件案使成为具有 SUID 与 SGID 的权限呢? 这就需要第六章的数字更改权限的方法了! 现在你应该已经知道数字型态更改权限的方式为『三个数字』的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!

  • 4为 SUID
  • 2为 SGID
  • 1为 SBIT

假设要将一个档案权限改为『-rwsr-xr-x』时,由于 s 在用户权力中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来设定!此外,还有大 S 与大 T 的产生。
注意:底下的范例只是练习而已,所以我使用同一个档案来设定,你必须了解 SUID 不是用在目录上,而 SBIT 不是用在档案上的!
这里写图片描述
最后一个例子怎么会出现大写的 S 与 T 呢?不都是小写的吗? 因为 s 与 t 都是取代 x 这个权限的,我们是下达 7666 ! user, group 以及 others 都没有 x 这个可执行的标志( 因为 666 嘛 ),所以,这个 S, T 代表的就是『空的』! SUID 是表示『该档案在执行的时候,具有档案拥有者的权限』,但是档案拥有者都无法执行了,哪里来的权限给其他人使用?当然就是空的!
而除了数字法之外,你也可以透过符号法来处理!其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t !来看看如下的范例:
这里写图片描述

7.4.4. 观察文件类型:file
如果你想要知道某个档案的基本数据,例如是属于 ASCII 或者是 data 档案,或者是 binary , 且其中有没有使用到动态函式库 (share library) 等等的信息,就可以利用 file 这个指令来检阅!
这里写图片描述
透过这个指令,我们可以简单的先判断这个档案的格式!

7.5. 指令与档案的搜寻:
有些时候某些软件配置文件的文件名是不变的,但是各 distribution 放置的目录则不同。 此时就得要利用一些搜寻指令将该配置文件的完整档名捉出来,这样才能修改!

7.5.1. 脚本文件名搜寻:which
想知道这些指令的完整文件名放在哪里?就透过 which 或 type 来找寻!
which (寻找『执行档』)
这里写图片描述
这里写图片描述
这里写图片描述
这个指令是根据『PATH』这个环境变量所规范的路径,去搜寻『执行档』的档名。 所以,重点是找出『执行档』而已!且 which 后面接的是『完整档名』!若加上 -a 选项,则可以列出所有的可以找到的同名执行文件,而非仅显示第一个而已!
怎么 cd 这个常用的指令竟然找不到啊!这是因为 cd 是『bash 内建的指令』! 但是 which 预设是找 PATH 内所规范的目录,所以当然一定找不到的!那怎么办?我们可以透过 type 这个指令! 关于 type 的用法我们将在 第十一章的 bash 再来谈!

7.5.2. 档案档名搜寻:whereis, locate, find
通常 find 不很常用的!因为速度慢之外, 也很操硬盘!通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻! 因为 whereis 与 locate 是利用数据库来搜寻数据,所以相当的快速,且并没有实际的搜寻硬盘, 比较省时间!

1.whereis (寻找特定档案)
这里写图片描述
这里写图片描述
find 是很强大的搜寻指令,但时间花用的很大! (因为 find 是直接搜寻硬盘,如果你的硬盘比较老旧的话,有等拉!) 这个时候 whereis 就相当的好用了!另外, whereis 可以加入选项来找寻相关的数据, 例如如果你是要找可执行文件( binary )那么加上 -b 就可以! 如果不加任何选项的话,那么就将所有的数据列出来!
Linux 系统会将系统内的所有档案都记录在一个数据库档案里面, 而当使用 whereis 或者是底下要说的 locate 时,都会以此数据库档案的内容为准, 因此,有的时候你还会发现使用这两个执行档时,会找到已经被杀掉的档案! 而且也找不到最新的刚刚建立的档案!这就是因为这两个指令是由数据库当中的结果去搜寻档案的所在!

2.locate
这里写图片描述
直接在后面输入『档案的部分名称』后,就能够得到结果。 举上面的例子来说,我输入 locate passwd ,那么在完整文件名 (包含路径名称) 当中,只要有 passwd 在其中, 就会被显示出来的!如果你忘记某个档案的完整档名,这也是个很方便好用的指令。
但是,这个东西还是有使用上的限制!你会发现使用 locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由『已建立的数据库 /var/lib/mlocate/』 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据, 限制就是因为他是经由数据库来搜寻的,而数据库的建立默认是在每天执行一次 (每个 distribution 都不同,CentOS 5.x 是每天更新数据库一次!),所以当你新建立起来的档案, 即还在数据库更新之前搜寻该档案,那么 locate 会告诉你『找不到!』
那能否手动更新数据库就是直接输入『 updatedb 』就可以了! updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设定,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库档案!因为 updatedb 会去搜寻硬盘,所以当你执行 updatedb 时,可能会等待数分钟的时间!

  • updatedb:根据 /etc/updatedb.conf 的设定去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库档案;
  • locate:依据 /var/lib/mlocate 内的数据库记载,找出用户输入的关键词文件名。

3.find
这里写图片描述
我们现在知道 atime, ctime 与 mtime 的意义,如果你想要找出一天内被更动过的文件名, 可以使用上述范例一的作法。但如果我想要找出『4天内被更动过的档案档名』呢?那可以使用『 find /var -mtime -4 』。那如果是『4天前的那一天』就用『 find /var -mtime 4 』。有没有加上『+, -』差别很大喔!我们可以用简单的图示来说明一下:
这里写图片描述
图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图5.2.1我们可以清楚的知道:

  • +4代表大于等于5天前的档名:ex> find /var -mtime +4
  • -4代表小于等于4天内的档案档名:ex> find /var -mtime -4
  • 4则是代表4-5那一天的档案档名:ex> find /var -mtime 4

这里写图片描述
这里写图片描述
如果你想要找出某个用户在系统底下建立了啥咚咚,使用上述的选项与参数,就能够找出来! 至于那个 -nouser 或 -nogroup 的选项功能中,除了你自行由网络上面下载文件时会发生之外, 如果你将系统里面某个账号删除了,但是该账号已经在系统内建立很多档案时,就可能会发生无主孤魂的档案存在! 此时你就得使用这个 -nouser 来找出该类型的档案!
这里写图片描述
这里写图片描述
上述范例中比较有趣的就属 -perm 这个选项!他的重点在找出特殊权限的档案! 我们知道 SUID 与 SGID 都可以设定在二进制程序上,假设我想要找出来/bin, /sbin 这两个目录下, 只要具有 SUID 或 SGID 就列出来该档案,你可以这样做:
这里写图片描述
因为 SUID 是 4 分,SGID 2 分,总共为 6 分,因此可用 +6000 来处理这个权限! 至于 find 后面可以接多个目录进行搜寻!另外, find 本来就会搜寻次目录,这个特色也要特别注意! 最后,我们再来看一下 find 还有什么特殊功能!
这里写图片描述
find 的特殊功能就是能够进行额外的动作(action)。我们将范例八的例子以图解来说明如下:
这里写图片描述
该范例中特殊的地方有 {} 以及 \; 还有 -exec 这个关键词,这些东西的意义为:

  • {} 代表的是『由 find 找到的内容』,如上图所示,find 的结果会被放置到 {} 位置中;
  • -exec 一直到 \; 是关键词,代表 find 额外动作的开始 (-exec) 到结束 (\;) ,在这中间的就是 find 指令内的额外动作。 在本例中就是『 ls -l {} 』!
  • 因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜杠来跳脱。

如果你要找的档案是具有特殊属性的,例如 SUID 、档案拥有者、档案大小等等, 那么利用 locate 是没有办法达成你的搜寻的!此时 find 就显的很重要! 另外,find 还可以利用通配符来找寻档名!举例来说,你想要找出 /etc 底下档名包含httpd 的档案, 那么你就可以这样做:
这里写图片描述
不但可以指定搜寻的目录(连同次目录),并且可以利用额外的选项与参数来找到最正确的档名!真是好好用! 不过由于 find 在寻找数据的时后相当的操硬盘!所以没事情不要使用 find 。

7.6. 极重要!权限与指令间的关系:
我们就将这两者结合起来,说明一下什么指令在什么样的权限下才能够运作吧!

一、让用户能进入某目录成为『可工作目录』的基本权限为何:

  1. 可使用的指令:例如 cd 等变换工作目录的指令;
  2. 目录所需权限:用户对这个目录至少需要具有 x 的权限;
  3. 额外需求:如果用户想要在这个目录内利用 ls 查阅文件名,则用户对此目录还需要 r 的权限。

二、用户在某个目录内读取一个档案的基本权限为何?

  1. 可使用的指令:例如本章谈到的 cat, more, less等等 ;
  2. 目录所需权限:用户对这个目录至少需要具有 x 权限;
  3. 档案所需权限:使用者对档案至少需要具有 r 的权限才行!

三、让使用者可以修改一个档案的基本权限为何?

  1. 可使用的指令:例如 nano 或未来要介绍的 vi 编辑器等;
  2. 目录所需权限:用户在该档案所在的目录至少要有 x 权限;
  3. 档案所需权限:使用者对该档案至少要有 r, w 权限 ;

四、让一个使用者可以建立一个档案的基本权限为何?

  1. 目录所需权限:用户在该目录要具有 w,x 的权限,重点在 w 啦!

五、让用户进入某目录并执行该目录下的某个指令的基本权限为何?

  1. 目录所需权限:用户在该目录至少要有 x 的权限;
  2. 档案所需权限:使用者在该档案至少需要有 x 的权限 ;

这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/kk53976047/article/details/78921066