since2012/04/23

Linux 档案与目录管理
本文已不再维护,更新文章请参考 这里 取得!
最近更新日期:2004/03/15
目录与路径相对路径与绝对路径, cd, pwd, mkdir, rmdir, 环境变量PATH,
档案与目录管理ls, cp, rm, mv, basename, dirname,
观看档案内容cat, tac, more, less, head, tail, nl, od,
档案与目录权限chown, chmod, umask, chattr, lsattr,
搜寻档案或目录which, whereis, locate, find,
SetUID, SetGID, Sticky bit 与 file 指令
本章习题练习

目录与路径:
由前一章节『Linux 的档案权限与目录配置』中约略了解到 Linux 的『树状目录』概念之后,接下来就得要实际的来搞定一些基本的路径问题了!这些问题当中,最重要的莫过于『绝对路径』与『相对路径』的意义啦!赶紧来了解一下!

  • 绝对路径与相对路径:

  • 在开始目录的切换之前,你必须要先了解一下所谓的『路径, PATH』,有趣的是:什么是『相对路径』与『绝对路径』?如果你还记得前一章的内容的话,那么应该还记得 Linux 里面的目录是呈现『树状目录』的情况,有就是有分支的啦!好了,假设你需要在任意一个目录下变换到根目录的 etc 底下,那么你就应该要使用『 cd /etc 』这个情况,这也就是所谓的『绝对路径』,他是从根目录连续写上来的一个情况,所以不论你在哪一个路径现执行这一个指令,都会将你移动到该路径下。那如果我是使用『 cd etc 』呢?那表示你要切换到『目前这个目录下的 etc 目录中』,情况可是不一样的呦!通常第一次接触 Linux 的使用者常会搞错这一个路径的观念!
     
    • 绝对路径:路径的写法『一定由根目录 / 写起』,例如: /usr/share/doc 这个目录。
    • 相对路径:路径的写法『不是由 / 写起』,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: 『cd ../man』这就是相对路径的写法啦!
     
    那么相对路径与绝对路径有什么了不起呀!?喝!那可真的是了不起了!假设您写了一个套件,这个套件共需要三个目录,分别是 etc, bin, man 这三个目录,然而由于不同的人喜欢安装在不同的目录之下,假设甲安装的目录是 /usr/local/packages/etc, /usr/local/packages/bin 及 /usr/local/packages/man ,不过乙却喜欢安装在 /home/packages/etc, /home/packages/bin, /home/packages/man 这三个目录中,请问如果需要用到绝对路径的话,那么是否很麻烦呢?是的!如此一来每个目录下的东西就很难对应的起来!这个时候相对路径的写法就显的特别的重要了!
     
    此外,如果您跟我一样,喜欢将路径的名字写的很长,好让自己知道那个目录是在干什么的,例如:/data4/staiwan19961109/models-3/smoke 这个目录,而另一个目录在 /data4/staiwan19961109/models-3/cctm ,那么我从第一个要到第二个目录去的话,怎么写比较方便?当然是『 cd ../cctm 』比较方便啰!对吧!
     
    好了,既然要谈到目录这个东西,自然就需要了解一下有哪些常用的目录『符号』代表的意义啦!
 
.     代表此层目录
..    代表上层目录
~     代表自己的家目录
~user 代表到 user 这个人的家目录
 

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

  • cd 与 pwd

  • 这两个指令主要是在『变换目前目录』与『显示目前所在目录』的工作,底下说一说他们的用途与语法吧!
     
  • cd

  • 语法
