鸟哥linux私房菜 基础篇 笔记3

绝对路径与相对路径:

  • 绝对路径:路径的写法『一定由根目录 / 写起』,例如: /usr/share/doc 这个目录。
  • 相对路径:路径的写法『不是由 / 写起』,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: 『cd ../man』这就是相对路径的写法啦!
常用的目录『符号』代表的意义:  
.     代表此层目录 
..    代表上层目录 
~     代表自己的家目录 
~user 代表到 user 这个人的家目录
  

目录与路径的几个常用的指令:
    • cd     变换目录
    • pwd    显示目前的目录
    • mkdir 建立一个新目录
    • rmdir 删除一个里面是空的空目录

  • mkdir
    语法
    [root @test /root ]# mkdir [-mp] [目录名称] 
    参数说明: 
    -m :设定档案的权限喔!直接设定,不需要看 umask 这个内容的脸色! 
    -p :帮助你直接将上面的目录递归建立起来! 
    范例: 
    [root @test /root]# cd tmp 
    [root @test /tmp]# mkdir test<==建立名称为 test 的目录 
    [root @test /tmp]# mkdir -p test1/test2/test3/test4 <==直接建立 test2...等上层目录 
    [root @test /tmp]# mkdir -m 711 testqq  <==建立权限为 711 的目录! 
    [root @test /tmp]# ll test* 
    drwxrwxr-x    2 test    test        4096 Feb  6 20:47 test/ 
    drwxrwxr-x    3 test    test        4096 Feb  6 20:48 test1/ 
    drwx--x--x    2 test    test        4096 Feb  6 20:48 testqq/

  • rmdir
    语法
    [root @test /root ]# rmdir [-p] [目录名称] 
    参数说明: 
    -p :将上层的目录也删除吧! 
    范例: 
    [root @test /root]# rmdir test<==删除名称为 test 的目录 
    [root @test tmp]# ll 
    drwxrwxr-x    3 test    test        4096 Feb  6 20:48 test1/ 
    [root @test tmp]# rmdir test1 
    rmdir: `test1': Directory not empty 
    [root @test tmp]# rmdir -p test1/test2/test3/test4 
    [root @test tmp]$ ll
    说明 
    如果想要建立删除旧有的目录时,就使用 rmdir 吧!例如将刚刚建立的 test 杀掉,使用 rmdir test 即可!请注意呦!目录需要一层一层的删除才行!而且被删除的目录里面必定不能还有其它的目录或档案!那如果要将所有目录下的东西都杀掉呢?!这个时候就必须使用 rm -rf test 啰!不过,还是使用 rmdir 比较不危险!不过,你也可以尝试以 -p 的参数加入,来删除上层的目录喔! 

  • 环境变量 PATH
  • 下达 echo $PATH , echo 有『显示、印出』的意思,而 PATH 前面加的 $ 表示后面接的是变量,所以即会显示出目前的 PATH 了! 
     
[root@test root]# echo $PATH 
/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin

增加环境变量:

PATH=”$PATH”:/root



档案与目录管理:

档案与目录的管理上,不外乎『显示属性』、『拷贝』、『删除档案』及『移动档案或目录』等等


ls 显示文件名称、属性等 
cp 拷贝档案或目录 
rm 删除档案或目录 
mv 移动档案或目录 


cp
语法
[root @test /root ]# cp [-drsu] [来源档] [目的档] 
参数说明: 
-d     :在进行 copy 的时候,如果是 copy 到 link 档案,若不加任何参数,则预设情况中会将 link 到的源文件 
       copy 到目的地,若加 -d 时,则 link 档案可原封不动的将 link 这个快捷方式其拷贝到目的地! 
-r     :可以进行目录的 copy 呦! 
-s          :做成连结档,而不 copy 之意!与 ln 指令相同功能! 
-u, --update:如果来源档比较新,或者是没有目的档,那么才会进行 copy 的动作!可用于备份的动作中! 
范例: 
[root @test /root]# cp    .bashrc bashrc      <==将 .bashrc 拷贝成 bashrc 这个档案! 
[root @test /root]# cp -r /bin /tmp/bin        <==这个功能就好玩啦!这是用来 copy 整个目录的参数! 
[root @test /root]# cp -s .bashrc bashrc         <==将 .bashrc 建立一个连结档,档名为 bashrc 
[root @test /root]# cp -u /home/.bashrc .bashrc  <==先检查 /home/.bashrc 是否与 .bashrc 不同,如果不同的话就开始 copy 一份!如果相同则不做任何动作!
说明 
这个指令会常用到的呦!因为我们得常常需要 copy 资料呀!所以需要了解一下喔!如果你有些很大档案的需要备份,偏偏这个档案的更新率很低,那么每次备份都需要在 copy 一份吗?看来是不需要了!你可以使用『cp -u 来源档 目的档』来备份呦!如此一来,当档案被改变过后,才会进行 copy 的动作! 
  

rm
语法
[root @test /root ]# rm [-fir] [档名] 
参数说明: 
-i     :提供使用者确认(这是默认值) 
-r     :循环,就是一直杀掉,直到没有东西为止的意思 
-f     :force ,就是强力杀掉啦! 
范例: 
[root @test /root]# cp .bashrc bashrc<==建立一个新档案, bashrc 
[root @test /root]# rm bashrc           <==会显示如下的提示: 
rm: remove `bashrc'? 
[root @test /root]# mkdir testing 
[root @test /root]# cp .bashrc testing 
[root @test /root]# rmdir testing 
rmdir: `testing': Directory not empty   <==由于 testing 里面有 .bashrc ,所以砍不掉! 
[root @test /root]# rm -rf testing      <==持续删除该目录下的所有档案与目录
说明 
这是移除的指令,相当于 dos 下的 del 指令!这里要注意的是,通常在 Linux 系统下,为了怕档案被误杀,所以都已经有 -i 这个参数, -i 是指每个档案被杀掉之前都会让使用者确认一次,以预防误杀档案!而如果要连目录下的东西都一起杀掉的话,例如子目录里面还有子目录时,那就要使用 -rf 这个参数了!不过,使用『 rm -rf 』这个指令之前,请千万注意了,因为,该目录或档案『肯定』会被 root 杀掉!因为系统不会再次询问你是否要砍掉呦! 所以那是个超级严重的指令下达呦!得特别注意!不过,如果你确定该目录不要了,那么使用 rm -rf 来循环杀掉是不错的方式! 


mv
语法
[root @test /root ]# mv [-u] [来源档] [目的档] 
参数说明: 
-u   :同样的,为 update 的简写,当来源档比目的档还新的时后才会动作! 
范例: 
[root @test /root]# cp .bashrc bashrc 
[root @test /root]# mv bashrc bashrc.old 
[root @test /root]# mv bashrc bashrc2 /tmp<==将 bashrc 与 bashrc2 移动到 /tmp 这个目录下!请注意,最后一个才是最终的目标,其它的都是 SOURCE
说明 
这是搬移的意思!当你要移动档案或目录的时后,呵呵!这个指令就很重要啦!同样的,你也可以使用 -u ( update )才测试新旧档案,看看是否需要搬移啰!另外一个用途就是『变更档名!』,我们可以很轻易的使用 mv 来变更一的档案的档名呢! 
  

basename    就是取最后一个文件名或者目录名
语法
[root @test /root ]# basename [目录] 
参数说明: 
范例: 
[root @test /root]# basename /usr/local/etc 
etc 
这个指令会将后面的[目录]仅撷取出最后面的那个目录或档案, 
以上面的例子来看, /usr/local/etc 不论 etc 是目录或档案, 
他都会被撷取出来,因为他是最后一个出现的咚咚!
说明 
这个指令颇有点意思~他可以将一个目录或档案的最后一个咚咚秀出来!所以,未来如果你有要使用变量,并且取出最后一个数据(不论是档案还是目录),那么使用这个玩意儿就对啦! ^_^ 


dirname    与basename相反,取最后一个文件名或者目录名的前面部分
语法
[root @test /root ]# dirname [目录] 
参数说明: 
范例: 
[root @test /root]# dirname /usr/local/etc 
/usr/local 
恰恰与 basename 相反,他仅是秀出来前面的『目录』部分喔!
说明 
这个指令恰恰与 basename 相反的啦!呵呵!很好玩吧!这部份也最常用在我们第三部分要讲的 Shell 的学习中喔!用最多的地方应该是 scripts 啦!用这两个宝贝蛋来撷取部分数据的内容!有用的很!
  




观看档案内容:cat, tac, more, less, head, tail, nl

最常使用的显示档案内容的指令可以说是 cat 与 more 及 less 了

如果我们要查看一个很大型的档案(好几百MB时),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用 tail 呀,此外, tac 这个指令也可以达到!


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


more
语法
[root @test /root ]# more [档名] 
参数说明: 
范例: 
[root @test /root]# more ~/.bashrc  <==一页一页的显示档案内容 
[root @test /]# ls -al | more  <==一页一页的将 ls 的内容显示出来
说明 
more 真是个很有用的指令!我好喜欢呦!当你的档案太大的时后,那么使用 cat 将没有办法看清楚!这个时候你可以使用 more 来做动作!more 也可以用来做为管线的同时执行之用!例如你在执行 find 这个寻找的指令时,可以同时使用 |more ,则搜寻结果可以一页一页的列出呦!关于管线( pipe )的用法我们在 bash shell 的地方再来谈!


less
语法
[root @test /root ]# less [档名]  
参数说明:  
范例:  
[root @test /root]# less ~/.bashrc 
说明 
less 的用法比起 more 又更加的有弹性,怎么说呢?在 more 的时候,我们并没有办法向前面翻,只能往后面看,但若使用了 less 时,呵呵!就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,您瞧,是不是更容易使用来观看一个档案的内容了呢!? 
  
more 与 less 的用途与用法真的是很广啦!首先,你可以在 more 与 less 的画面中进行『搜寻』的工作!如何进行呢?我们以 less 来说明好了,如果你想要知道 /etc/man.config 这个档案里面有没有一个叫做 GER 的大写字眼,那么可以: 








连结档的介绍

ln命令

如果直接用ln passwd passwd-hard 是硬链接

如果使用ln -s passwd passwd-hard 是符号链接


硬链接不能跨分区 符号链接可以




档案与目录权限

由于 Linux 还可以设定其它的系统安全属性,使用 chattr 来设定,而以 lsattr 来查看,最重要的属性就是可以设定其不可修改的特性!让连档案的拥有者都不能进行修改!这个属性可是相当重要的,尤其是在安全机制上面( security )!

chown 改变档案的拥有人 
chgrp 改变档案的所属群组 
chmod 改变档案的可写、可读、可执行等属性 
umask 改变预设的建立档案或目录时的属性 
chattr 改变档案的特殊属性 
lsattr 显示档案的特殊属性!


  • chown
    语法
    [root @test /root ]# chown [-R] user:group [目录名称] 
    参数说明: 
    -R    :循环的将该目录下的所有档案都改成 user 与 group 的名称! 
    范例: 
    [root @test /root]# mkdir /home/test/testing  <==在 /home/test 这个家目录中建立一个名为 testint 的子目录 
    [root @test /root]# cp * /home/test/testing 
    [root @test /root]# chown test /home/test/testing 
    [root @test /root]# chown -R test:test /home/test/testing<==将该目录下的所有目录或档案均变为 test 拥有

说明 
前一个章节才刚讲完,应该不会就这样忘记了吧?!由于 chown 的使用范围较广,所以这里再次的给他复习一下 chown 就好, chgrp 请回前一章内容观看呦! 
  
记得档案有『拥有人』及『拥有群组』吧,这个 chown 就是在改变拥有者的指令。刚接触 Linux 的朋友最容易犯的一个错误在哪里呢?就是以 root 的身份 copy 一个档案(或路径)给一般使用者(假设为 test )时,忘记将该档案的所有人改成 test 了!由于复制者是 root 所以该档案也会是 root 所有!那么 test 当然也就不能修改该档案了! 
  
在上面的例子中,『 chown test /home/test/testing 』这个指令只会将该目录变成 test 的,但是 group 仍然是 root 的呦!所以你可以使用『 chown test:test /home/test/testing 』,连使用者群组都给他改变一下啰!不过需要注意的是,这两个指令都只改变了『目录』 的所有权而已!那么在这个目录下的东西也要改变的话,该如何?!呵呵,就使用 -R 这个参数即可! 
  • chmod
    语法
    [root @test /root ]# chmod [-R] [parameter] [目录名称] 
    参数说明: 
    -R   :循环的一直将该目录的档案均改变之! 
    范例: 
    [root @test /root]# chmod 777 .bashrc 

  • umask
    OK!那么现在我们知道如何建立或者是改变一个目录或档案的属性了,不过,您知道当你建立一个新的档案或目录时,他的预设属性会是什么吗?呵呵!那就与 umask 有关了!那么 umask 是在搞什么呢?基本上, umask 就是指定『目前使用者在建立档案或目录时候的属性默认值』,那么如何得知或设定 umask 呢?他的指定条件以底下的方式来指定: 
    语法
    [root @test root]# umask 
    0022 
    [root@vbird test]# umask 002   <==后面接 3 个数字! 
    [root@vbird test]# umask 
    0002
    说明 
    查看 umask 数值为直接输入 umask 即可,而设定呢?没错!就是 umask 之后接三个数字!那么如何来指定呢?主要还是跟 Linux 的档案属性(那九个属性, r, w, x )有关的,而且是以分数的那一个关系为例的,而有底下的规则为辅: 
     
    • 若使用者建立为『档案』则预设『没有可执行 ( x ) 项目』,亦即只有 rw 这两个项目,也就是最大为 666 分
      --rw-rw-rw-
    • 若使用者建立为『目录』,则由于 x 与是否可以进入此目录有关,因此预设为所有权限均开放,亦即为 777 分
      drwxrwxrwx
      
    那么 umask 指定的是『该默认值需要减掉的权限!』因为 r、w、x 分别是 4、2、1 分,所以啰!也就是说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉执行与写入的权限,也就是 3 分,这样了解吗?请问您, 5 分是什么?呵呵!就是读与执行的权限啦!如果以上面的例子来说明的话,因为 umask 为 002 ,所以 user, group 并没有被拿掉属性,不过 others 的属性被拿掉了 2 ( 也就是 w 这个属性 ),那么由于当使用者: 
     
    • 建立档案时:(-rw-rw-rw-) – (--------w-) ==> -rw-rw-r--
    • 建立目录时:(drwxrwxrwx) – (--------w-) ==> drwxrwxr-x
      
    不相信吗?你只要使用 touch test 然后看看这个 test 的档案属性,就可以知道了!那么如何看你这个使用者目前的 umask 呢?直接下达 umask 即可!实作看看先: 
     
    [root@vbird test]# umask 
    0002 
    [root@vbird test]# touch test1 
    [root@vbird test]# mkdir test2 
    [root@vbird test]# ls -l 
    -rw-rw-r--    1 root     root            0 Oct 22 00:00 test1 
    drwxrwxr-x    2 root     root         4096 Oct 22 00:00 test2/ 
    发现了什么?呵呵! Test1 的属性为 666-002 = 664 !正确吗?是的!正确! 
    而 test2 这个目录呢?就是 777-002 = 775 !也正确!

    [root@vbird test]# umask 003 
    [root@vbird test]# touch test3 
    [root@vbird test]# mkdir test4 
    [root@vbird test]# ll 
    -rw-rw-r--    1 root     root            0 Oct 22 00:03 test3 
    drwxrwxr--    2 root     root         4096 Oct 22 00:03 test4/ 
    嘿!属性又跟刚刚的不一样啰!仔细推敲一下为什么呦!test3 666-003 =663,这是怎么一回事?! 663 应该是 -rw-rw--wx 才对啊!怎么会是上面的属性!呵呵!这里就要特别的给他强调了!『尽量不要以数字相加减啦!』容易造成类似上面的问题!你应该要这样想(-rw-rw-rw-) - (--------wx)=-rw-rw-r--这样就对啦!了解了吗?不要用十进制的数字喔!够能力的话,用二进制来算,不晓得的话,用 rwx 来算喔! ^_^

      
    由上面的例子您应该很轻易的就可以发现 umask 的用途!而这个 umask 可以在 /etc/bashrc 里面进行修改喔!预设的情况之下, root 的 umask 为 022 而一般使用者则为 002 ,因为可写的权限蛮严重的,因此预设都会拿掉这个权限!此外,因为 root 比较重要!所以为了安全的需求,其同群组的写入属性就被拿掉了!这东西对于安全性也有一定程度的贡献呦! 
  • chattr
    语法
    [root @test /root ]# chattr [+-=][ASacdistu] [档案或目录名称] 
    参数说明: 
    +-= :分别为 [+ 增加] [- 减少] [= 设定] 属性的意思 
    A  :当设定了 A 这个属性时,这个档案(或目录)的存取时间 atime (access) 将不可被修改, 
        可避免例如手提式计算机容易有磁盘 I/O 错误的情况发生! 
    S  :这个功能有点类似 sync 的功能!就是会将数据同步写入磁盘当中!可以有效的避免数据流失! 
    a  :当设定 a 之后,这个档案将只能增加数据,而不能删除,只有 root 才能设定这个属性。 
    c  :这个属性设定之后,将会自动的将此档案『压缩』,在读取的时候将会自动解压缩出来! 
        但是在储存的时候,将会先进行压缩之后再储存(看来对于大档案似乎蛮有用的!) 
    d  :当 dump (备份)程序被执行的时候,设定 d 属性将可使该档案(或目录)具有 dump 功效! 
    i  :这个 i 可就很厉害了!他可以让一个档案『不能被删除、改名、设定连结也无法写入或新增数据!』 
        对于系统安全性有相当大的帮助! 
    j  :当使用 ext3 这个档案系统格式时,设定 j 属性将会使档案在写入时先记录在 journal 中! 
        但是当 filesystem 设定参数为 data=journalled 时,由于已经设定了日志了,所以这个属性无效! 
    s  :当档案设定了 s 参数时,他将会被完全的移除出这个硬盘空间。 
    u  :与 s 相反的,当使用 u 来设定档案时,则数据内容其实还存在磁盘中,可以使用来 undeletion. 
    范例: 
    [root @test /root]# chattr +i /etc/shadow<==呵呵!如此则无法更动这个档案啰! 
    [root @test /root]# chattr -i /etc/shadow <==解除该属性!
    说明 
    这这个指令是重要的,尤其是在系统的安全性上面!由于这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性呦!其中,个人认为最重要的当属 +i 这个属性了,因为他可以让一个档案无法被更动,对于需要强烈的系统安全的人来说,真是相当的重要的!里头还有相当多的属性是需要 root 才能设定的呢!此外,如果是 log file 这种的登录档,就更需要 +a 这个可以增加,但不会被杀掉的参数了!怎样?很棒吧!未来提到登录档的认知时,我们再来聊一聊如何设定他吧!
  • lsattr
    语法
    [root @test /root ]# lsattr [-aR] 
    参数说明: 
    -a :将隐藏文件的属性也秀出来; 
    -R :连同子目录的数据也一并列出来! 
    范例: 
    [root @test /root]# chattr +i .bash_logout 
    [root @test /root]# lsattr -a  
    -------------- ./. 
    -------------- ./.. 
    ---i---------- ./.bash_logout 
    -------------- ./.bash_profile 
    -------------- ./.bashrc 
    -------------- ./.emacs 
    -------------- ./.screenrc
    说明 
    这两个指令在使用上必须要特别小心,例如:某天你心情好,突然将 /etc/shadow 这个重要的密码记录档案给他设定成为具有 i 的属性,那么过了若干天之后,你突然要新增使用者,却一直无法新增!别怀疑,赶快去将 i 的属性拿掉吧!


搜寻档案或目录

档案的搜寻可就厉害了!因为我们常常需要知道那个档案放在哪里,所以来谈一谈怎么搜寻吧!在 Linux 底下也有相当优异的搜寻系统呦!通常 find 不很常用的!因为速度慢之外,也很操硬盘!通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻呦!为什么呢?因为 whereis 与 locate 是利用数据库来搜寻数据,所以相当的快速,而且并没有实际的搜寻硬盘,比较省时间啦!

which   查看可执行档案的位置 
whereis 查看档案的位置 
locate  配合数据库查看档案位置 
find    实际搜寻硬盘去查询文件名称

which
语法
[root @test /root ]# which  [文件名称] 
参数说明: 
范例: 
[root @test /root]# which passwd 
/usr/bin/passwd
说明 
which 的基本功能是『借由 PATH 这个环境变量的内容,去该路径内寻找可执行文件』,所以基本的功能在于『寻找执行档』啰! 
  

whereis
语法
[root @test /root ]# whereis [-bmsu] [目录名称] 
参数说明: 
-b    :只找 binary 的档案 
-m    :只找在说明文件 manual 路径下的档案 
-s    :只找 source 来源档案 
-u    :没有说明档的档案! 
范例: 
[root @test /root]# whereis passwd 
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.bz2 
将 passwd 相关字眼的档案或目录都列出来!

[root @test /root]# whereis -b passwd 
passwd: /usr/bin/passwd /etc/passwd 
仅列出binary 档案!

[root @test /root]# whereis -m passwd 
passwd: /usr/share/man/man1/passwd.1.bz2 
仅搜寻 man page 所在的目录!

说明 
如果使用 find 太麻烦,而且时间花用的很大!(因为如果你的硬盘比较老旧的话,嘿嘿!有的等的!)这个时候 whereis 就相当的好用了!另外, whereis 可以加入参数来找寻相关的资料,例如如果你是要找可执行档( binary )那么加上 -b 就可以啦!例如上面的范例针对 passwd 这支程序来说明!如果不加任何参数的话,那么就将所有的数据列出来啰!那么 whereis 到底是使用什么咚咚呢?为何搜寻的速度会比 find 快这么多?!其实那也没有什么!这是因为 Linux 系统会将系统内的所有档案都记录在一个数据库档案里面,而当使用 whereis 或者是底下要说的 locate 时,都会以此数据库档案的内容为准,因此,有的时后你还会发现使用这两个执行档时,会找到已经被杀掉的档案!这就是因为他是一个『数据库』档案呀!另外,基本上 Linux 每天会针对 Linux 主机进行 updatedb (就是那一个数据库档案啰!)的动作,你可以在 /etc/cron.weekly/slocate.cron 这个档案找到相关的机制呦!当然,也可以直接使用 /usr/bin/updatedb 来更新数据库档案呢! 
  

locate
语法
[root @test /root ]# locate [目录名称] 
参数说明: 
范例: 
[root @test /root]# locate root 
……一大堆跟 root 有关字眼的档案都出来了 @_@

[root @test /root]# updatedb        <==立刻更新数据库

说明 
locate 的使用方式就更简单了!直接键入你要找的档名即可!但是,这个东西还是有使用上的限制呦!为什么呢?您会发现使用 locate 来寻找数据的时候特别的快,这是因为 locate 寻找的数据是由『已建立的数据库 /var/lib/slocate』里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速啰!那么有什么限制呢?就是因为他是经由数据库来搜寻的,而数据库的建立预设是在每个礼拜执行一次,所以当您新建立起来的档案,却还在数据库更新之前搜寻该档案,那么 locate 会告诉您『找不到!』呵呵!因为必须要更新数据库呀! 
  
那么我到底要建立哪些数据库呢?是否全部都要建立?似乎不需要,这个时候,你可以自己选择需要建立档案数据库的目录呢!在 /etc/updatedb.conf 这个内即可设定了! 
 
[root @test root]# more /etc/updatedb.conf 
## Linux-Mandrake configuration. 
# 由何处开始查询数据,当然是由根目录啦!所以填入 / 即可 
FROM="/"

# 哪些目录不想要建立档案搜寻数据,呵呵!就是那些不要的数据嘛! 
# 忘记的话,记得回上一章去看看内容,就知道为何如此设定了! 
PRUNEPATHS="/proc,/tmp,/var/tmp,/usr/tmp,/net,/afs,/mnt"

# 安全等级 
#   0 代表关闭安全检验,速度上面较快速,但较不安全; 
#   1 启动安全简易,这是系统的默认值; 
SECURITY="1"

# 查询的时候是否要由屏幕输出?当然不要,否则多麻烦? 
VERBOSE="NO"

# 数据库所在处!这是默认值,不要随意移动,否则会找不到! 
DATABASE="/var/lib/slocate/slocate.db"

# 哪些档案系统我们也不搜寻建立?就是光盘啦、非 Linux 的档案格式啦, 
# 我们都不要进行搜寻信息的建立啦! 
PRUNEFS="nfs,smbfs,ncpfs,proc,devpts,supermount,vfat,iso9660,udf,usbdevfs,devfs"

  

find
语法
[root @test /root ]# find [路径] [参数] 
参数说明: 
1. 时间: 
   -atime n    :在 n*24 小时内被 access 即存取过的档案列出来! 
   -ctime n    :在 n*24 小时内被 changed 即改变、新增的档案或目录印出 
   -mtime n    :在 n*24 小时内被 modified 即修改过的档案印出 
   -newer file :比 file 还要新的档案就列出来! 
2. 使用名称: 
   -gid n      :寻找 群组 ID 为 n 的档案 
   -group name :寻找群组名称为 name 的档案 
   -uid n      :寻找拥有者 ID 为 n 的档案 
   -user name  :寻找使用者名称为 name 的档案 
   -name file  :寻找档名为 file 的文件名称(可以使用万用字符) 
   -type type  :寻找档案属性为 type 的档案,type 包含了 b, c, d, p, l, s, 
                这些与前一章的属性相同!例如 l 为 Link 而 d 为路径之意! 
范例: 
[root @test /root]# find / -name testing            <==寻找档名为 testing  
[root @test /root]# find / -name 'test*'       <==寻找档名包含 test 的! 
[root @test /root]# find . -ctime 1                 <==寻找目前目录下一天内新增的目录或档案 
[root @test /root]# find /home/test -newer .bashrc  <==寻找 /home/test 目录下比 .bashrc 还要新的档案 
[root @test /root]# find /home -user test       <==寻找 /home 底下拥有者为 test 的档案 
[root @test /root]# find /dev -type b               <==寻找 /dev 这个目录下,档案属性为 b 的档案
说明 
如果你要寻找一个档案的话,那么使用 find 会是一个不错的主意!他可以根据不同的参数来给予档案的搜寻功能!例如你要寻找一个档名为 httpd.conf 的档案,你知道他应该是在 /etc 底下,那么就可以使用『 find /etc -name httpd.conf 』噜!那如果你记得有一个档案档名包含了 httpd ,但是不知道全名怎办?!呵呵,就用万用字符 * 吧,如上以:『 find /etc -name '*httpd*' 』就可将档名含有 httpd 的档案都列出来啰!不过,由于 find 在寻找数据的时后相当的耗硬盘!所以没事情不要使用 find 啦!有更棒的指令可以取代呦!那就是 whereis 与 locate 啰!!




SetUID, SetGID, Sticky bit 与 file 指令


  • SUID 与 SGID:
    其实,说到这里之前,应该先说明一下 UID (user ID)与 GID (Groupt ID)的!基本上, Linux 认得的账号只是一堆数字而已!而由于我们每个档案中同时含有『使用者』与『使用者群组』的属性,因此,就有所谓的 UID 与 GID 啰! UID 代表我们的使用者『代号』而 GID 则是群组的『代号』。你可以使用『 more /etc/passwd 』这个指令来看一下你的系统当中的所有账号,然后你会注意到每行的第三、四个字段(以 : 分隔)为数字,那个就是 UID 与 GID 了,您更会注意到的是, root 的 UID 与 GID 都是 0 !因此,当你建立了一个账号,而你将该账号的 UID 与 GID 都改为零,呵呵!那个账号的使用者就具有 root 的身份啰! 
      
    那么什么是 SUID 与 SGID 呢?!在说明之前我们先来以一般身份使用者 ( 还记得安装的时候曾经增加一个 test 账号的一般身份使用者吗?对啦!用他!然后呢?直接在键盘上按下 [Alt] + [Ctrl] + [F2] 到第二个终端机呀!) test 的身份登入,再来看一个档案的内容: 
     
    [test@test test]$ ls -l /usr/bin/passwd  
    -r-s--x--x    1 root     root        13476 Aug  7  2001 /usr/bin/passwd 
      
    看到了 /usr/bin/passwd 档案的前面属性了吗?怎么会有 s 的属性在原本的 x 呀!?那个就是所谓的 SUID 了!如果是『 -r-xr-s--x 』时,那么 s 就成为所谓的 SGID 了! 
      当一个档案具有 SUID 的时候,同时 other 的群组具有可执行的权限,那么当 others 群组执行该程序的时候, other 将拥有该档案的 owner 的权限!』。
  
[test@test test]$ ls -l /usr/bin/passwd /etc/shadow  
-r-s--x--x    1 root     root        13476 Aug  7  2001 /usr/bin/passwd  
-rw-------    1 root     root         2423 Jun 25 14:29 /etc/shadow 
  
我们以账号的密码文件来说明好了!注意上面的范例啰!可以看到的是, /etc/shadow 的权限是『只有 root 才能存取』呦!那么你会不会觉得很奇怪?明明我的一般使用者可以自己修改密码呀!对不对?那么修改密码一定跟 /etc/shadow 这个档案有关,那么怎么回事呀!?使用者是如何修改 /etc/shadow 这个档案的呢?嗯!没错!就是使用 SUID 的功能啦!上面的例子说明了, /usr/bin/passwd 这个档案具有 SUID 的属性,那么当使用者使用 /usr/bin/passwd 这个执行档时,在执行 pass word 修改的期间就具有 /usr/bin/passwd 这个档案的拥有者 root 的所属权限啰!所以,所以当一般使用者执行 passwd 的时候,将具有 root 的权限,所以他们也可以更改 /etc/shadow 的内容啰!那么由此也可以知道,由于这个 Set UID ( SUID ) 的主要功能是在『某个档案执行的期间具有档案拥有者的权限』,因此, s 就是替代上面提到的 x 这个可执行的位置啰!那万一该档案并没有 x 的属性呢?哈哈!问的好!那么该档案的属性就会将小写的 s 变成大写的 S 啦! ( 这里即使暂时不了解也没有关系,等到过一阵子再回来看一看,你就会了解啦! ) 
  
不过,由此也知道 SUID 与 SGID 的问题所在,没错!就是太不安全了!如果你有一个档案具有 root 的权限,那么当开启了 SUID 的时候,嘿嘿!够你瞧的了!!因此上,在变更一个档案成为具有 SUID 或 SGID 的情况时,必须要特别小心呢!知道乎!? 
 Sticky bit:
OK!接着下来,我们要来看一下,既然有 SUID 与 SGID ,那么为什么没有在最末位出现 s 取代 x 呢?呵呵!这当然没有必要啦!因为那是属于 others 的权限,你的档案如果是任何人皆可执行的话,那么本来他们就具有权限啦!干嘛还要设定 s 的属性!?不过,这里却真的有另一个属性出现了,那就是 Sticky bit 的属性 ( t ) !这个属性的最大用处在于『具有 sticky bit 属性的该”目录”下的档案,其档案或目录只有档案拥有者及 root 才有权力删除!』这样是否可以了解了呢?嘿嘿!没错!在我们系统里面本来就预设有一个啦!那就是 /tmp 这个目录! 
  
[test@test test]$ ls -l /  
drwxrwxrwt    2 root     root         4096 Jul 18 13:08 tmp 
  
如何,发现了吧!虽然该目录具有所有人皆可擦写的权限,但是确有一个 t 出现了,那就是所谓的 sticky bit 啰!在该目录里面虽然你可以建立与修改任何档案,但是却仅能删除自己建立的档案呢!除非你是 root !你可以这样试试看啰: 
  1. 以 root 登入系统,并且进入 /tmp 当中; 
2. touch test,并且更改 test 权限成为 777 ; 
3. 以一般使用者登入,并进入 /tmp; 
4. 尝试删除 test 这个档案!  
如何!?发现了吧!! 
 SUID, SGID, Sticky bit 的设定方法:
前面介绍过 SUID 与 SGID 的功能,那么如何开启档案使成为具有 SUID 与 SGID 的权限呢?!这就需要刚刚的数字更改权限的方法了!现在你应该已经知道数字型态个更改权限方式为『三个数字』的组合,那么如果在这三个数字之前再加上一个数字的话,那最前的面数字就代表这几个属性了! ( 注:通常我们使用 chmod xyz filename 的方式来设定 filename 的属性时,则是假设没有 SUID, SGID 及 Sticky bit 啦! ) 
 
  • 4 为 SUID
  • 2 为 SGID
  • 1 为 Sticky bit
  
假设要将一个档案属性改为『-rwsr-xr-x』时,由于 s 在使用者权限中,所以是 SUID ,因此,在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来设定!此外,还有大 S 与大 T 的产生喔!参考底下的范例啦! 
 
[root@test tmp]# touch test 
[root@test tmp]# ll 
total 0 
-rw-r--r--    1 root     root            0 Feb  6 23:08 test 
[root@test tmp]# chmod 4755 test 
[root@vbird tmp]# ll 
total 0 
-rwsr-xr-x    1 root     root            0 Feb  6 23:08 test* 
[root@test tmp]# chmod 6755 test 
[root@test tmp]# ll 
total 0 
-rwsr-sr-x    1 root     root            0 Feb  6 23:08 test* 
[root@test tmp]# chmod 1755 test 
[root@test tmp]# ll 
total 0 
-rwxr-xr-t    1 root     root            0 Feb  6 23:08 test* 
上面的三个例子应该都很好说明啊!就是直接将 x 以 s 或者是 t 来取代就是了!也就是分别为 SUID, SGID 及 sticky bit 的设定方法啦!

[root@test tmp]# chmod 7666 test 
[root@test tmp]# ll 
total 0 
-rwSrwSrwT    1 root     root            0 Feb  6 23:08 test 
这个例子就要特别小心啦!怎么会出现大写的 S 与 T 呢?不都是小写的吗?因为 s 与 t 都是取代 x 这个参数的,但是你有没有发现阿,我们是下达 7666 喔!也就是说, user, group 以及 others 都没有 x 这个可执行的标志 ( 因为 666 嘛! ),所以,这个 S, T 代表的就是『空的』啦!怎么说? SUID 是表示『该档案在执行的时候,具有档案拥有者的权限』,但是档案拥有者都无法执行了,哪里来的权限给其它人使用?当然就是空的啦! ^_^

 file
语法
[root @test /root ]# file [档名]  
参数说明:  
范例:  
[root @test /root]# file ~/.bashrc  
/root/.bashrc: ASCII text  <==表示这个档案是 ASCII 纯文字文件 

[root @test /root]# file /usr/bin/passwd 
/usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped 
嘿!还可以看到是否具有 SUID 的权限呢!

说明 
file 这个指令也蛮好用的,可以用来查看这个档案的类型,例如 ASCII 格式档,或者是 binary 的档案等等,还可以用来观看档案是否被加入 SUID 等等的信息!并且,也同时提供了是否有使用动态函式库的信息!相当的好用!












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章