文档档名搜寻
whereis (由一些特定的目录中寻找档案档名)
whereis 只找几个特定的目录而已~并没有全系统去查询之故。所以说,whereis 主要是针对/bin /sbin 底下的执行档, 以及/usr/share/man 底下的man page 档案,跟几个比较特定的目录来处理而已。所以速度当然快的多!不过,就有某些档案是你找不到的啦!想要知道whereis 到底查了多少目录?可以使用whereis -l 来确认一下即可!
locate / updatedb
这个locate 的使用更简单,直接在后面输入『档案的部分名称』后,就能够得到结果。举上面的例子来说,我输入locate passwd ,那么在完整档名(包含路径名称) 当中,只要有passwd 在其中, 就会被显示出来的!
因为他是经由资料库来搜寻的,而资料库的建立预设是在每天执行一次(每个distribution 都不同,CentOS 7.x 是每天更新资料库一次!),所以当你新建立起来的档案, 却还在资料库更新之前搜寻该档案,那么locate 会告诉你『找不到!』呵呵!因为必须要更新资料库呀!
那能否手动更新资料库哪?当然可以啊!更新locate 资料库的方法非常简单,直接输入『 updatedb 』就可以了!updatedb 指令会去读取/etc/updatedb.conf 这个设定档的设定,然后再去硬碟里面进行搜寻档名的动作, 最后就更新整个资料库档案啰!因为updatedb 会去搜寻硬碟,所以当你执行updatedb 时,可能会等待数分钟
- updatedb:根据/etc/updatedb.conf 的设定去搜寻系统硬碟内的档名,并更新/var/lib/mlocate 内的资料库档案;
- locate:依据/var/lib/mlocate 内的资料库记载,找出使用者输入的关键字档名
find
我们现在知道atime, ctime与mtime的意义,如果你想要找出一天内被更动过的档案名称,可以使用上述范例一的作法。但如果我想要找出『4天内被更动过的档案档名』呢?那可以使用『 find /var -mtime -4』。那如果是『4天前的那一天』就用『 find /var -mtime 4』。有没有加上『+, -』差别很大喔!我们可以用简单的图示来说明一下
图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图6.5.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 来找出该类型的档案
假设我想要找出来/usr/bin, /usr/sbin 这两个目录下, 只要具有SUID 或SGID 就列出来该档案,你可以这样做:
因为SUID是4分,SGID 2分,总共为6分,因此可用/6000来处理这个权限!至于find后面可以接多个目录来进行搜寻!另外,find本来就会搜寻次目录,这个特色也要特别注意喔!最后,我们再来看一下find还有什么特殊功能吧!
该范例中特殊的地方有{} 以及\; 还有-exec 这个关键字,这些东西的意义为:
- {} 代表的是『由find 找到的内容』,如上图所示,find 的结果会被放置到{} 位置中;
- -exec 一直到\; 是关键字,代表find 额外动作的开始(-exec) 到结束(\;) ,在这中间的就是find 指令内的额外动作。在本例中就是『 ls -l {} 』啰!
- 因为『 ; 』在bash 环境下是有特殊意义的,因此利用反斜线来跳脱。
find 还可以利用万用字元来找寻档名呢!举例来说,你想要找出/etc 底下档名包含httpd 的档案, 那么你就可以这样做:
不但可以指定搜寻的目录(连同次目录),并且可以利用额外的选项与参数来找到最正确的档名!真是好好用!不过由于find在寻找资料的时后相当的操硬碟!所以没事情不要使用find啦!有更棒的指令可以取代呦!那就是上面提到的 whereis与locate啰!
一、让使用者能进入某目录成为『可工作目录』的基本权限为何:
- 可使用的指令:例如cd 等变换工作目录的指令;
- 目录所需权限:使用者对这个目录至少需要具有x的权限
- 额外需求:如果使用者想要在这个目录内利用ls 查阅档名,则使用者对此目录还需要r 的权限。
二、使用者在某个目录内读取一个档案的基本权限为何?
- 可使用的指令:例如本章谈到的cat, more, less等等
- 目录所需权限:使用者对这个目录至少需要具有x 权限;
- 档案所需权限:使用者对档案至少需要具有r的权限才行!
三、让使用者可以修改一个档案的基本权限为何?
四、让一个使用者可以建立一个档案的基本权限为何?
- 目录所需权限:使用者在该目录要具有w,x的权限,重点在w啦!
五、让使用者进入某目录并执行该目录下的某个指令之基本权限为何?
- 目录所需权限:使用者在该目录至少要有x 的权限;
- 档案所需权限:使用者在该档案至少需要有x 的权限
例题:
答:
- dir1 :至少需要有x 权限;
- file1:至少需要有r 权限;
- dir2 :至少需要有w, x 权限。
例题:
drwxr-xr-x 23 root root 4096 Sep 22 12:09 / drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home drwx------ 6 student student 4096 Sep 29 02:23 /home/student drwxr-xr-x 6 student student 4096 Sep 29 02:24 /home/student/www -rwxr--r-- 6 student student 369 Sep 29 02:27 /home/student/www/index.html请问vbird 这个帐号(不属于student群组)能否读取index.html 这个档案呢?
答:
那要如何修改权限呢?其实只要将/home/student的权限修改为最小711 ,或者直接给予755就可以啰!这可是很重要的概念喔!
- 绝对路径:『一定由根目录/ 写起』;相对路径:『不由/ 写起,而是由相对当前目录写起』
- 特殊目录有:., .., -, ~, ~account需要注意;
- 与目录相关的指令有:cd, mkdir, rmdir, pwd 等重要指令;
- rmdir 仅能删除空目录,要删除非空目录需使用『 rm -r 』指令;
- 使用者能使用的指令是依据PATH 变数所规定的目录去搜寻的;
- ls 可以检视档案的属性,尤其-d, -a, -l 等选项特别重要!
- 档案的复制、删除、移动可以分别使用:cp, rm , mv等指令来操作;
- 检查档案的内容(读档)可使用的指令包括有:cat, tac, nl, more, less, head, tail, od 等
- cat -n 与nl 均可显示行号,但预设的情况下,空白行会不会编号并不相同;
- touch 的目的在修改档案的时间参数,但亦可用来建立空档案;
- 一个档案记录的时间参数有三种,分别是access time(atime), status time (ctime), modification time(mtime),ls 预设显示的是mtime。
- 除了传统的rwx权限之外,在Ext2/Ext3/Ext4/xfs档案系统中,还可以使用chattr与lsattr设定及观察隐藏属性。常见的包括只能新增资料的+a 与完全不能更动档案的+i 属性。
- 新建档案/目录时,新档案的预设权限使用umask 来规范。预设目录完全权限为drwxrwxrwx, 档案则为-rw-rw-rw-。
- 档案具有SUID的特殊权限时,代表当使用者执行此一binary程式时,在执行过程中使用者会暂时具有程式拥有者的权限
- 目录具有SGID的特殊权限时,代表使用者在这个目录底下新建的档案之群组都会与该目录的群组名称相同。
- 目录具有SBIT的特殊权限时,代表在该目录下使用者建立的档案只有自己与root能够删除!
- 观察档案的类型可以使用file 指令来观察;
- 搜寻指令的完整档名可用which 或type ,这两个指令都是透过PATH 变数来搜寻档名;
- 搜寻档案的完整档名可以使用whereis 找特定目录或locate 到资料库去搜寻,而不实际搜寻档案系统;
- 利用find 可以加入许多选项来直接查询档案系统,以获得自己想要知道的档名。
练习:
情境模拟题一:假设系统中有两个帐号,分别是alex 与arod ,这两个人除了自己群组之外还共同支援一个名为project 的群组。假设这两个用户需要共同拥有/srv/ahome/ 目录的开发权,且该目录不许其他人进入查阅。请问该目录的权限设定应为何?请先以传统权限说明,再以SGID 的功能解析。
- 目标:了解到为何专案开发时,目录最好需要设定SGID 的权限!
- 前提:多个帐号支援同一群组,且共同拥有目录的使用权!
- 需求:需要使用root 的身份来进行chmod, chgrp 等帮用户设定好他们的开发环境才行!这也是管理员的重要任务之一!
首先我们得要先制作出这两个帐号的相关资料,帐号/群组的管理在后续我们会介绍, 您这里先照着底下的指令来制作即可:
1 首先建立所需要开发的专案目录
2从上面的输出结果可发现alex 与arod 都不能在该目录内建立档案,因此需要进行权限与属性的修改。由于其他人均不可进入此目录,因此该目录的群组应为project,权限应为770才合理。
4 实际分别以两个使用者来测试看看,情况会是如何?先用alex 建立档案,然后用arod 去处理看看
由上面的结果我们可以知道,若单纯使用传统的rwx而已,则对刚刚alex建立的abcd这个档案来说, arod可以删除他,但是却不能编辑他!这不是我们要的样子啊!赶紧来重新规划一下。
4 加入SGID 的权限在里面,并进行测试看看:
所以最终的结果显示,此目录的权限最好是『2770』,所属档案拥有者属于root即可,至于群组必须要为两人共同支援的project 这个群组才行!
补充:档案预设权限umask 与touch
我们在ls这个指令的介绍时,有稍微提到每个档案在linux底下都会记录许多的时间参数,其实是有三个主要的变动时间,那么三个时间的意义是什么呢?
- modification time (mtime):
当该档案的『内容资料』变更时,就会更新这个时间!内容资料指的是档案的内容,而不是档案的属性或权限喔! - status time (ctime):
当该档案的『状态(status)』改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间啊。 - access time (atime):
当『该档案的内容被取用』时,就会更新这个读取时间(access)。举例来说,我们使用cat去读取/etc/man_db.conf ,就会更新该档案的atime了。
来看一看你自己的/etc/man_db.conf 这个档案的时间吧!
在预设的情况下,ls显示出来的是该档案的mtime ,也就是这个档案的内容上次被更动的时间。
透过touch 这个指令,我们可以轻易的修订档案的日期与时间。并且也可以建立一个空的档案喔!不过,要注意的是,即使我们复制一个档案时,复制所有的属性,但也没有办法复制ctime 这个属性的。ctime 可以记录这个档案最近的状态(status) 被改变的时间。无论如何,还是要告知大家, 我们平时看的档案属性中,比较重要的还是属于那个mtime 啊!我们关心的常常是这个档案的『内容』 是什么时候被更动的说~了乎?
无论如何, touch 这个指令最常被使用的情况是:
- 建立一个空的档案;
- 将某个档案日期修订为目前(mtime 与atime)
简答题:
- 什么是绝对路径与相对路径
绝对路径的写法为由/ 开始写,至于相对路径则不由/ 开始写!此外,相对路径为相对于目前工作目录的路径!
- 如何更改一个目录的名称?例如由/home/test 变为/home/test2
mv /home/test /home/test2
- PATH 这个环境变数的意义?
这个是用来指定执行档执行的时候,指令搜寻的目录路径。
- umask 有什么用处与优点?
umask 可以拿掉一些权限,因此,适当的定义umask 有助于系统的安全, 因为他可以用来建立预设的目录或档案的权限。
- 当一个使用者的umask 分别为033 与044 他所建立的档案与目录的权限为何?
在umask 为033 时,则预设是拿掉group 与other 的w(2)x(1) 权限,因此权限就成为『档案-rw-r--r-- , 目录drwxr--r-- 』而当umask 044 时,则拿掉r 的属性,因此就成为『档案-rw--w--w-,目录drwx-wx-wx』
- 什么是SUID ?
当一个指令具有SUID 的功能时,则:
- SUID 权限仅对二进位程式(binary program)有效;
- 执行者对于该程式需要具有x 的可执行权限;
- 本权限仅在执行该程式的过程中有效(run-time);
- 执行者将具有该程式拥有者(owner) 的权限。
- 当我要查询/usr/bin/passwd 这个档案的一些属性时(1)传统权限;(2)档案类型与(3)档案的隐藏属性,可以使用什么指令来查询?
ls -al
file
lsattr - 尝试用find 找出目前linux 系统中,所有具有SUID 的档案有哪些?
find / -perm +4000 -print
- 找出/etc 底下,档案大小介于50K 到60K 之间的档案,并且将权限完整的列出(ls -l):
find /etc -size +50k -a -size -60k -exec ls -l {} \;
注意到-a ,那个-a是and的意思,为符合两者才算成功 - 找出/etc 底下,档案容量大于50K 且档案所属人不是root 的档名,且将权限完整的列出(ls -l);
find /etc -size +50k -a ! -user root -exec ls -ld {} \;
find /etc -size +50k -a ! -user root -type f -exec ls -l {} \;
上面两式均可!注意到! ,那个!代表的是反向选择,亦即『不是后面的项目』之意! - 找出/etc 底下,容量大于1500K 以及容量等于0 的档案:
find /etc -size +1500k -o -size 0
相对于-a ,那个-o就是或(or)的意思啰!