当前位置:   article > 正文

鸟哥的Linux私房菜04_Linux文件与目录管理_binary program 和shell script

binary program 和shell script
  1. 目录的相关操作
    Alt text
    在所有目录底下都会存在的两个目录,分别是『.』与『..』
    • cd (变换目录)
      Alt text
    • pwd (显示目前所在的目录)
      Alt text
      pwd是Print Working Directory的缩写,也就是显示目前所在目录的命令
    • mkdir (创建新目录)
      Alt text
    • rmdir (删除『空』的目录)
      Alt text
      被删除的目录里面必定不能存在其他的目录或文件!那如果要将所有目录下的东西都杀掉呢?! 这个时候就必须使用『 rm -r test 』
  2. 关於运行档路径的变量: $PATH
    命令ls完整档名为:/bin/ls(这是绝对路径)。输入『ls』,系统会依照PATH的配置去每个PATH定义的目录下搜寻档名为ls的可运行档, 如果在PATH定义的目录中含有多个档名为ls的可运行档,那么先搜寻到的同名命令先被运行!
    Alt text
    PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开, 每个目录是有『顺序』之分的。
    我们使用『绝对路径』也可以运行到该命令的!(ifconfig的是放置到/sbin底下,而由上表的结果中我们可以发现vbird的PATH并没有配置/sbin, 所以默认无法运行。可以使用『/sbin/ifconfig eth0』来运行这个命令喔!)
    为了安全起见,不建议将『.』加入PATH的搜寻目录中。
    • 不同身份使用者默认的PATH不同,默认能够随意运行的命令也不同(如root与vbird);
    • PATH是可以修改的,所以一般使用者还是可以透过修改PATH来运行某些位於/sbin或/usr/sbin下的命令来查询;
    • 使用绝对路径或相对路径直接指定某个命令的档名来运行,会比搜寻PATH来的正确;
    • 命令应该要放置到正确的目录下,运行才会比较方便;
    • 本目录(.)最好不要放到PATH当中。
  3. 文件与目录管理
    • 文件与目录的检视: ls
      Alt text
      当你只有下达 ls 时,默认显示的只有:非隐藏档的档名、 以档名进行排序及档名代表的颜色显示如此而已。
      Alt text
      为此,很多 distribution 在默认的情况中, 已经将 ll (L 的小写) 配置成为 ls -l 的意思了!
    • 复制、删除与移动: cp, rm, mv
      • cp (复制文件或目录)
        Alt text
        Alt text
        在默认的条件中, cp 的来源档与目的档的权限是不同的,目的档的拥有者通常会是命令操作者本身。因此当我们在进行备份的时候,某些需要特别注意的特殊权限文件, 例如密码档 (/etc/shadow) 以及一些配置档,就不能直接以 cp 来复制,而必须要加上 -a 或者是 -p 等等可以完整复制文件权限的选项才行!
        Alt text
        范例四可有趣了!使用 -l 及 -s 都会创建所谓的连结档(link file),但是这两种连结档却有不一样的情况。这是怎么一回事啊? 那个 -l 就是所谓的实体连结(hard link),至於 -s 则是符号连结(symbolic link), 简单来说,bashrc_slink 是一个『捷径』,这个捷径会连结到bashrc去!至於bashrc_hlink文件与bashrc的属性与权限完全一模一样,与尚未进行连结前的差异则是第二栏的link数由1变成2了!
        Alt text
        例题:你能否使用vbird的身份,完整的复制/var/log/wtmp文件到/tmp底下,并更名为vbird_wtmp呢?
        Alt text
        由於vbird的身份并不能随意修改文件的拥有者与群组,因此虽然能够复制wtmp的相关权限与时间等属性, 但是与拥有者、群组相关的,原本vbird身份无法进行的动作,即使加上 -a 选项,也是无法达成完整复制权限的!
        由於 cp 有种种的文件属性与权限的特性,所以,在复制时,你必须要清楚的了解到:
        1) 是否需要完整的保留来源文件的资讯?
        2) 来源文件是否为连结档 (symbolic link file)?
        3) 来源档是否为特殊的文件,例如 FIFO, socket 等?
        4) 来源档是否为目录?
      • rm (移除文件或目录)
        Alt text
        通常在Linux系统下,为了怕文件被误杀,所以很多 distributions 都已经默认加入 -i 这个选项了!不过,使用『 rm -r 』这个命令之前,请千万注意了,因为该目录或文件『肯定』会被 root 杀掉!因为系统不会再次询问你是否要砍掉呦!
      • mv (移动文件与目录,或更名)
        Alt text
        在 Linux 才有的命令当中,有个 rename,可以用来更改大量文件的档名,你可以利用 man rename 来查阅一下,也是挺有趣的命令喔!
    • 取得路径的文件名称与目录名称
      Alt text
  4. 文件内容查阅
    cat 由第一行开始显示文件内容
    tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写!
    nl 显示的时候,顺道输出行号!
    more 一页一页的显示文件内容
    less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
    head 只看头几行
    tail 只看尾巴几行
    od 以二进位的方式读取文件内容!
    • 直接检视文件内容
      直接查阅一个文件的内容可以使用 cat/tac/nl 这几个命令啊!
      • cat (concatenate)
        Alt text
        cat 是 Concatenate (连续)的简写, 主要的功能是将一个文件的内容连续的印出在萤幕上面!
      • tac (反向列示)
        Alt text
      • nl (添加行号列印)
        Alt text
    • 可翻页检视
      前面提到的 nl 与 cat, tac 等等,都是一次性的将数据一口气显示到萤幕上面,那有没有可以进行一页一页翻动的命令?
      • more (一页一页翻动)
        Alt text
        1) 空白键 (space):代表向下翻一页;
        2) Enter :代表向下翻『一行』;
        3_ /字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
        4) :f :立刻显示出档名以及目前显示的行数;
        5) q :代表立刻离开 more ,不再显示该文件内容。
        6) b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
      • less (一页一页翻动)
        Alt text
        1) 空白键 :向下翻动一页;
        2) [pagedown]:向下翻动一页;
        3) [pageup] :向上翻动一页;
        4) /字串 :向下搜寻『字串』的功能;
        5) ?字串 :向上搜寻『字串』的功能;
        6) n :重复前一个搜寻 (与 / 或 ? 有关!)
        7) N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
        8) q :离开 less 这个程序;
        man这个命令就是呼叫 less 来显示说明文件的内容的!
    • 数据撷取
      取出前面 (head) 与取出后面 (tail) 文字的功能,要注意的是, head 与 tail 都是以『行』为单位来进行数据撷取!
      • head (取出前面几行)
        Alt text
        那个 -n 选项后面的参数较有趣,如果接的是负数,例如上面范例的-n -100时,代表列前的所有行数, 但不包括后面100行。
      • tail (取出后面几行)
        Alt text
        范例一:当下达『tail -n +100 /etc/man.config』 代表该文件从100行以后都会被列出来
        至於范例二中,由於/var/log/messages随时会有数据写入,你想要让该文件有数据写入时就立刻显示到萤幕上, 就利用 -f 这个选项
    • 非纯文字档: od
      Alt text
      可以将 data file 或者是 binary file 的内容数据给他读出来喔! 虽然读出的来数值默认是使用非文字档,亦即是 16 进位的数值来显示的, 不过,我们还是可以透过 -t c 的选项与参数来将数据内的字节以 ASCII 类型的字节来显示。
    • 修改文件时间或建置新档: touch
      三个时间的意义是什么呢:
      1) modification time (mtime)
      当该文件的『内容数据』变更时,就会升级这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!
      2) status time (ctime)
      当该文件的『状态 (status)』改变时,就会升级这个时间,举例来说,像是权限与属性被更改了,都会升级这个时间啊。
      3) access time (atime)
      当『该文件的内容被取用』时,就会升级这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man.config , 就会升级该文件的 atime 了。
      Alt text
      在默认的情况下,ls 显示出来的是该文件的 mtime ,也就是这个文件的内容上次被更动的时间。文件的时间是很重要的,因为,如果文件的时间误判的话,可能会造成某些程序无法顺利的运行。那么万一我发现了一个文件来自未来,该如何让该文件的时间变成『现在』的时刻呢? 很简单啊!就用『touch』这个命令即可!Alt text
      至於分号『 ; 』则代表连续命令的下达啦!你可以在一行命令当中写入多重命令, 这些命令可以『依序』运行。至於运行的结果当中,我们可以发现数据的内容与属性是被复制过来的,因此文件内容时间(mtime)与原本文件相同。 但是由於这个文件是刚刚被创建的,因此状态(ctime)与读取时间就便呈现在的时间啦!
      Alt text
      透过 touch 这个命令,我们可以轻易的修订文件的日期与时间。并且也可以创建一个空的文件喔! 不过,要注意的是,即使我们复制一个文件时,复制所有的属性,但也没有办法复制 ctime 这个属性的。 ctime 可以记录这个文件最近的状态 (status) 被改变的时间。
      touch 这个命令最常被使用的情况是:
      1) 创建一个空的文件;
      2) 将某个文件日期修订为目前 (mtime 与 atime)
  5. 文件与目录的默认权限与隐藏权限
    • 文件默认权限:umask
      umask 就是指定 『目前使用者在创建文件或目录时候的权限默认值』.
      Alt text
      查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字型态的权限配置分数, 一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了!怎么 umask 会有四组数字啊?第一组是特殊权限用的。
      在默认权限的属性上,目录与文件是不一样的。从第六章我们知道 x 权限对於目录是非常重要的! 但是一般文件的创建则不应该有运行的权限,因为一般文件通常是用在於数据的记录嘛!当然不需要运行的权限了。 因此,默认的情况如下:
      1)若使用者创建为『文件』则默认『没有可运行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下:
      -rw-rw-rw-
      2) 若使用者创建为『目录』,则由於 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下:
      drwxrwxrwx
      • 要注意的是,umask 的分数指的是『该默认值需要减掉的权限!』
        Alt text
      • umask的利用与重要性:专题制作
        Alt text
        这个 umask 对於新建文件与目录的默认权限是很有关系的!
      • 在默认的情况中, root 的 umask 会拿掉比较多的属性,root 的 umask 默认是 022 , 这是基於安全的考量啦~至於一般身份使用者,通常他们的 umask 为 002 ,亦即保留同群组的写入权力! 其实,关於默认 umask 的配置可以参考 /etc/bashrc 这个文件的内容,不过,不建议修改该文件
    • 文件隐藏属性
      不过要先强调的是,底下的chattr命令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个命令了。
      • chattr (配置文件隐藏属性)
        Alt text
        个人认为最重要的当属 +i 与 +a 这个属性了。+i 可以让一个文件无法被更动。如果是 log file 这种的登录档,就更需要 +a 这个可以添加,但是不能修改旧有的数据与删除的参数了!
      • lsattr (显示文件隐藏属性)
        Alt text
    • 文件特殊权限: SUID, SGID, SBIT
      Alt text
      还有其他的特殊权限(s 跟 t)
      • Set UID
        当 s 这个标志出现在文件拥有者的 x 权限上时,此时就被称为 Set UID,简称为 SUID 的特殊权限。基本上SUID有这样的限制与功能:
        1)SUID 权限仅对二进位程序(binary program)有效;
        2)运行者对於该程序需要具有 x 的可运行权限;
        3)本权限仅在运行该程序的过程中有效 (run-time);
        4)运行者将具有该程序拥有者 (owner) 的权限。
        Alt text
        可以使用你自己的帐号输入『passwd』这个命令,一般使用者当然可以修改自己的密码了!
        因为 cat 不具有 SUID 的权限,所以 vbird 运行 『cat /etc/shadow』 时,是不能读取 /etc/shadow 的。
        另外,SUID 仅可用在binary program 上, 不能够用在 shell script 上面!这是因为 shell script 只是将很多的 binary 运行档叫进来运行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的配置, 而不是 shell script 本身。当然,SUID 对於目录也是无效的~这点要特别留意。
      • Set GID
        当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID。
        Alt text
        与 SUID 不同的是,SGID 可以针对文件或目录来配置!如果是对文件来说, SGID 有如下的功能:
        1) SGID 对二进位程序有用;
        2) 程序运行者对於该程序来说,需具备 x 的权限;
        3) 运行者在运行的过程中将会获得该程序群组的支持!
        Alt text
        与 SUID 非常的类似,若我使用 vbird 这个帐号去运行 locate 时,那 vbird 将会取得 slocate 群组的支持, 因此就能够去读取 mlocate.db 啦!
        除了 binary program 之外,事实上 SGID 也能够用在目录上,这也是非常常见的一种用途! 当一个目录配置了 SGID 的权限后,他将具有如下的功能:
        1) 使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目
        2) 使用者在此目录下的有效群组(effective group)将会变成该目录的群
        3) 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。
      • Sticky Bit
        这个 Sticky Bit, SBIT 目前只针对目录有效,对於文件已经没有效果了。 SBIT 对於目录的作用是:
        1) 当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
        2) 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件
        换句话说:当甲这个使用者於 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示『甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等动作。』 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。
        举例来说,我们的 /tmp 本身的权限是『drwxrwxrwt』, 在这样的权限内容下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。
      • SUID/SGID/SBIT 权限配置
        那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!
        1) 4 为 SUID
        2) 2 为 SGID
        3) 1 为 SBIT
        Alt text
        怎么会出现大写的 S 与 T 呢?因为 s 与 t 都是取代 x 这个权限的,但是你有没有发现阿,我们是下达 7666 喔!也就是说, user, group 以及 others 都没有 x 这个可运行的标志( 因为 666 嘛 ),所以,这个 S, T 代表的就是『空的』啦!
        而除了数字法之外,你也可以透过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t 罗!来看看如下的范例:
        Alt text
    • 观察文件类型:file
      如果你想要知道某个文件的基本数据,例如是属於 ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函式库 (share library) 等等的资讯,就可以利用 file 这个命令来检阅喔!
      Alt text
  6. 命令与文件的搜寻
    • 命令档名的搜寻
      • which (寻找『运行档』)
        Alt text
        这个命令是根据『PATH』这个环境变量所规范的路径,去搜寻『运行档』的档名~ 所以,重点是找出『运行档』而已!且 which 后面接的是『完整档名』喔!若加上 -a 选项,则可以列出所有的可以找到的同名运行档,而非仅显示第一个而已!
        最后一个范例最有趣,怎么 cd 这个常用的命令竟然找不到啊!为什么呢?这是因为 cd 是『bash 内建的命令』啦!我们可以透过 type 这个命令喔!
    • 文件档名的搜寻
      • whereis (寻找特定文件)
        Alt text
        find 是很强大的搜寻命令,但时间花用的很大!
        为何搜寻的速度会比 find 快这么多? 其实那也没有什么!这是因为 Linux 系统会将系统内的所有文件都记录在一个数据库文件里面, 而当使用 whereis 或者是底下要说的 locate 时,都会以此数据库文件的内容为准, 因此,有的时后你还会发现使用这两个运行档时,会找到已经被杀掉的文件! 而且也找不到最新的刚刚创建的文件呢!这就是因为这两个命令是由数据库当中的结果去搜寻文件的所在啊!
      • locate
        Alt text
        这个 locate 的使用更简单,直接在后面输入『文件的部分名称』后,就能够得到结果。
        你会发现使用 locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由『已创建的数据库 /var/lib/mlocate/』 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,那么有什么限制呢?就是因为他是经由数据库来搜寻的,而数据库的创建默认是在每天运行一次 (每个 distribution 都不同,CentOS 5.x 是每天升级数据库一次!),所以当你新创建起来的文件, 却还在数据库升级之前搜寻该文件,那么 locate 会告诉你『找不到!』呵呵!因为必须要升级数据库呀!
        那能否手动升级数据库哪?当然可以啊!升级 locate 数据库的方法非常简单,直接输入『 updatedb 』就可以了!
        1) updatedb:根据 /etc/updatedb.conf 的配置去搜寻系统硬盘内的档名,并升级 /var/lib/mlocate 内的数据库文件;
        2) locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字档名。
      • find
        Alt text
        Alt text
        由图5.2.1我们可以清楚的知道:
        1) +4代表大於等於5天前的档名:ex> find /var -mtime +4
        2) -4代表小於等於4天内的文件档名:ex> find /var -mtime -4
        3) 4则是代表4-5那一天的文件档名:ex> find /var -mtime 4
        Alt text
        Alt text
        find 本来就会搜寻次目录
        Alt text
        find 的特殊功能就是能够进行额外的动作(action)。我们将范例八的例子以图解来说明如下:
        Alt text
        该范例中特殊的地方有 {} 以及 \; 还有 -exec 这个关键字,这些东西的意义为:
        1) {} 代表的是『由 find 找到的内容』,如上图所示,find 的结果会被放置到 {} 位置中;
        2) -exec 一直到 \; 是关键字,代表 find 额外动作的开始 (-exec) 到结束 (\;) ,在这中间的就是 find 命令内的额外动作。 在本例中就是『 ls -l {} 』罗!
        3) 因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。 Find 还可以利用万用字节来找寻档名呢:
        Alt text
        不但可以指定搜寻的目录(连同次目录),并且可以利用额外的选项与参数来找到最正确的档名!
  7. 极重要!权限与命令间的关系
    • 让使用者能进入某目录成为『可工作目录』的基本权限为何:
      • 可使用的命令:例如 cd 等变换工作目录的命令;
      • 目录所需权限:使用者对这个目录至少需要具有 x 的权限
      • 额外需求:如果使用者想要在这个目录内利用 ls 查阅档名,则使用者对此目录还需要 r 的权限。
    • 使用者在某个目录内读取一个文件的基本权限为何?
      • 可使用的命令:例如本章谈到的 cat, more, less等等
      • 目录所需权限:使用者对这个目录至少需要具有 x 权限;
      • 文件所需权限:使用者对文件至少需要具有 r 的权限才行!
    • 让使用者可以修改一个文件的基本权限为何?
      • 可使用的命令:例如 nano 或未来要介绍的 vi 编辑器等;
      • 目录所需权限:使用者在该文件所在的目录至少要有 x 权限;
      • 文件所需权限:使用者对该文件至少要有 r, w 权限
    • 让一个使用者可以创建一个文件的基本权限为何?
      • 目录所需权限:使用者在该目录要具有 w,x 的权限,重点在 w 啦!
    • 让使用者进入某目录并运行该目录下的某个命令之基本权限为何?
      • 目录所需权限:使用者在该目录至少要有 x 的权限;
      • 文件所需权限:使用者在该文件至少需要有 x 的权限
  8. 重点回顾
    • 特殊目录有:., .., -, ~, ~account需要注意;
    • 与目录相关的命令有:cd, mkdir, rmdir, pwd 等重要命令;
    • rmdir 仅能删除空目录,要删除非空目录需使用『 rm -r 』命令;
    • 使用者能使用的命令是依据 PATH 变量所规定的目录去搜寻的;
    • 不同的身份(root 与一般用户)系统默认的 PATH 并不相同。差异较大的地方在於 /sbin, /usr/sbin ;
    • ls 可以检视文件的属性,尤其 -d, -a, -l 等选项特别重要!
    • 文件的复制、删除、移动可以分别使用:cp, rm , mv等命令来操作;
    • 检查文件的内容(读档)可使用的命令包括有:cat, tac, nl, more, less, head, tail, od 等
    • 检查文件的内容(读档)可使用的命令包括有: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文件系统中,还可以使用chattr与lsattr配置及观察隐藏属性。 常见的包括只能新增数据的 +a 与完全不能更动文件的 +i 属性。
    • 新建文件/目录时,新文件的默认权限使用 umask 来规范。默认目录完全权限为drwxrwxrwx, 文件则为-rw-rw-rw-。
    • 文件具有SUID的特殊权限时,代表当使用者运行此一binary程序时,在运行过程中使用者会暂时具有程序拥有者的权限
    • 目录具有SGID的特殊权限时,代表使用者在这个目录底下新建的文件之群组都会与该目录的群组名称相同。
    • 目录具有SBIT的特殊权限时,代表在该目录下使用者创建的文件只有自己与root能够删除!
    • 观察文件的类型可以使用 file 命令来观察;
    • 搜寻命令的完整档名可用 which 或 type ,这两个命令都是透过 PATH 变量来搜寻档名;
    • 搜寻文件的完整档名可以使用 whereis 或 locate 到数据库文件去搜寻,而不实际搜寻文件系统;
    • 利用 find 可以加入许多选项来直接查询文件系统,以获得自己想要知道的档名。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/83140?site
推荐阅读
相关标签
  

闽ICP备14008679号