• 第七章 Linux文件与目录管理


    1. 目录与路径
        1.1 相对路径与绝对路径
        1.2 目录的相关操作: cd, pwd, mkdir, rmdir
        1.3 关於运行档路径的变量: $PATH
    2. 文件与目录管理
        2.1 文件与目录的检视: ls
        2.2 复制、删除与移动: cp, rm, mv
        2.3 取得路径的文件名称与目录名称
    3. 文件内容查阅:
        3.1 直接检视文件内容: cat, tac, nl
        3.2 可翻页检视: more, less
        3.3 数据撷取: head, tail
        3.4 非纯文字档: od
        3.5 修改文件时间与建置新档: touch
    4. 文件与目录的默认权限与隐藏权限
        4.1 文件默认权限:umask
        4.2 文件隐藏属性: chattr, lsattr
        4.4 文件特殊权限:SUID, SGID, SBIT, 权限配置
        4.3 观察文件类型:file
    5. 命令与文件的搜寻:
        5.1 命令档名的搜寻:which
        5.2 文件档名的搜寻:whereis, locate, find
    6. 极重要!权限与命令间的关系:
    7. 重点回顾
    8. 本章习题
    9. 参考数据与延伸阅读
    10. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23879

    1,目录与路径

    1.1 相对路径与绝对路径
    1.2 目录的相关操作: cd, pwd, mkdir, rmdir
    1.3 关於运行档路径的变量: $PATH

    相对路径与绝对路径
    。。。
    目录的相关操作
    cd(change directory):变换目录
    .			代表此层目录
    ..			代表上层目录
    -			代表前一个工作目录
    ~			代表当前用户身份所在的家目录
    ~account	        代表account这个用户的家目录
    pwd(print working directory):显示当前目录
    pwd [-P]
    -P:显示出确实的路径,而非使用链接(link)路径
    
    mkdir(make directory):建立新目录
    -m XXX:配置文件案的权限,直接设定,不许要看预设权限(umask)的脸色
    注:如果没有加上-m来强制设定属性,系统会使用默认属性
    -p:帮助你直接将所需的目录(包含上层目录)递归的建立起来,如 mkdir test1/test2/test3将出错,而mkdir -p test1/test2/test3将递归的创建这两个目录,并且如果test2本来就存在,系统也不会报错
    注:命令 mkdir -p -m 744 test3/test4 只会将test4的权限设为744,而test3的权限将由系统默认属性决定
    
    rmdir:删除一个空目录
    -p:连同上层[空的]目录一起删除
    注:目录需要一层一层的删除,而且被删除的目录里面必定不能存在其他的目录或档案。
    注:命令rmdir -p test1/test2/test3 ,如果三个目录都是空的,则可以全部删除,若是其中有一个文件夹内有文件,则只能删除到该文件夹,如test1中由其他文件,如下
    hong@PC:/tmp$ mkdir -p test1/test2/test3
    hong@PC:/tmp$ cd test1
    hong@PC:/tmp/test1$ touch file1
    hong@PC:/tmp/test1$ cd ..
    hong@PC:/tmp$ rmdir -p test1/test2/test3/
    rmdir: failed to remove directory ‘test1’: Directory not empty
    hong@PC:/tmp$ cd test1/
    hong@PC:/tmp/test1$ ls
    file1
    
    关于执行文件路径的变量:$PATH
    
    当我们在执行一个指令的时候,如ls,系统会按照PATH的设定无每个PATH定义的目录下
    echo $PATH:查看PATH的设定
    不同身份使用者预设的PATH不同,默认能够随意执行的命令也不同(如root和vbird)
    PATH是可以修改的,所以一般使用者还是可以透过修改PATH来执行某些位于/sbin或/usr/sbin下的指令来查询
    使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻PATH来的正确
    指令应该放置到正确的目录下,执行才会比较方便
    本目录(.)最好不要放在PATH当中
    注:对于PATH更详细的说明
    
    

    2,文件与目录管理

    2.1 文件与目录的检视: ls
    2.2 复制、删除与移动: cp, rm, mv
    2.3 取得路径的文件名称与目录名称

    文件与目录的检视:ls
    
    [root@www ~]# ls [-aAdfFhilnrRSt] 目录名称
    [root@www ~]# ls [--color={never,auto,always}] 目录名称
    [root@www ~]# ls [--full-time] 目录名称
    选项与参数:
    -a  :全部的文件,连同隐藏档( 开头为 . 的文件) 一起列出来(常用)
    -A  :全部的文件,连同隐藏档,但不包括 . 与 .. 这两个目录
    -d  :仅列出目录本身,而不是列出目录内的文件数据(常用)
    -f  :直接列出结果,而不进行排序 (ls 默认会以档名排序!)
    -F  :根据文件、目录等资讯,给予附加数据结构,例如:
          *:代表可运行档; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;
    -h  :将文件容量以人类较易读的方式(例如 GB, KB 等等)列出来;
    -i  :列出 inode 号码,inode 的意义下一章将会介绍;
    -l  :长数据串列出,包含文件的属性与权限等等数据;(常用)
    -n  :列出 UID 与 GID 而非使用者与群组的名称 (UID与GID会在帐号管理提到!)
    -r  :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;
    -R  :连同子目录内容一起列出来,等於该目录下的所有文件都会显示出来;
    -S  :以文件容量大小排序,而不是用档名排序;
    -t  :依时间排序,而不是用档名。
    --color=never  :不要依据文件特性给予颜色显示;
    --color=always :显示颜色
    --color=auto   :让系统自行依据配置来判断是否给予颜色
    --full-time    :以完整时间模式 (包含年、月、日、时、分) 输出
    --time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime),而非内容变更时间 (modification time)
    当你只有下达 ls 时,默认显示的只有:非隐藏档的档名、 以档名进行排序及档名代表的颜色显示如此而已。
    
    复制、删除、移动
    
    cp!
    
    [root@www ~]# cp [-adfilprsu] 来源档(source) 目标档(destination)
    [root@www ~]# cp [options] source1 source2 source3 .... directory
    选项与参数:
    -a  :相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用)
    -d  :若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;
    -f  :为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
    -i  :若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
    -l  :进行硬式连结(hard link)的连结档创建,而非复制文件本身;
    -p  :连同文件的属性一起复制过去,而非使用默认属性(备份常用);
    -r  :递回持续复制,用於目录的复制行为;(常用)
    -s  :复制成为符号连结档 (symbolic link),亦即『捷径』文件;
    -u  :若 destination 比 source 旧才升级 destination !
    最后需要注意的,如果来源档有两个以上,则最后一个目的档一定要是『目录』才行!
    复制(cp)这个命令是非常重要的,不同身份者运行这个命令会有不同的结果产生,尤其是那个-a, -p的选项, 对於不同身份来说,差异则非常的大!
    
    范例一:用root身份,将家目录下的 .bashrc 复制到 /tmp 下,并更名为 bashrc
    [root@www ~]# cp ~/.bashrc /tmp/bashrc
    [root@www ~]# cp -i ~/.bashrc /tmp/bashrc
    cp: overwrite `/tmp/bashrc'? n  <==n不覆盖,y为覆盖
    # 重复作两次动作,由於 /tmp 底下已经存在 bashrc 了,加上 -i 选项后,
    # 则在覆盖前会询问使用者是否确定!可以按下 n 或者 y 来二次确认呢!
    
    范例二:变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性:
    [root@www ~]# cd /tmp
    [root@www tmp]# cp /var/log/wtmp . <==想要复制到目前的目录,最后的 . 不要忘
    [root@www tmp]# ls -l /var/log/wtmp wtmp
    -rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
    -rw-r--r-- 1 root root 96384 Sep 24 14:06 wtmp
    # 注意上面的特殊字体,在不加任何选项的情况下,文件的某些属性/权限会改变;
    # 这是个很重要的特性!要注意喔!还有,连文件创建的时间也不一样了!
    # 那如果你想要将文件的所有特性都一起复制过来该怎办?可以加上 -a 喔!如下所示:
    [root@www tmp]# cp -a /var/log/wtmp wtmp_2
    [root@www tmp]# ls -l /var/log/wtmp wtmp_2
    -rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
    -rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 wtmp_2
    # 了了吧!整个数据特性完全一模一样ㄟ!真是不赖~这就是 -a 的特性!
    
    一般来说,我们如果去复制别人的数据 (当然,该文件你必须要有 read 的权限才行啊! ^_^) 时, 总是希望复制到的数据最后是我们自己的,所以,在默认的条件中, cp 的来源档与目的档的权限是不同的,目的档的拥有者通常会是命令操作者本身。
    
    由於具有这个特性,因此当我们在进行备份的时候,某些需要特别注意的特殊权限文件, 例如密码档 (/etc/shadow) 以及一些配置档,就不能直接以 cp 来复制,而必须要加上 -a 或者是 -p 等等可以完整复制文件权限的选项才行!另外,如果你想要复制文件给其他的使用者, 也必须要注意到文件的权限(包含读、写、运行以及文件拥有者等等), 否则,其他人还是无法针对你给予的文件进行修订的动作喔!注意注意!
    
    范例三:复制 /etc/ 这个目录下的所有内容到 /tmp 底下
    [root@www tmp]# cp /etc/ /tmp
    cp: omitting directory `/etc'   <== 如果是目录则不能直接复制,要加上 -r 的选项
    [root@www tmp]# cp -r /etc/ /tmp
    # 还是要再次的强调喔! -r 是可以复制目录,但是,文件与目录的权限可能会被改变
    # 所以,也可以利用『 cp -a /etc /tmp 』来下达命令喔!尤其是在备份的情况下!
    
    范例四:将范例一复制的 bashrc 创建一个连结档 (symbolic link)
    [root@www tmp]# ls -l bashrc
    -rw-r--r-- 1 root root 176 Sep 24 14:02 bashrc  <==先观察一下文件情况
    [root@www tmp]# cp -s bashrc bashrc_slink
    [root@www tmp]# cp -l bashrc bashrc_hlink
    [root@www tmp]# ls -l bashrc*
    -rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc  <==与原始文件不太一样了!
    -rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc_hlink
    lrwxrwxrwx 1 root root   6 Sep 24 14:20 bashrc_slink -> bashrc
    
    范例五:若 ~/.bashrc 比 /tmp/bashrc 新才复制过来
    [root@www tmp]# cp -u ~/.bashrc /tmp/bashrc
    # 这个 -u 的特性,是在目标文件与来源文件有差异时,才会复制的。
    # 所以,比较常被用於『备份』的工作当中喔! ^_^
    
    范例六:将范例四造成的 bashrc_slink 复制成为 bashrc_slink_1 与bashrc_slink_2
    [root@www tmp]# cp bashrc_slink bashrc_slink_1
    [root@www tmp]# cp -d bashrc_slink bashrc_slink_2
    [root@www tmp]# ls -l bashrc bashrc_slink*
    -rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc
    lrwxrwxrwx 1 root root   6 Sep 24 14:20 bashrc_slink -> bashrc
    -rw-r--r-- 1 root root 176 Sep 24 14:32 bashrc_slink_1       <==与原始文件相同
    lrwxrwxrwx 1 root root   6 Sep 24 14:33 bashrc_slink_2 
    例题:
    你能否使用vbird的身份,完整的复制/var/log/wtmp文件到/tmp底下,并更名为vbird_wtmp呢?
    答:
    实际做看看的结果如下:
    
    [vbird@www ~]$ cp -a /var/log/wtmp /tmp/vbird_wtmp
    [vbird@www ~]$ ls -l /var/log/wtmp /tmp/vbird_wtmp
    -rw-rw-r-- 1 vbird vbird 96384  9月 24 11:54 /tmp/vbird_wtmp
    -rw-rw-r-- 1 root  utmp  96384  9月 24 11:54 /var/log/wtmp
    由於vbird的身份并不能随意修改文件的拥有者与群组,因此虽然能够复制wtmp的相关权限与时间等属性, 但是与拥有者、群组相关的,原本vbird身份无法进行的动作,即使加上 -a 选项,也是无法达成完整复制权限的-> bashrc <==是连结档!
    # 这个例子也是很有趣喔!原本复制的是连结档,但是却将连结档的实际文件复制过来了
    # 也就是说,如果没有加上任何选项时,cp复制的是原始文件,而非连结档的属性!
    # 若要复制连结档的属性,就得要使用 -d 的选项了!如 bashrc_slink_2 所示。
    范例七:将家目录的 .bashrc 及 .bash_history 复制到 /tmp 底下
    [root@www tmp]# cp ~/.bashrc ~/.bash_history /tmp
    # 可以将多个数据一次复制到同一个目录去!最后面一定是目录
    
    注:在复制时,你必须要清楚的了解到:
    是否需要完整的保留来源文件的资讯?
    来源文件是否为连结档 (symbolic link file)?
    来源档是否为特殊的文件,例如 FIFO, socket 等?
    来源档是否为目录?
    
    rm (移除文件或目录)
    [root@www ~]# rm [-fir] 文件或目录
    选项与参数:
    -f  :就是 force 的意思,忽略不存在的文件,不会出现警告信息;
    -i  :互动模式,在删除前会询问使用者是否动作
    -r  :递回删除啊!最常用在目录的删除了!这是非常危险的选项!!!
    
    范例一:将刚刚在 cp 的范例中创建的 bashrc 删除掉!
    [root@www ~]# cd /tmp
    [root@www tmp]# rm -i bashrc
    rm: remove regular file `bashrc'? y
    # 如果加上 -i 的选项就会主动询问喔,避免你删除到错误的档名!
    
    范例二:透过万用字节*的帮忙,将/tmp底下开头为bashrc的档名通通删除:
    [root@www tmp]# rm -i bashrc*
    # 注意那个星号,代表的是 0 到无穷多个任意字节喔!很好用的东西!
    
    范例三:将 cp 范例中所创建的 /tmp/etc/ 这个目录删除掉!
    [root@www tmp]# rmdir /tmp/etc
    rmdir: etc: Directory not empty  <== 删不掉啊!因为这不是空的目录!
    [root@www tmp]# rm -r /tmp/etc
    rm: descend into directory `/tmp/etc'? y
    ....(中间省略)....
    # 因为身份是 root ,默认已经加入了 -i 的选项,所以你要一直按 y 才会删除!
    # 如果不想要继续按 y ,可以按下『 [ctrl]-c 』来结束 rm 的工作。
    # 这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做:
    [root@www tmp]# 
    m -r /tmp/etc
    # 在命令前加上反斜线,可以忽略掉 alias 的指定选项喔!至於 alias 我们在bash再谈!
    
    范例四:删除一个带有 - 开头的文件
    [root@www tmp]# touch ./-aaa-  <==touch这个命令可以创建空文件!
    [root@www tmp]# ls -l 
    -rw-r--r-- 1 root  root      0 Sep 24 15:03 -aaa-  <==文件大小为0,所以是空文件
    [root@www tmp]# rm -aaa-
    Try `rm --help' for more information.  <== 因为 "-" 是选项嘛!所以系统误判了!
    [root@www tmp]# rm ./-aaa-
    其实还有一种方法,那就是『 rm -- -aaa- 』也可以啊!
    
    
    mv(移动档案与目录,或更名)
    
    [root@www ~]# mv [-fiu] source destination
    [root@www ~]# mv [options] source1 source2 source3 .... directory
    选项与参数:
    -f  :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
    -i  :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
    -u  :若目标文件已经存在,且 source 比较新,才会升级 (update)
    
    范例一:复制一文件,创建一目录,将文件移动到目录中
    [root@www ~]# cd /tmp
    [root@www tmp]# cp ~/.bashrc bashrc
    [root@www tmp]# mkdir mvtest
    [root@www tmp]# mv bashrc mvtest
    # 将某个文件移动到某个目录去,就是这样做!
    范例二:将刚刚的目录名称更名为 mvtest2
    [root@www tmp]# mv mvtest mvtest2 <== 这样就更名了!简单~
    # 其实在 Linux 底下还有个有趣的命令,名称为 rename ,
    # 该命令专职进行多个档名的同时更名,并非针对单一档名变更,与mv不同。请man rename。
    范例三:再创建两个文件,再全部移动到 /tmp/mvtest2 当中
    [root@www tmp]# cp ~/.bashrc bashrc1
    [root@www tmp]# cp ~/.bashrc bashrc2
    [root@www tmp]# mv bashrc1 bashrc2 mvtest2
    # 注意到这边,如果有多个来源文件或目录,则最后一个目标档一定是『目录!』
    # 意思是说,将所有的数据移动到该目录的意思!
    
    取得路径的文件名称与目录名称
    [root@www ~]# basename /etc/sysconfig/network
    network         <== 很简单!就取得最后的档名~
    [root@www ~]# dirname /etc/sysconfig/network
    /etc/sysconfig  <== 取得的变成目录名了!
    

    3、文件内容查阅

    3.1 直接检视文件内容: cat, tac, nl
    3.2 可翻页检视: more, less
    3.3 数据撷取: head, tail
    3.4 非纯文字档: od
    3.5 修改文件时间与建置新档: touch

    cat  由第一行开始显示文件内容
    tac  从最后一行开始显示,可以看出 tac 是 cat 的倒著写!
    nl   显示的时候,顺道输出行号!
    more 一页一页的显示文件内容
    less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
    head 只看头几行
    tail 只看尾巴几行
    od   以二进位的方式读取文件内容!
    
    直接检查文件内容***************************************************************
    
    cat(concatenate):
    正向列示
    
    [root@www ~]# cat [-AbEnTv]
    选项与参数:
    -A  :相当於 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
    -b  :列出行号,仅针对非空白行做行号显示,空白行不标行号!
    -E  :将结尾的断行字节 $ 显示出来;
    -n  :列印出行号,连同空白行也会有行号,与 -b 的选项不同;
    -T  :将 [tab] 按键以 ^I 显示出来;
    -v  :列出一些看不出来的特殊字符
    
    tac(反向列示)
    由最后一行到第一行反向在屏幕上显示出来
    
    nl(添加行号列印)
    
    [root@www ~]# nl [-bnw] 文件
    选项与参数:
    -b  :指定行号指定的方式,主要有两种:
          -b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
          -b t :如果有空行,空的那一行不要列出行号(默认值);(类似cat -b)
    -n  :列出行号表示的方法,主要有三种:
          -n ln :行号在萤幕的最左方显示;
          -n rn :行号在自己栏位的最右方显示,且不加 0 ;
          -n rz :行号在自己栏位的最右方显示,且加 0 ;
    -w  :行号栏位的占用的位数。
    
    范例一:用 nl 列出 /etc/issue 的内容
    [root@www ~]# nl /etc/issue
         1  CentOS release 5.3 (Final)
         2  Kernel 
     on an m
    
    # 注意看,这个文件其实有三行,第三行为空白(没有任何字节),
    # 因为他是空白行,所以 nl 不会加上行号喔!如果确定要加上行号,可以这样做:
    
    [root@www ~]# nl -b a /etc/issue
         1  CentOS release 5.3 (Final)
         2  Kernel 
     on an m
         3
    # 呵呵!行号加上来罗~那么如果要让行号前面自动补上 0 呢?可这样
    
    [root@www ~]# nl -b a -n rz /etc/issue
    000001  CentOS release 5.3 (Final)
    000002  Kernel 
     on an m
    000003
    # 嘿嘿!自动在自己栏位的地方补上 0 了~默认栏位是六位数,如果想要改成 3 位数?
    
    [root@www ~]# nl -b a -n rz -w 3 /etc/issue
    001     CentOS release 5.3 (Final)
    002     Kernel 
     on an m
    003
    # 变成仅有 3 位数罗~
    
    注:nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能呢。
    
    可翻页检视
    
    more
    空白键 (space):代表向下翻一页;
    Enter         :代表向下翻『一行』;
    /字串         :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
    :f            :立刻显示出档名以及目前显示的行数;
    q             :代表立刻离开 more ,不再显示该文件内容。
    b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
    输入了 / 之后,光标就会跑到最底下一行,并且等待你的输入, 你输入了字串并按下[enter]之后,嘿嘿! more 就会开始向下搜寻该字串罗~而重复搜寻同一个字串, 可以直接按下 n 即可啊!
    
    less(一页一页翻动)(less更强一点)
    空白键    :向下翻动一页;
    [pagedown]:向下翻动一页;
    [pageup]  :向上翻动一页;
    /字串     :向下搜寻『字串』的功能;
    ?字串     :向上搜寻『字串』的功能;
    n         :重复前一个搜寻 (与 / 或 ? 有关!)
    N         :反向的重复前一个搜寻 (与 / 或 ? 有关!)
    q         :离开 less 这个程序;
    注:因为man这个命令就是呼叫 less 来显示说明文件的内容的! 现在你是否觉得 less 很重要呢? ^_^
    
    
    数据撷取***************************************************
    
    head(取出前面几行)
    
    [root@www ~]# head [-n number] 文件 
    选项与参数:
    -n  :后面接数字,代表显示几行的意思
    
    [root@www ~]# head /etc/man.config
    # 默认的情况中,显示前面十行!若要显示前 20 行,就得要这样:
    [root@www ~]# head -n 20 /etc/man.config
    
    范例:如果后面100行的数据都不列印,只列印/etc/man.config的前面几行,该如何是好?
    [root@www ~]# head -n -100 /etc/man.config 	
    
    tail(取出后面几行)
    
    [root@www ~]# tail [-n number] 文件 
    选项与参数:
    -n  :后面接数字,代表显示几行的意思
    -f  :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测
    
    [root@www ~]# tail /etc/man.config
    # 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:
    [root@www ~]# tail -n 20 /etc/man.config
    
    范例一:如果不知道/etc/man.config有几行,却只想列出100行以后的数据时?
    [root@www ~]# tail -n +100 /etc/man.config
    
    范例二:持续侦测/var/log/messages的内容
    [root@www ~]# tail -f /var/log/messages
      <==要等到输入[crtl]-c之后才会离开tail这个命令的侦测!
    
    例题:
    假如我想要显示 /etc/man.config 的第 11 到第 20 行呢?
    答:
    这个应该不算难,想一想,在第 11 到第 20 行,那么我取前 20 行,再取后十行,所以结果就是:『 head -n 20 /etc/man.config | tail -n 10 』,这样就可以得到第 11 到第 20 行之间的内容了! 但是里面涉及到管线命令,需要在第三篇的时候才讲的到!
    注:也可使用命令  tail -n +11 /etc/man.config | head -n 10 
    
    非纯文字档:od *****************************************************
    
    [root@www ~]# od [-t TYPE] 文件
    选项或参数:
    -t  :后面可以接各种『类型 (TYPE)』的输出,例如:
          a       :利用默认的字节来输出;
          c       :使用 ASCII 字节来输出
          d[size] :利用十进位(decimal)来输出数据,每个整数占用 size bytes ;
          f[size] :利用浮点数值(floating)来输出数据,每个数占用 size bytes ;
          o[size] :利用八进位(octal)来输出数据,每个整数占用 size bytes ;
          x[size] :利用十六进位(hexadecimal)来输出数据,每个整数占用 size bytes ;
    
    范例一:请将/usr/bin/passwd的内容使用ASCII方式来展现!
    [root@www ~]# od -t c /usr/bin/passwd
    0000000 177   E   L   F 001 001 001                  
    0000020 002   003   001       260 225 004     4      
    0000040 020   E               4          a     (  
    0000060 035   034   006         4         4 200 004  
    0000100   4 200 004   340       340       005      
    .....(后面省略)....
    # 最左边第一栏是以 8 进位来表示bytes数。以上面范例来说,第二栏0000020代表开头是
    # 第 16 个 byes (2x8) 的内容之意。
    
    范例二:请将/etc/issue这个文件的内容以8进位列出储存值与ASCII的对照表
    [root@www ~]# od -t oCc /etc/issue
    0000000 103 145 156 164 117 123 040 162 145 154 145 141 163 145 040 065
              C   e   n   t   O   S       r   e   l   e   a   s   e       5
    0000020 056 062 040 050 106 151 156 141 154 051 012 113 145 162 156 145
              .   2       (   F   i   n   a   l   )  
       K   e   r   n   e
    0000040 154 040 134 162 040 157 156 040 141 156 040 134 155 012 012
              l          r       o   n       a   n          m  
      
    
    0000057
    # 如上所示,可以发现每个字节可以对应到的数值为何!
    # 例如e对应的记录数值为145,转成十进位:1x8^2+4x8+5=101。
    
    利用这个命令,可以将 data file 或者是 binary file 的内容数据给他读出来喔! 虽然读出的来数值默认是使用非文字档,亦即是 16 进位的数值来显示的, 不过,我们还是可以透过 -t c 的选项与参数来将数据内的字节以 ASCII 类型的字节来显示, 虽然对於一般使用者来说,这个命令的用处可能不大,但是对於工程师来说, 这个命令可以将 binary file 的内容作一个大致的输出,他们可以看得出东西的啦~ ^_^
    
    
    修改文件时间或新建文档*****************************************
    每个文件在linux底下都会记录许多的时间参数, 其实是有三个主要的变动时间,那么三个时间的意义是什么呢:
    
    modification time (mtime):
    当该文件的『内容数据』变更时,就会升级这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!
    
    status time (ctime):
    当该文件的『状态 (status)』改变时,就会升级这个时间,举例来说,像是权限与属性被更改了,都会升级这个时间啊。 (?文件的属性包括哪些?所属组,所属用户?)
    
    access time (atime):
    当『该文件的内容被取用』时,就会升级这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man.config , 就会升级该文件的 atime 了。
    注:在ubuntu 14.04下,cat不会更新atime,但在centos 6.6中,cat会更新atime
    
    [root@www ~]# ls -l /etc/man.config
    -rw-r--r-- 1 root root 4617 Jan  6  2007 /etc/man.config
    [root@www ~]# ls -l --time=atime /etc/man.config
    -rw-r--r-- 1 root root 4617 Sep 25 17:54 /etc/man.config
    [root@www ~]# ls -l --time=ctime /etc/man.config
    -rw-r--r-- 1 root root 4617 Sep  4 18:03 /etc/man.config
    
    在默认的情况下,ls 显示出来的是该文件的 mtime ,也就是这个文件的内容上次被更动的时间。
    注:文件的时间是很重要的,因为,如果文件的时间误判的话,可能会造成某些程序无法顺利的运行。 OK!那么万一我发现了一个文件来自未来,该如何让该文件的时间变成『现在』的时刻呢? 很简单啊!就用『touch』这个命令即可!
    
    
    [root@www ~]# touch [-acdmt] 文件
    选项与参数:
    -a  :仅修订 access time;
    -c  :仅修改文件的时间,若该文件不存在则不创建新文件;
    -d  :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
    -m  :仅修改 mtime ;
    -t  :后面可以接欲修订的时间而不用目前的时间,格式为[YYMMDDhhmm]
    
    范例一:新建一个空的文件并观察时间
    [root@www ~]# cd /tmp
    [root@www tmp]# touch testtouch
    [root@www tmp]# ls -l testtouch
    -rw-r--r-- 1 root root 0 Sep 25 21:09 testtouch
    # 注意到,这个文件的大小是 0 呢!在默认的状态下,如果 touch 后面有接文件,
    # 则该文件的三个时间 (atime/ctime/mtime) 都会升级为目前的时间。若该文件不存在,
    # 则会主动的创建一个新的空的文件喔!例如上面这个例子!
    
    范例二:将 ~/.bashrc 复制成为 bashrc,假设复制完全的属性,检查其日期
    [root@www tmp]# cp -a ~/.bashrc bashrc
    [root@www tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
    -rw-r--r-- 1 root root 176 Jan  6  2007 bashrc  <==这是 mtime
    -rw-r--r-- 1 root root 176 Sep 25 21:11 bashrc  <==这是 atime
    -rw-r--r-- 1 root root 176 Sep 25 21:12 bashrc  <==这是 ctime
    
    注:数据的内容与属性是被复制过来的,因此文件内容时间(mtime)与原文件相同,但是由于这个文件是刚被创建的,所以状态时间(ctime)与读取时间就便呈现在的时间了。
    
    
    范例三:修改案例二的 bashrc 文件,将日期调整为两天前
    [root@www tmp]# touch -d "2 days ago" bashrc
    [root@www tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
    -rw-r--r-- 1 root root 176 Sep 23 21:23 bashrc
    -rw-r--r-- 1 root root 176 Sep 23 21:23 bashrc
    -rw-r--r-- 1 root root 176 Sep 25 21:23 bashrc
    # 跟上个范例比较看看,本来是 25 日的变成了 23 日了 (atime/mtime)~
    # 不过, ctime 并没有跟著改变喔!
    
    范例四:将上个范例的 bashrc 日期改为 2007/09/15 2:02
    [root@www tmp]# touch -t 0709150202 bashrc
    [root@www tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
    -rw-r--r-- 1 root root 176 Sep 15  2007 bashrc
    -rw-r--r-- 1 root root 176 Sep 15  2007 bashrc
    -rw-r--r-- 1 root root 176 Sep 25 21:25 bashrc
    # 注意看看,日期在 atime 与 mtime 都改变了,但是 ctime 则是记录目前的时间!
    
    由以上的案例可知:即使我们复制一个文件时,复制所有的属性,但也没有办法复制ctime这个属性的。ctime可以记录这个文件最近的状态(status)被改变的时间。
    
    无论如何, touch 这个命令最常被使用的情况是:
    创建一个空的文件;
    将某个文件日期修订为目前 (mtime 与 atime)
    

    4、文件与目录的默认权限与隐藏权限

    4.1 文件默认权限:umask
    4.2 文件隐藏属性: chattr, lsattr
    4.4 文件特殊权限:SUID, SGID, SBIT, 权限配置
    4.3 观察文件类型:file

    文件的默认权限********************************************************
    
    注:文件的属性有:读写运行(rwx)等基本权限、是否为目录(d)、是否为文件(-)或是连接档(l)等等的属性,(未完待续)
    
    在Linux的Ext2/Ext3文件系统下,还可以配置其他的系统隐藏属性,这部分可由chattr来配置,以lsattr来查看。最重要的属性是配置其不可修改的特性,让连文件的拥有者都不能进行修改!!!
    
    umask,用来制定目前使用者在创建文件或目录时的权限默认值
    
    umask的查阅方式:
    [root@www ~]# umask
    0022             <==与一般权限有关的是后面三个数字!
    [root@www ~]# umask -S
    u=rwx,g=rx,o=rx
    
    在默认权限的属性上,目录与文件是不一样的。从第六章我们知道 x 权限对於目录是非常重要的! 但是一般文件的创建则不应该有运行的权限,因为一般文件通常是用在於数据的记录嘛!当然不需要运行的权限了。 因此,默认的情况如下:
    
    若使用者创建为『文件』则默认『没有可运行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下:
    -rw-rw-rw-
    
    若使用者创建为『目录』,则由於 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下:
    drwxrwxrwx
    
    如果以上面的例子来说明的话,因为 umask 为 022 ,所以 user 并没有被拿掉任何权限,不过 group 与 others 的权限被拿掉了 2 (也就是 w 这个权限),那么当使用者:
    
    创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
    创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
    
    umask的利用与重要性:专题制作
    
    配置umask
    
    [root@www ~]# umask 002
    [root@www ~]# touch test3
    [root@www ~]# mkdir test4
    [root@www ~]# ll 
    -rw-rw-r-- 1 root root     0 Sep 27 00:36 test3
    drwxrwxr-x 2 root root  4096 Sep 27 00:36 test4
    
    umask 对於新建文件与目录的默认权限是很有关系的!这个概念可以用在任何服务器上面, 尤其是未来在你架设文件服务器 (file server) ,举例来说, SAMBA Server 或者是 FTP server 时, 都是很重要的观念!这牵涉到你的使用者是否能够将文件进一步利用的问题喔!不要等闲视之!
    
    例题:
    假设你的 umask 为 003 ,请问该 umask 情况下,创建的文件与目录权限为?
    答:
    umask 为 003 ,所以拿掉的权限为 --------wx,因此:
    文件: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
    目录: (drwxrwxrwx) - (--------wx) = drwxrwxr--
    
    注:(!!!)有的书籍或者是 BBS 上面的朋友,喜欢使用文件默认属性 666 与目录默认属性 777 来与 umask 进行相减的计算~这是不好的喔!以上面例题来看, 如果使用默认属性相加减,则文件变成:666-003=663,亦即是 -rw-rw--wx ,这可是完全不对的喔! 想想看,原本文件就已经去除 x 的默认属性了,怎么可能突然间冒出来了? 所以,这个地方得要特别小心喔!
    最好用符号的方式来计算,清晰不易出错
    
    在默认的情况中, root 的 umask 会拿掉比较多的属性,root 的 umask 默认是 022 , 这是基於安全的考量啦~至於一般身份使用者,通常他们的 umask 为 002 ,亦即保留同群组的写入权力! 
    
    关於默认 umask 的配置可以参考 /etc/bashrc 这个文件的内容,不过,不建议修改该文件, 你可以参考第十一章 bash shell 提到的环境参数配置档 (~/.bashrc) 的说明!
    
    文件的隐藏属性***************************************
    
    不过要先强调的是,底下的chattr命令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个命令了。
    
    chatter(配置文件的隐藏属性)change file attributes on a Linux file system
    
    [root@www ~]# chattr [+-=][ASacdistu] 文件或目录名称
    选项与参数:
    +   :添加某一个特殊参数,其他原本存在参数则不动。
    -   :移除某一个特殊参数,其他原本存在参数则不动。
    =   :配置一定,且仅有后面接的参数
    
    A  :当配置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime
         将不会被修改,可避免I/O较慢的机器过度的存取磁碟。这对速度较慢的计算机有帮助
    S  :一般文件是非同步写入磁碟的(原理请参考第五章sync的说明),如果加上 S 这个
         属性时,当你进行任何文件的修改,该更动会『同步』写入磁碟中。
    a  :当配置 a 之后,这个文件将只能添加数据,而不能删除也不能修改数据,只有root 
         才能配置这个属性。 
    c  :这个属性配置之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩,
         但是在储存的时候,将会先进行压缩后再储存(看来对於大文件似乎蛮有用的!)
    d  :当 dump 程序被运行的时候,配置 d 属性将可使该文件(或目录)不会被 dump 备份
    i  :这个 i 可就很厉害了!他可以让一个文件『不能被删除、改名、配置连结也无法
         写入或新增数据!』对於系统安全性有相当大的助益!只有 root 能配置此属性
    s  :当文件配置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘
         空间,所以如果误删了,完全无法救回来了喔!
    u  :与 s 相反的,当使用 u 来配置文件时,如果该文件被删除了,则数据内容其实还
         存在磁碟中,可以使用来救援该文件喔!
    注意:属性配置常见的是 a 与 i 的配置值,而且很多配置值必须要身为 root 才能配置
    
    范例:请尝试到/tmp底下创建文件,并加入 i 的参数,尝试删除看看。
    [root@www ~]# cd /tmp
    [root@www tmp]# touch attrtest     <==创建一个空文件
    [root@www tmp]# chattr +i attrtest <==给予 i 的属性
    [root@www tmp]# rm attrtest        <==尝试删除看看
    rm: remove write-protected regular empty file `attrtest'? y
    rm: cannot remove `attrtest': Operation not permitted  <==操作不许可
    # 看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除配置!
    
    范例:请将该文件的 i 属性取消!
    [root@www tmp]# chattr -i attrtest
    
    这个命令是很重要的,尤其是在系统的数据安全上面!
    注:vbird认为,最终要的当属+i和+a这个属性了,+i可以让一个文件无法被更动
    注:如果是log file这种文档,就更需要+a这个可以添加但不能修改旧有的数据与删除的参数了。
    
    lsattr(显示文件隐藏属性)list file attributes on a Linux second extend file system
    
    [root@www ~]# lsattr [-adR] 文件或目录
    选项与参数:
    -a :将隐藏档的属性也秀出来;
    -d :如果接的是目录,仅列出目录本身的属性而非目录内的档名;
    -R :连同子目录的数据也一并列出来! 
    
    [root@www tmp]# chattr +aij attrtest
    [root@www tmp]# lsattr attrtest
    ----ia---j--- attrtest
    
    文件的特殊权限*********************************************
    
    [root@www ~]# ls -ld /tmp ; ls -l /usr/bin/passwd
    drwxrwxrwt 7 root root 4096 Sep 27 18:23 /tmp
    -rwsr-xr-x 1 root root 22984 Jan  7  2007 /usr/bin/passwd
    
    因为 s 与 t 这两个权限的意义与系统的帐号 (第十四章)及系统的程序(process, 第十七章)较为相关, 所以等到后面的章节谈完后你才会比较有概念!
    
    Set UID
    
    当 s 这个标志出现在文件拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个文件的权限状态:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 的特殊权限。基本上SUID有这样的限制与功能:
    1、SUID 权限仅对二进位程序(binary program)有效;
    2、运行者对於该程序需要具有 x 的可运行权限;
    3、本权限仅在运行该程序的过程中有效 (run-time);
    4、运行者将具有该程序拥有者 (owner) 的权限。
    
    举个例子来说:Linux系统中,所有账号的密码都记录在/etc/shadow这个文件里面,vbird账号不具有w权限,但可以修改这个文件内的密码,因为
    vbird 对於 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 vbird 能运行 passwd;
    passwd 的拥有者是 root 这个帐号;
    vbird 运行 passwd 的过程中,会『暂时』获得 root 的权限;
    /etc/shadow 就可以被 vbird 所运行的 passwd 所修改。
    
    注意:SUID 仅可用在binary program 上, 不能够用在 shell script 上面!这是因为 shell script 只是将很多的 binary 运行档叫进来运行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的配置, 而不是 shell script 本身。当然,SUID 对於目录也是无效的~这点要特别留意。
    
    Set GID
    
    当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID 罗!
    [root@www ~]# ls -l /usr/bin/locate   (ubuntu 14.04 不同)(centos 6.6 中,符合)
    注:由于ubuntu 14.04 与 centos 6.6 关于文件的权限配置方面差别很大,所以,绝对实验尽量在 centos 6.6 上进行
    -rwx--s--x 1 root slocate 23856 Mar 15  2007 /usr/bin/locate
    
    与 SUID 不同的是,SGID 可以针对文件或目录来配置!
    
    如果是对文件来说, SGID 有如下的功能:
    SGID 对二进位程序有用;
    程序运行者对於该程序来说,需具备 x 的权限;
    运行者在运行的过程中将会获得该程序群组的支持!
    
    举例来说,上面的 /usr/bin/locate 这个程序可以去搜寻 /var/lib/mlocate/mlocate.db 这个档案的内容,mlocate.db的权限如下
    [root@www ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
    -rwx--s--x 1 root slocate   23856 Mar 15  2007 /usr/bin/locate
    -rw-r----- 1 root slocate 3175776 Sep 28 04:02 /var/lib/mlocate/mlocate.db
    
    除了 binary program 之外,SGID也能够用在目录上,当一个目录设定了 SGID 的权限后,他将具有如下功能:
    
    用户若对此目录具有r与x的权限时,该用户能够进入此目录;
    用户在此目录下的有效组(effective group) 将会变成该目录的群组;
    用途:若用户在此目录下具有 w 的权限(可以新建档案),则使用者所建立的新档案,该档案的群组与此目录的群组相同
    
    注:SGID对于项目开发来说是非常重要的,因为这涉及群组权限的问题,参考本章后续情境模拟的案例
    
    Stick Bit
    
    SBIT 目前只针对目录有效,对于档案没有效果。
    SBIT对于目录的作用是:
    当用户对于此目录具有w、x权限,亦即具有写入的权限时;
    当用户在该目录下简历档案或目录时,仅由自己与root才由权利删除该档案
    
    换句话说:当甲这个用户于A目录具有群组或其他人的身份,并且拥有该目录的w权限,这表示甲用户对该目录内任何人建立的目录或档案均可进行删除、更名、搬移等动作,如果将A目录加上了SBIT的权限项目时,则甲只能够针对自己建立的档案或目录进行删除、更名、搬移等动作,而无法删除他人的档案
    
    举例来说,我们的/tmp本身的权限是 drwxrwxrwt ,在这样的权限内容下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。
    
    注:由於 SUID/SGID/SBIT 牵涉到程序的概念,因此再次强调,这部份的数据在您读完第十七章关於程序方面的知识后,要再次的回来瞧瞧喔! 
    
    SUID/SGID/SBIT 权限配置
    
    数字法:
    4 为 SUID
    2 为 SGID
    1 为 SBIT
    
    Tips:
    注意:底下的范例只是练习而已,所以鸟哥使用同一个文件来配置,你必须了解 SUID 不是用在目录上,而 SBIT 不是用在文件上的喔!
    [root@www ~]# cd /tmp
    [root@www tmp]# touch test                  <==创建一个测试用空档
    [root@www tmp]# chmod 4755 test; ls -l test <==加入具有 SUID 的权限
    -rwsr-xr-x 1 root root 0 Sep 29 03:06 test
    [root@www tmp]# chmod 6755 test; ls -l test <==加入具有 SUID/SGID 的权限
    -rwsr-sr-x 1 root root 0 Sep 29 03:06 test
    [root@www tmp]# chmod 1755 test; ls -l test <==加入 SBIT 的功能!
    -rwxr-xr-t 1 root root 0 Sep 29 03:06 test
    [root@www tmp]# chmod 7666 test; ls -l test <==具有空的 SUID/SGID 权限
    -rwSrwSrwT 1 root root 0 Sep 29 03:06 test
    
    最后一个例子就要特别小心啦!怎么会出现大写的 S 与 T 呢?不都是小写的吗? 因为 s 与 t 都是取代 x 这个权限的,但是你有没有发现阿,我们是下达 7666 喔!也就是说, user, group 以及 others 都没有 x 这个可运行的标志( 因为 666 嘛 ),所以,这个 S, T 代表的就是『空的』啦!怎么说? SUID 是表示『该文件在运行的时候,具有文件拥有者的权限』,但是文件 拥有者都无法运行了,哪里来的权限给其他人使用?当然就是空的啦! ^_^
    
    符号法:
    SUID 为 u+s
    SGID 为 g+s
    SBIT 为 o+t
    
    观察文件类型:fiile
    
    如果你想要知道某个文件的基本数据,例如是属於 ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函式库 (share library) 等等的资讯,就可以利用 file 这个命令来检阅喔!
    
    [root@www ~]# file ~/.bashrc
    /root/.bashrc: ASCII text  <==告诉我们是 ASCII 的纯文字档啊!
    [root@www ~]# file /usr/bin/passwd
    /usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1 
    (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for 
    GNU/Linux 2.6.9, stripped
    # 运行档的数据可就多的不得了!包括这个文件的 suid 权限、兼容於 Intel 386
    # 等级的硬件平台、使用的是 Linux 核心 2.6.9 的动态函式库连结等等。
    [root@www ~]# file /var/lib/mlocate/mlocate.db
    /var/lib/mlocate/mlocate.db: data  <== 这是 data 文件!
    
    透过这个命令,我们可以简单的先判断这个文件的格式为何喔!
    
    

    5、命令与文件的搜寻

    5.1 命令档名的搜寻:which
    5.2 文件档名的搜寻:whereis, locate, find

    命令档名的搜寻:

    which(寻找运行档)
    
    我们常常需要知道那个文件放在哪里,才能够对该文件进行一些修改或维护等动作。 有些时候某些软件配置档的档名是不变的,但是各 distribution 放置的目录则不同。 此时就得要利用一些搜寻命令将该配置档的完整档名捉出来,这样才能修改嘛!
    
    [root@www ~]# which [-a] command
    选项或参数:
    -a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称
    
    范例一:分别用root与一般帐号搜寻 ifconfig 这个命令的完整档名
    [root@www ~]# which ifconfig
    /sbin/ifconfig            <==用 root 可以找到正确的运行档名喔!
    [root@www ~]# su - vbird <==切换身份成为 vbird 去!
    [vbird@www ~]$ which ifconfig
    /usr/bin/which: no ifconfig in (/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
    :/home/vbird/bin)         <==见鬼了!竟然一般身份帐号找不到!
    # 因为 which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以,
    # 不同的 PATH 配置内容所找到的命令当然不一样啦!因为 /sbin 不在 vbird 的 
    # PATH 中,找不到也是理所当然的啊!了乎?
    [vbird@www ~]$ exit      <==记得将身份切换回原本的 root
    
    范例二:用 which 去找出 which 的档名为何?
    [root@www ~]# which which
    alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot '
            /usr/bin/which
    # 竟然会有两个 which ,其中一个是 alias 这玩意儿呢!那是啥?
    # 那就是所谓的『命令别名』,意思是输入 which 会等於后面接的那串命令啦!
    # 更多的数据我们会在 bash 章节中再来谈的!
    
    范例三:请找出 cd 这个命令的完整档名
    [root@www ~]# which cd
    /usr/bin/which: no cd in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin
    :/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
    # 瞎密?怎么可能没有 cd ,我明明就能够用 root 运行 cd 的啊!
    
    因为 cd 是『bash 内建的命令』。 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的啊!我们可以透过 type 这个命令喔! 关於 type 的用法我们将在 第十一章的 bash 再来谈!
    
    

    文件档名的搜寻:

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

    whereis (寻找特定文件)
    [root@www ~]# whereis [-bmsu] 文件或目录名
    选项与参数:
    -b    :只找 binary 格式的文件
    -m    :只找在说明档 manual 路径下的文件
    -s    :只找 source 来源文件
    -u    :搜寻不在上述三个项目当中的其他特殊文件
    
    范例一:请用不同的身份找出 ifconfig 这个档名
    [root@www ~]# whereis ifconfig 
    ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
    [root@www ~]# su - vbird        <==切换身份成为 vbird
    [vbird@www ~]$ whereis ifconfig <==找到同样的结果喔!
    ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
    [vbird@www ~]$ exit              <==回归身份成为 root 去!
    # 注意看,明明 which 一般使用者找不到的 ifconfig 却可以让 whereis 找到!
    # 这是因为系统真的有 ifconfig 这个『文件』,但是使用者的 PATH 并没有加入 /sbin
    # 所以,未来你找不到某些命令时,先用文件搜寻命令找找看再说!
    
    范例二:只找出跟 passwd 有关的『说明文件』档名(man page)
    [root@www ~]# whereis -m passwd
    passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
     
     find 是很强大的搜寻命令,但时间花用的很大!因为 find 是直接搜寻硬盘。
    whereis 搜寻的速度比 find 快很多Linux 系统会将系统内的所有文件都记录在一个数据库文件里面, 而当使用 whereis 或者是底下要说的 locate 时,都会以此数据库文件的内容为准, 因此,有的时后你还会发现使用这两个运行档时,会找到已经被杀掉的文件! 而且也找不到最新的刚刚创建的文件呢!
    
    locate
    
    [root@www ~]# locate [-ir] keyword
    选项与参数:
    -i  :忽略大小写的差异;
    -r  :后面可接正规表示法的显示方式
    
    范例一:找出系统中所有与 passwd 相关的档名
    [root@www ~]# locate passwd
    /etc/passwd
    /etc/passwd-
    /etc/news/passwd.nntp
    /etc/pam.d/passwd
    ....(底下省略)....
     
    locate使用简单,速度快,但是也有限制,即他是经由数据库来搜寻的,而数据库的创建默认是每天运行一次(每个发行版不同),所以当你新创建起来的文件, 却还在数据库升级之前搜寻该文件,那么 locate 会告诉你『找不到!』呵呵!因为必须要升级数据库呀!
    
    注:
    updatedb:根据 /etc/updatedb.conf 的配置去搜寻系统硬盘内的档名,并升级 /var/lib/mlocate 内的数据库文件;
    locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字档名
    
    find
    
    [root@www ~]# find [PATH] [option] [action]
    选项与参数:
    1. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明
       -mtime  n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件;
       -mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名;
       -mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。
       -newer file :file 为一个存在的文件,列出比 file 还要新的文件档名
    
    范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出
    [root@www ~]# find / -mtime 0
    # 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,
    # 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内?
    # find / -mtime 3 有变动过的文件都被列出的意思!
    
    范例二:寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出
    [root@www ~]# find /etc -newer /etc/passwd
    # -newer 用在分辨两个文件之间的新旧关系是很有用的!
    
    ![](//images0.cnblogs.com/blog2015/731538/201503/182142220481384.gif)
    
     +4代表大於等於5天前的档名:ex> find /var -mtime +4
    -4代表小於等於4天内的文件档名:ex> find /var -mtime -4
     4则是代表4-5那一天的文件档名:ex> find /var -mtime 4
    
    非常有趣吧!你可以在 /var/ 目录下搜寻一下,感受一下输出文件的差异喔!
    
    选项与参数:
    2. 与使用者或群组名称有关的参数:
       -uid n :n 为数字,这个数字是使用者的帐号 ID,亦即 UID ,这个 UID 是记录在
                /etc/passwd 里面与帐号名称对应的数字。这方面我们会在第四篇介绍。
       -gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在
                /etc/group,相关的介绍我们会第四篇说明~
       -user name :name 为使用者帐号名称喔!例如 dmtsai 
       -group name:name 为群组名称喔,例如 users ;
       -nouser    :寻找文件的拥有者不存在 /etc/passwd 的人!
       -nogroup   :寻找文件的拥有群组不存在於 /etc/group 的文件!
                    当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者,
                    这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。
    
    范例三:搜寻 /home 底下属於 vbird 的文件
    [root@www ~]# find /home -user vbird
    # 这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有文件时,
    # 就可以利用这个命令将属於某个使用者的所有文件都找出来喔!
    
    范例四:搜寻系统中不属於任何人的文件
    [root@www ~]# find / -nouser
    # 透过这个命令,可以轻易的就找出那些不太正常的文件。
    # 如果有找到不属於系统任何人的文件时,不要太紧张,
    # 那有时候是正常的~尤其是你曾经以原始码自行编译软件时。
    
    如果你想要找出某个使用者在系统底下创建了啥咚咚,使用上述的选项与参数,就能够找出来啦!
    
    选项与参数:
    3. 与文件权限及名称有关的参数:
       -name filename:搜寻文件名称为 filename 的文件;
       -size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有:
                       c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB
                       还要大的文件,就是『 -size +50k 』
       -type TYPE    :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f),
                       装置文件 (b, c), 目录 (d), 连结档 (l), socket (s), 
                       及 FIFO (p) 等属性。
       -perm mode  :搜寻文件权限『刚好等於』 mode 的文件,这个 mode 为类似 chmod
                     的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !
       -perm -mode :搜寻文件权限『必须要全部囊括 mode 的权限』的文件,举例来说,
                     我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,
                     当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,
                     因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
       -perm +mode :搜寻文件权限『包含任一 mode 的权限』的文件,举例来说,我们搜寻
                     -rwxr-xr-x ,亦即 -perm +755 时,但一个文件属性为 -rw-------
                     也会被列出来,因为他有 -rw.... 的属性存在!
    
    范例五:找出档名为 passwd 这个文件
    [root@www ~]# find / -name passwd
    # 利用这个 -name 可以搜寻档名啊!
    
    范例六:找出 /var 目录下,文件类型为 Socket 的档名有哪些?
    [root@www ~]# find /var -type s
    # 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件,
    # 例如 socket 与 FIFO 文件,可以用 find /var -type p 或 -type s 来找!
    
    范例七:搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性
    [root@www ~]# find / -perm +7000 
    # 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,
    # 所以当然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三个权限,
    # 因此,就是 +7000 ~了乎?
    
    假设我想要找出来 /bin, /sbin 这两个目录下, 只要具有 SUID 或 SGID 就列出来该文件,你可以这样做:
    [root@www ~]# find /bin /sbin -perm +6000
    
    注: find 后面可以接多个目录来进行搜寻!另外, find 本来就会搜寻次目录,这个特色也要特别注意喔! 
    
    选项与参数:
    4. 额外可进行的动作:
       -exec command :command 为其他命令,-exec 后面可再接额外的命令来处理搜寻到
                       的结果。
       -print        :将结果列印到萤幕上,这个动作是默认动作!
    
    范例八:将上个范例找到的文件使用 ls -l 列出来~
    [root@www ~]# find / -perm +7000 -exec ls -l {} ;
    # 注意到,那个 -exec 后面的 ls -l 就是额外的命令,命令不支持命令别名,
    # 所以仅能使用 ls -l 不可以使用 ll 喔!注意注意!
    
    范例九:找出系统中,大於 1MB 的文件
    [root@www ~]# find / -size +1000k
    
    find 的特殊功能就是能够进行额外的动作(action)。我们将范例八的例子以图解来说明如下:
    ![](//images0.cnblogs.com/blog2015/731538/201503/182142490632803.gif)
    
    该范例中特殊的地方有 {} 以及 ; 还有 -exec 这个关键字,这些东西的意义为:
    {} 代表的是『由 find 找到的内容』,如上图所示,find 的结果会被放置到 {} 位置中;
    -exec 一直到 ; 是关键字,代表 find 额外动作的开始 (-exec) 到结束 (;) ,在这中间的就是 find 命令内的额外动作。 在本例中就是『 ls -l {} 』罗!
    因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。
    
    find 还可以利用万用字节来找寻档名呢!举例来说,你想要找出 /etc 底下档名包含 httpd 的文件, 那么你就可以这样做:
    
    [root@www ~]# find /etc -name '*httpd*'
    
    不过由於 find 在寻找数据的时后相当的操硬盘!所以没事情不要使用 find 啦!
    
    1. 极重要!权限与命令间的关系:

    在这一章我们介绍了很多文件系统的管理命令,第六章则介绍了很多文件权限的意义。在这个小节当中, 我们就将这两者结合起来,说明一下什么命令在什么样的权限下才能够运行吧!_

    一、让使用者能进入某目录成为『可工作目录』的基本权限为何:
    可使用的命令:例如 cd 等变换工作目录的命令;
    目录所需权限:使用者对这个目录至少需要具有 x 的权限
    额外需求:如果使用者想要在这个目录内利用 ls 查阅档名,则使用者对此目录还需要 r 的权限。

    二、使用者在某个目录内读取一个文件的基本权限为何?
    可使用的命令:例如本章谈到的 cat, more, less等等
    目录所需权限:使用者对这个目录至少需要具有 x 权限;
    文件所需权限:使用者对文件至少需要具有 r 的权限才行!

    三、让使用者可以修改一个文件的基本权限为何?
    可使用的命令:例如 nano 或未来要介绍的 vi 编辑器等;
    目录所需权限:使用者在该文件所在的目录至少要有 x 权限;
    文件所需权限:使用者对该文件至少要有 r, w 权限

    四、让一个使用者可以创建一个文件的基本权限为何?
    目录所需权限:使用者在该目录要具有 w,x 的权限,重点在 w 啦!

    五、让使用者进入某目录并运行该目录下的某个命令之基本权限为何?
    目录所需权限:使用者在该目录至少要有 x 的权限;
    文件所需权限:使用者在该文件至少需要有 x 的权限

    例题:
    让一个使用者 vbird 能够进行『cp /dir1/file1 /dir2』的命令时,请说明 dir1, file1, dir2 的最小所需权限为何? 
    答:
    运行 cp 时, vbird 要『能够读取来源档,并且写入目标档!』所以应参考上述第二点与第四点的说明! 因此各文件/目录的最小权限应该是: •dir1 :至少需要有 x 权限;
    file1:至少需要有 r 权限;
    dir2 :至少需要有 w, x 权限。
    
    例题:
    有一个文件全名为 /home/student/www/index.html ,各相关文件/目录的权限如下: 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 这个文件呢? 答:
    虽然 www 与 index.html 是可以让 vbird 读取的权限,但是因为目录结构是由根目录一层一层读取的, 因此 vbird 可进入 /home 但是却不可进入 /home/student/ ,既然连进入 /home/student 都不许了, 当然就读不到 index.html 了!所以答案是『vbird不会读取到 index.html 的内容』喔!
    
     那要如何修改权限呢?其实只要将 /home/student 的权限修改为最小 711 ,或者直接给予 755 就可以罗! 这可是很重要的概念喔! 
    

    情境模拟题一:假设系统中有两个帐号,分别是 alex 与 arod ,这两个人除了自己群组之外还共同支持一个名为 project 的群组。假设这两个用户需要共同拥有 /srv/ahome/ 目录的开发权,且该目录不许其他人进入查阅。 请问该目录的权限配置应为何?请先以传统权限说明,再以 SGID 的功能解析。
    目标:了解到为何专案开发时,目录最好需要配置 SGID 的权限!
    前提:多个帐号支持同一群组,且共同拥有目录的使用权!
    需求:需要使用 root 的身份来进行 chmod, chgrp 等帮用户配置好他们的开发环境才行! 这也是管理员的重要任务之一!

    首先我们得要先制作出这两个帐号的相关数据,帐号/群组的管理在后续我们会介绍, 您这里先照著底下的命令来制作即可:

    [root@www ~]# groupadd project <添加新的群组
    [root@www ~]# useradd -G project alex <
    创建 alex 帐号,且支持 project
    [root@www ~]# useradd -G project arod <创建 arod 帐号,且支持 project
    [root@www ~]# id alex <
    查阅 alex 帐号的属性
    uid=501(alex) gid=502(alex) groups=502(alex),501(project) <==确实有支持!
    [root@www ~]# id arod
    uid=502(arod) gid=503(arod) groups=503(arod),501(project)

    然后开始来解决我们所需要的环境吧!

    1.首先创建所需要开发的专案目录:
    [root@www ~]# mkdir /srv/ahome
    [root@www ~]# ll -d /srv/ahome
    drwxr-xr-x 2 root root 4096 Sep 29 22:36 /srv/ahome

    2.从上面的输出结果可发现 alex 与 arod 都不能在该目录内创建文件,因此需要进行权限与属性的修改。 由於其他人均不可进入此目录,因此该目录的群组应为project,权限应为770才合理。
    [root@www ~]# chgrp project /srv/ahome
    [root@www ~]# chmod 770 /srv/ahome
    [root@www ~]# ll -d /srv/ahome
    drwxrwx--- 2 root project 4096 Sep 29 22:36 /srv/ahome
    //从上面的权限结果来看,由於 alex/arod 均支持 project,因此似乎没问题了!

    3.实际分别以两个使用者来测试看看,情况会是如何?先用 alex 创建文件,然后用 arod 去处理看看。
    [root@www ~]# su - alex <先切换身份成为 alex 来处理
    [alex@www ~]$ cd /srv/ahome <
    切换到群组的工作目录去
    [alex@www ahome]$ touch abcd <创建一个空的文件出来!
    [alex@www ahome]$ exit <
    离开 alex 的身份

    [root@www ~]# su - arod
    [arod@www ~]$ cd /srv/ahome
    [arod@www ahome]$ ll abcd
    -rw-rw-r-- 1 alex alex 0 Sep 29 22:46 abcd
    //仔细看一下上面的文件,由於群组是 alex ,arod并不支持!
    //因此对於 abcd 这个文件来说, arod 应该只是其他人,只有 r 的权限而已啊!
    [arod@www ahome]$ exit
    由上面的结果我们可以知道,若单纯使用传统的 rwx 而已,则对刚刚 alex 创建的 abcd 这个文件来说, arod 可以删除他,但是却不能编辑他!这不是我们要的样子啊!赶紧来重新规划一下。

    4.加入 SGID 的权限在里面,并进行测试看看:
    [root@www ~]# chmod 2770 /srv/ahome
    [root@www ~]# ll -d /srv/ahome
    drwxrws--- 2 root project 4096 Sep 29 22:46 /srv/ahome

    测试:使用 alex 去创建一个文件,并且查阅文件权限看看:
    [root@www ~]# su - alex
    [alex@www ~]$ cd /srv/ahome
    [alex@www ahome]$ touch 1234
    [alex@www ahome]$ ll 1234
    -rw-rw-r-- 1 alex project 0 Sep 29 22:53 1234
    //没错!这才是我们要的样子!现在 alex, arod 创建的新文件所属群组都是 project,
    //由於两人均属於此群组,加上 umask 都是 002,这样两人才可以互相修改对方的文件!

    所以最终的结果显示,此目录的权限最好是『2770』,所属文件拥有者属於root即可,至於群组必须要为两人共同支持的project 这个群组才行!

  • 相关阅读:
    解决input获取焦点时底部菜单被顶上来问题
    JavaScript学习笔记
    JavaScript表单验证
    js 中{},[]中括号,大括号使用详解
    陀飞轮
    娱乐天空
    左右手
    软测 学习
    git 学习
    spring boot 学习
  • 原文地址:https://www.cnblogs.com/ice-mj/p/4344701.html
Copyright © 2020-2023  润新知