[root @test /root ]# cd [相对路径或绝对路径] 
参数说明:
路径有『相对路径』与『绝对路径』的分别,请千万小心啰!
范例:
[root @test /root]# cd ..       <==回到上一层目录
[root @test /root]# cd ../home     <==相对路径的写法
[root @test /root]# cd /var/www/html  <==绝对路径的写法
[root @test /etc]# cd         <==回到用户的家目录
[root @test /etc]# cd ~         <==回到用户的家目录!
[root @test /etc]# cd ~test      <==回到 test 这个用户的家目录
说明
cd 是 change directory 的缩写,这是用来变换工作路径的指令。注意,路径与 cd 指令之间存在一个空格!一登入 Linux 系统后,root 会在 root 的家目录,亦即 /root 下,至于使用者会在预设的 /home/username 底下,例如鸟哥的 ID 为 vbird ,则以 vbird 的身份登入后,会到 /home/vbird 这个路径下。OK!那回到上一层可以用『 cd .. 』而到相对路径可到『 cd ../bird』,至于绝对路径则是 cd /usr/sbin !注意喔,在前面的提示字符会改变路径名称!此外,家目录还有一个代码,那就是『 ~ 』符号!例如上面的例子可以发现,使用『 cd ~ 』可以回到个人的家目录里头去呢! 此外,如果你的 Linux 主机当中有个 testing 的账号,你要到他的家目录去,可以下达『 cd ~testing』立刻去到 testing 的家目录啰!
 

  • pwd

  • 语法
    [root @test /root ]# pwd 
    范例:
    [root @test root]# cd /home/test
    [root @test test]# pwd 
    /home/test             <==显示目前你所在的目录呦!
    说明
    pwd 是 print working directory 的缩写,也就是显示目前所在目录的指令,例如在上个表格最后的目录是 /home/test 这个目录,但是提示字符仅显示 test ,如果你想要知道目前所在的目录,可以输入 pwd 即可:
     
    此外,由于很多的套件所使用的目录名称都相同,例如 /usr/local/etc 还有 /etc ,但是通常 Linux 仅列出最后面那一个目录而已,这个时候你就可以使用 pwd 来知道你的所在目录啰!免得搞错目录,结果……
     

  • mkdir 与 rmdir 管理目录:

  • 那么要如何建立删除目录呢?很简单呀!就用 mkdir 与 rmdir ,看出来了吗?没错啦!就是 make/remove directory 的缩写说!看要怎么用吧!
     
  • 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/
    说明
    如果想要建立新的目录的话,那么就使用 mkdir 吧! 不过,请注意呦!在默认的情况下,你所需要的目录得一层一层的建立才行!例如:假如你要建立一个目录为 /home/bird/testing/test1,那么首先必须要有 /home 然后 /home/bird ,再来 /home/bird/testing 都必须要存在,才可以建立 test1 这个目录!假如没有 /home/bird/testing 时,就没有办法建立 test1 的目录啰!不过,现在有个更简单有效的方法啦!那就是加上 -p 这个参数喔!你可以直接下达:『 mkdir -p /home/bird/testing』则系统会自动的帮你将 /home, /home/bird, /home/bird/testing 依序的建立起目录!并且,如果该目录本来就已经存在时,系统也不会显示错误讯息喔!挺快乐的吧! ^_^
     

  • 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

  • 在提过了绝对路径、相对路径与指令的下达方式之后,您应该会稍微注意到一件事情,那就是:『为什么我可以在 /root 底下执行 /bin/ls 这个档案呢?』对呀!为什么我可以直接执行 ls 就一定可以显示出一些讯息而不会说找不到该档案呢?这是因为环境变量 PATH 的帮助所致呀!当我们在执行一个指令的时候,系统会依照 PATH 的设定去每个 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
     

    注意到了吗?对啦! /bin 在 PATH 的设定之中,所以自然就可以找的到 ls 啦!
     
    • 如果你将 ls 移动到 /root 底下的话,然后你自己本身也在 /root 底下,但是当你执行 ls 的时候,他就是不理你?怎么办?这是因为 PATH 没有 /root 这个目录,而你又将 ls 移动到 /root 底下了,自然系统就找不到可执行文件了,因此就会告诉你, command not found !那么该怎么克服这种问题呢?有两个方法,其一:直接将 /root 的路径加入 PATH 当中!如何增加?可以使用:

    •  
        PATH=”$PATH”:/root
       
      这种方式来增加即可!另一种方式则是使用完整档名,亦即直接使用相对或绝对路径来执行,例如:
       
          /root/ls
          ./ls
         
      因为在同一个目录中,而我们又知道在同一个目录中的目录符号为『 . 』,因此,就以上面的 ./ls 来执行也可以!这种执行方式以后您应该会很常见到才对!
     
    • 如果我有两个 ls 档案在不同的目录中,例如 /usr/local/bin/ls 底下与 /bin/ls 那么当我下达 ls 的时候,那个 ls 会被执行?那还用说,就找出 PATH 里面那个目录先被查询,则那个目录下的档案就会被先执行了!
     
    • 咦!既然如此的话,那么为何不要在 PATH 里面加入 . 这个目录,如此一来的话,不就可以直接在所在目录执行档案了吗?因为 . 代表所在目录嘛!是这样没错!但是有没有想过,如果某天,某个怪怪的使用者在 /tmp 里面写了一个 ls 的档案,偏偏他是有害的档案,那么当你在 /tmp 底下执行 ls 时,怎么办?!没错,可能会『中标』,所以啰,为了安全起见,不建议将『 . 』加入 PATH 的搜寻当中

    档案与目录管理:
    谈了谈目录与路径之后,再来讨论一下关于档案的一些基本管理吧!档案与目录的管理上,不外乎『显示属性』、『拷贝』、『删除档案』及『移动档案或目录』等等,由于档案与目录的管理在 Linux 当中是很重要的!尤其是每个人自己家目录的数据也都需要注意管理!由于我们在执行程序的时后,系统默认有一个搜寻的路径顺序,如果有两个以上相同档名的执行档分别在不同的路径时,呵呵,就需要特别留意啰!这里我们来谈一谈有关档案与目录的一些基础管理部分吧!
    ls 显示文件名、属性等
    cp 拷贝档案或目录
    rm 删除档案或目录
    mv 移动档案或目录
     

  • ls

  • 语法
    [root @test /root ]# ls [-ailS]
    参数说明:
    -a       :全部的档案都列出(连同隐藏档)
    -i       :印出 inode 的值
    -l       :长的列出,连同档案大小的数据等等
    -S       :以档案大小排序
    --color=never     :不要显示颜色
    --color=always    :均显示颜色
    --color=auto      :由系统自行判断!
    范例:
    [root @test /root]# ls -al
    total 48
    drwxr-x---    4 root     root         4096 Mar 10 00:37 .
    drwxr-xr-x   21 root     root         4096 Mar 10 20:16 ..
    -rw-------    1 root     root          524 Mar 10 00:40 .bash_history
    -rw-r--r--    1 root     root           24 Jun 11  2000 .bash_logout
    -rw-r--r--    1 root     root          266 Jun 11  2000 .bash_profile
    -rw-r--r--    1 root     root          249 Mar  6 20:50 .bashrc
    -rw-r--r--    1 root     root          210 Jun 11  2000 .cshrc
    drwx------    2 root     root         4096 Mar  9 11:06 .gnupg
    -rw-------    1 root     root          524 Jan 16 14:37 .mysql_history
    drwx------    2 root     root         4096 Mar  9 11:06 .ssh
    -rw-r--r--    1 root     root          196 Jul 11  2000 .tcshrc
    -rw-r--r--    1 root     root         1126 Aug 24  1995 .Xresources
    [root @test /]# ls
    bin   dev    etc   lib         misc  opt   root  tftpboot  usr
    boot  disk1  home  lost+found  mnt   proc  sbin  tmp       var
    [root @test /]# ls --color=never
    bin   dev    etc   lib         misc  opt   root  tftpboot  usr
    boot  disk1  home  lost+found  mnt   proc  sbin  tmp       var
    [root @test /]# ls -al|more
    说明
    还记得我们在解释档案的一些属性与目录的结构的那一章吗?!对啦!我们使用的第一支指令就是 ls 啦!通常我们都需要知道这个文件名『目录』还是『档案』?所以,我都喜欢使用『 ll』这个指令,其实那就是ls -l 的意思啦!不论如何,你都可以尝试着执行这之指令来视察你的档案!
     
    请注意呦!不要忘记你的资料的主要咚咚!尤其是前面几个主要的属性呦!另外,你有没有发现如果在远程以 telnet 或者是 putty 的联机程序登入主机的时后,由于 Linux 预设使用有颜色的方式显示方式,但是像上表一样,蓝色的字样根本就是很难看到!这个时候通常我都是使用『ls --color=never 』来丢掉颜色!那如果想让 ls 预设没有颜色的话,可以在 /root/.bashrc 或者是你的家目录的 .bashrc 这个档案中加入下面这一行:
    alias ls='ls --color=never'
    这样就可以把颜色去到了!至于 alias 是在干嘛的?我们到了 bash 这个 shell 的时候再来谈吧!
     

  • 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

  • 语法
    [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   以二进制的方式读取档案内容!
    底下我们来谈一谈每个指令的基本用法吧!

  • cat

  • 语法
    [root @test /root ]# cat [-nAE]
    参数说明:
    -n:   显示时,连行号印出屏幕上。
    -A:   将 DOS 下的 <tab> 与断行字符都列出来!
    -E:   将 DOS 编辑的文件中,仅列出 断行字符出来!
    范例:
    [root @test /root]# cat ~/.bashrc         <==显示 .bashrc 这个档案
    # .bashrc

    # User specific aliases and functions
    PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    alias ll='ls -l --color=never'

    [root @test /root]# cat ~/.bashrc -n      <==显示 .bashrc 并且加上行号!
         1  # .bashrc
         2
         3  # User specific aliases and functions
         4  PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
         6  alias rm='rm -i'
         7  alias cp='cp -i'
         8  alias mv='mv -i'
         9  alias ll='ls -l --color=never'

    [root @test /root]# cat -A regexp.txt
    This is a cat, however, I need a dog.^M$
    I want to "Happy" and <Happy> and /Happy/ here.^M$
    OK! ^Ieverythins is OK^M$
    Now, I will eat my food^M$
    are you ^Ifinished your work^M$
    what do you 123 goto where^M$
    显示出 DOS 档案的几个特殊符号,以上面档案为例,
    可发现 ^M 为断行符号,而每行的 $ 为行尾符号,
    至于 ^I 则是 <tab> 按键啦! 

    说明
    嘿嘿! Linux 里面有『猫』?!喔!不是的, cat 是 Concatenate (连续)的简写,主要的功能是将一个档案的内容连续的印出在屏幕上面!例如上面的例子中,我们将重要的参数档 .bashrc 印出来!如果加上 -n 的话,则每一行前面还会加上行号呦!cat 比较少用!毕竟当你的档案内容的行数超过 40 行以上,嘿嘿!根本来不及看!所以,配合 more 或者是 |more 来执行比较好!此外,如果是一般的 DOS 档案时,就需要特别留意一些奇奇怪怪的符号了,例如断行与<tab>等,要显示出来,就得加入 -A 之类的参数了!。
     

  • tac

  • 语法
    [root @test /root ]# tac [檔名]
    参数说明:
    范例:
    [root @test /root]# tac ~/.bashrc <==发现了没?反向印出呦!
    fi
            . /etc/bashrc
    if [ -f /etc/bashrc ]; then
    # Source global definitions

    alias h='history'
    alias lm='ls -al|more'
    alias ll='ls -l'
    # alias ll='ls -l --color=never'
    alias mv='mv -i'
    alias cp='cp -i'
    alias rm='rm -i'

    export PATH
    PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
    # User specific aliases and functions

    # .bashrc

    说明
    tac 这个好玩了!怎么说呢?详细的看一下, cat 与 tac ,有没有发现呀!对啦! tac 刚好是将 cat 反写过来,所以他的功能就跟 cat 相反啦, cat 是由『第一行到最后一行连续显示在屏幕上』,而 tac 则是『由最后一行到第一行反向在屏幕上显示出来』,很好玩吧!
     

  • 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 的大写字眼,那么可以:

     
    [root @test /root ]# less /etc/man.config 
    按键说明:
    /word:在 /etc/man.config 这个档案中搜寻 word 这个字符串的所在
    q    :离开 less 的画面
     
    然后在输入 / 之后,光标会移动到最左下角等待输入,这个时候您只要输入你的字符串之后,就会自动的帮你找出来该关键词啰!

     

  • head

  • 语法
    [root @test /root ]# head [-n number] [檔名]
    参数说明:
    -n :显示 number 行
    范例:
    [root @test /root]# head ~/.bashrc  <==默认情况下,显示头十行
    [root @test /root]# head -n 20 ~/.bashrc<==显示头二十行!
    说明
    head 的英文意思就是『头』啦,那么这个东西的用法自然就是显示出一个档案的前几行啰!没错!就是这样!若没有加上 -n 这个参数时,默认只显示十行,若只要一行呢?那就加入『 head -n 1 filename 』即可!
     

  • tail

  • 语法
    [root @test /root ]# tail [-n number] [檔名]
    参数说明:
    -n :显示 number 行
    范例:
    [root @test /root]# tail ~/.bashrc
    [root @test /root]# tail -n 5 ~/.bashrc <==只显示最后面五行!
    说明
    那么有 head 自然就有 tail ( 尾巴 ) 啰!没错!这个 tail 的用法跟 head 的用法差不多类似,只是显示的是后面几行就是了!默认也是显示十行,若要显示非十行,就加 -n number 的参数!

     
    例题一:假如我想要显示 ~/.bashrc 的第 11 到第 20 行呢?
    答:
    这个应该不算难,想一想,在第 11 到第 20 行,那么我取前 20 行,再取后十行,所以结果就是:『 head –n 20 ~/.bashrc | tail –n 10 』,这样就可以得到第 11 到第 20 行之间的内容了!但是里面涉及到管线命令,需要在第三篇的时候才讲的到!
     

  • nl

  • 语法
    [root @test /root ]# nl [檔名]
    参数说明:
    范例:
    [root @test /root]# nl ~/.bashrc
    说明
    那么 nl 又是什么?这也没什么,这个指令的用法跟 cat -n 的用法类似,也就是『可以印出行号』的指令来查看档案啦!也是挺好用的!
     

  • od

  • 语法
    [root @test /root ]# od [檔名]
    参数说明:
    范例:
    [root @test /root]# od ~/.bashrc
    0000000 020043 061056 071541 071150 005143 021412 052440 062563
    0000020 020162 070163 061545 063151 061551 060440 064554 071541
    0000040 071545 060440 062156 063040 067165 072143 067551 071556
    0000060 050012 052101 036510 027442 064542 035156 071457 064542
    0000100 035156 072457 071163 071457 064542 035156 072457 071163
    0000120 061057 067151 027472 071565 027562 067554 060543 027554
    0000140 061163 067151 027472 071565 027562 067554 060543 027554
    0000160 064542 035156 050044 052101 021110 062412 070170 071157
    0000200 020164 040520 044124 005012 066141 060551 020163 066562
    0000220 023475 066562 026440 023551 060412 064554 071541 061440
    0000240 036560 061447 020160 064455 005047 066141 060551 020163
    0000260 073155 023475 073155 026440 023551 021412 060440 064554
    0000300 071541 066040 036554 066047 020163 066055 026440 061455
    0000320 066157 071157 067075 073145 071145 005047 066141 060551
    0000340 020163 066154 023475 071554 026440 023554 060412 064554
    0000360 071541 066040 036555 066047 020163 060455 076154 067555
    0000400 062562 005047 066141 060551 020163 036550 064047 071551
    0000420 067564 074562 005047 021412 051440 072557 061562 020145
    0000440 066147 061157 066141 062040 063145 067151 072151 067551
    0000460 071556 064412 020146 020133 063055 027440 072145 027543
    0000500 060542 064163 061562 056440 020073 064164 067145 004412
    0000520 020056 062457 061564 061057 071541 071150 005143 064546
    0000540 000012
    0000541
    说明
    好了,那么如果有一个非 ASCII 的数据文件呢?例如那个 binary 的档案!使用 vi 根本就是看不着~这个时候看来只有使用将整个数据以数值方法读出来啦!那就是 od 这个指令来读出来呦!这个东西可以用来输出该数据为十进制、16进位等等的数据格式!不过这个东西对于工程师可能比较有用啦!因为印出来的东西都是数字或内存当中的数据~~
    档案与目录权限:
    Linux 文件属性 的内容我们可以知道一个档案有若干个属性,包括 ( r, w, x ) 等基本属性,及是否为目录 (d) 与档案 (-) 或者是连结档 (l) 等等的属性!那么要修改属性的方法在前面也约略提过了,这里再加强补充一下!此外,由于 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 
    说明
    还记得在『文件属性与系统』那一章吧!一个档案或目录至少有九个属性,三个三个一组,共分为三组!而可以使用数字来当作变换属性的参考依据!各属性如下:
    r:4
    w:2
    x:1
    举个例子来说,当一个属性为『-rwxr-xr--』时,那是几分呢?!我们可以将他看成如下『-[rwx][r-x][r--]』三组,所以分数就变成了『[4+2+1][4+0+1][4+0+0]』共有『754』分啦!这样会算吗?!OK!测试一下,底下的分数为几分:
    -r-xr-xr-x
    -rwxrw----
    如果你可以算出『555』与『760』,呵呵!那么你就应该会算啰!所以,如果你要将 .bashrc 设定成所有人都可以读取的话,就下达『 chmod 777 .bashrc 』吧!其中需要特别注意的是,通常我们都会允许个人网页的设定!那么由于个人网页默认是记录在/home/userID/public_html底下,偏偏 /home/userID 的属性为『drwx------』根本就不允许任何人进入!所以,你最少要将你的目录设定成 『drwx--x--x』 才可以!当然也可以设定成『drwxr-xr-x』!不过不建议设定成『777』呦!
     

  • 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 啦!有更棒的指令可以取代呦!那就是 whereislocate 啰!!
    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 等等的信息!并且,也同时提供了是否有使用动态函式库的信息!相当的好用!
    本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
    • 什么是绝对路径与相对路径

    • 答:
        绝对路径的写法为由 / 开始写,至于相对路径则不由 / 开始写!
    • 如何更改一个目录的名称?例如由 /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 的功能时,则当其他人使用这个指令时,该程序将具有指令拥有者的权限。
    • 当我要查询 /usr/bin/passwd 这个档案的一些属性时,可以使用什么指令来查询?

    • 答:
        ls –al, file, lsattr
    • 尝试用 find 找出目前 linux 系统中,所有具有 SUID 的档案有哪些?

    • 答:
        find / -type f –perm –04000 -print

    2002/06/26:第一次完成
    2003/02/06:重新编排与加入 FAQ
    2003/02/07:加入 basenamedirname 的说明
    2004/03/15:将连结档的内容移动至下一章节:Linux 磁盘与硬件管理

    Designed by VBird during 2001-2004.  Aerosol Lab. 

    本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室