原文网址:http://vbird.dic.ksu.edu.tw/linux_basic/0220filemanager.php
在第六章我们认识了Linux系统下的文件权限概念以及目录的配置说明。 在这个章节当中,我们就直接来进一步的操作与管理文件与目录吧!包括在不同的目录间变换、 创建与删除目录、创建与删除文件,还有寻找文件、查阅文件内容等等, 都会在这个章节作个简单的介绍啊! |
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
目录与路径:
由第六章Linux的文件权限与目录配置中透过FHS了解了Linux的『树状目录』概念之后, 接下来就得要实际的来搞定一些基本的路径问题了!这些目录的问题当中,最重要的莫过於第六章也谈过的『绝对路径』与『相对路径』的意义啦! 绝对/相对路径的写法并不相同,要特别注意。此外,当你下达命令时,该命令是透过什么功能来取得的? 这与PATH这个变量有关呢!底下就让我们来谈谈罗!
相对路径与绝对路径:
在开始目录的切换之前,你必须要先了解一下所谓的『路径(PATH)』, 有趣的是:什么是『相对路径』与『绝对路径』? 虽然前一章已经稍微针对这个议题提过一次,不过,这里不厌其烦的再次的强调一下!
- 绝对路径:路径的写法『一定由根目录 / 写起』,例如: /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 这三个目录中,请问如果需要用到绝对路径的话,那么是否很麻烦呢?是的! 如此一来每个目录下的东西就很难对应的起来!这个时候相对路径的写法就显的特别的重要了!
此外,如果你跟鸟哥一样,喜欢将路径的名字写的很长,好让自己知道那个目录是在干什么的,例如: /cluster/raid/output/*2006/smoke 这个目录,而另一个目录在 /cluster/raid/output/*2006/cctm ,那么我从第一个要到第二个目录去的话,怎么写比较方便? 当然是『 cd ../cctm 』比较方便罗!对吧!
- 绝对路径的用途
但是对於档名的正确性来说,『绝对路径的正确度要比较好~』。 一般来说,鸟哥会建议你,如果是在写程序 (shell scripts) 来管理系统的条件下,务必使用绝对路径的写法。 怎么说呢?因为绝对路径的写法虽然比较麻烦,但是可以肯定这个写法绝对不会有问题。 如果使用相对路径在程序当中,则可能由於你运行的工作环境不同,导致一些问题的发生。 这个问题在工作排程(at, cron, 第十六章)当中尤其重要!这个现象我们在十三章、shell script时,会再次的提醒你喔! ^_^
目录的相关操作:
我们之前稍微提到变换目录的命令是cd,还有哪些可以进行目录操作的命令呢? 例如创建目录啊、删除目录之类的~还有,得要先知道的,就是有哪些比较特殊的目录呢? 举例来说,底下这些就是比较特殊的目录,得要用力的记下来才行:
. 代表此层目录 |
需要特别注意的是:在所有目录底下都会存在的两个目录,分别是『.』与『..』 分别代表此层与上一级目录的意思。那么来思考一下底下这个例题:
例题:
请问在Linux底下,根目录下有没有上一级目录(..)存在?
答: 若使用『 ls -al / 』去查询,可以看到根目录下确实存在 . 与 .. 两个目录,再仔细的查阅, 可发现这两个目录的属性与权限完全一致,这代表根目录的上一层(..)与根目录自己(.)是同一个目录。
|
底下我们就来谈一谈几个常见的处理目录的命令吧:
- cd:变换目录
- pwd:显示目前的目录
- mkdir:创建一个新的目录
- rmdir:删除一个空的目录
- cd (变换目录)
我们知道vbird这个使用者的家目录是/home/vbird/,而root家目录则是/root/,假设我以root身份在 Linux系统中,那么简单的说明一下这几个特殊的目录的意义是:
[root@www ~]# cd [相对路径或绝对路径] |
cd是Change Directory的缩写,这是用来变换工作目录的命令。注意,目录名称与cd命令之间存在一个空格。 一登陆Linux系统后,root会在root的家目录!那回到上一层目录可以用『 cd .. 』。 利用相对路径的写法必须要确认你目前的路径才能正确的去到想要去的目录。例如上表当中最后一个例子, 你必须要确认你是在/var/spool/mail当中,并且知道在/var/spool当中有个mqueue的目录才行啊~ 这样才能使用cd ../mqueue去到正确的目录说,否则就要直接输入cd /var/spool/mqueue罗~
其实,我们的提示字节,亦即那个 [root@www ~]# 当中,就已经有指出目前的目录了, 刚登陆时会到自己的家目录,而家目录还有一个代码,那就是『 ~ 』符号! 例如上面的例子可以发现,使用『 cd ~ 』可以回到个人的家目录里头去呢! 另外,针对 cd 的使用方法,如果仅输入 cd 时,代表的就是『 cd ~ 』的意思喔~ 亦即是会回到自己的家目录啦!而那个『 cd - 』比较难以理解,请自行多做几次练习, 就会比较明白了。
Tips: 还是要一再地提醒,我们的 Linux 的默认命令列模式 (bash shell) 具有文件补齐功能, 你要常常利用 [tab] 按键来达成你的目录完整性啊!这可是个好习惯啊~ 可以避免你按错键盘输入错字说~ ^_^ |
- pwd (显示目前所在的目录)
[root@www ~]# pwd [-P] |
pwd是Print Working Directory的缩写,也就是显示目前所在目录的命令, 例如在上个表格最后的目录是/var/mail这个目录,但是提示字节仅显示mail, 如果你想要知道目前所在的目录,可以输入pwd即可。此外,由於很多的套件所使用的目录名称都相同,例如 /usr/local/etc还有/etc,但是通常Linux仅列出最后面那一个目录而已,这个时候你就可以使用pwd 来知道你的所在目录罗!免得搞错目录,结果...
其实有趣的是那个 -P 的选项啦!他可以让我们取得正确的目录名称,而不是以连结档的路径来显示的。 如果你使用的是CentOS 5.x的话,刚刚好/var/mail是/var/spool/mail的连结档, 所以,透过到/var/mail下达pwd -P就能够知道这个选项的意义罗~ ^_^
- mkdir (创建新目录)
[root@www ~]# mkdir [-mp] 目录名称 |
如果想要创建新的目录的话,那么就使用mkdir (make directory)吧! 不过,在默认的情况下, 你所需要的目录得一层一层的创建才行!例如:假如你要创建一个目录为 /home/bird/testing/test1,那么首先必须要有 /home 然后 /home/bird ,再来 /home/bird/testing 都必须要存在,才可以创建 /home/bird/testing/test1 这个目录!假如没有 /home/bird/testing 时,就没有办法创建 test1 的目录罗!
不过,现在有个更简单有效的方法啦!那就是加上 -p 这个选项喔!你可以直接下达:『 mkdir -p /home/bird/testing/test1 』 则系统会自动的帮你将 /home, /home/bird, /home/bird/testing 依序的创建起目录!并且, 如果该目录本来就已经存在时,系统也不会显示错误信息喔!挺快乐的吧! ^_^。 不过鸟哥不建议常用-p这个选项,因为担心如果你打错字,那么目录名称就会变的乱七八糟的!
另外,有个地方你必须要先有概念,那就是『默认权限』的地方。我们可以利用 -m 来强制给予一个新的目录相关的权限, 例如上表当中,我们给予 -m 711 来给予新的目录 drwx--x--x 的权限。不过,如果没有给予 -m 选项时, 那么默认的新建目录权限又是什么呢?这个跟 umask 有关,我们在本章后头会加以介绍的。
- rmdir (删除『空』的目录)
[root@www ~]# rmdir [-p] 目录名称 |
如果想要删除旧有的目录时,就使用rmdir吧!例如将刚刚创建的test杀掉,使用『 rmdir test 』即可!请注意呦!目录需要一层一层的删除才行!而且被删除的目录里面必定不能存在其他的目录或文件! 这也是所谓的空的目录(empty directory)的意思啊!那如果要将所有目录下的东西都杀掉呢?! 这个时候就必须使用『 rm -r test 』罗!不过,还是使用 rmdir 比较不危险!你也可以尝试以 -p 的选项加入,来删除上一级的目录喔!
关於运行档路径的变量: $PATH
经过第六章FHS的说明后,我们知道查阅文件属性的命令ls完整档名为:/bin/ls(这是绝对路径), 那你会不会觉得很奇怪:『为什么我可以在任何地方运行/bin/ls这个命令呢? 』 为什么我在任何目录下输入 ls 就一定可以显示出一些信息而不会说找不到该 /bin/ls 命令呢? 这是因为环境变量 PATH 的帮助所致呀!
当我们在运行一个命令的时候,举例来说『ls』好了,系统会依照PATH的配置去每个PATH定义的目录下搜寻档名为ls的可运行档, 如果在PATH定义的目录中含有多个档名为ls的可运行档,那么先搜寻到的同名命令先被运行!
现在,请下达『echo $PATH』来看看到底有哪些目录被定义出来了? echo有『显示、印出』的意思,而 PATH 前面加的 $ 表示后面接的是变量,所以会显示出目前的 PATH !
范例:先用root的身份列出搜寻的路径为何? |
PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开, 每个目录是有『顺序』之分的。仔细看一下上面的输出,你可以发现到无论是root还是vbird都有/bin 这个目录在PATH变量内,所以当然就能够在任何地方运行ls来找到/bin/ls运行档罗!
我们用几个范例来让你了解一下,为什么PATH是那么重要的项目!
例题:
请问你能不能使用一般身份使用者下达ifconfig eth0这个命令呢?
答: 如上面的范例所示,当你使用vbird这个帐号运行ifconfig时,会出现『-bash: ifconfig: command not found』的字样, 因为ifconfig的是放置到/sbin底下,而由上表的结果中我们可以发现vbird的PATH并没有配置/sbin, 所以默认无法运行。
但是你可以使用『/sbin/ifconfig eth0』来运行这个命令喔!因为一般用户还是可以使用ifconfig来查询系统IP的参数, 既然PATH没有规范到/sbin,那么我们使用『绝对路径』也可以运行到该命令的! |
例题:
假设你是root,如果你将ls由/bin/ls移动成为/root/ls(可用『mv /bin/ls /root』命令达成),然后你自己本身也在/root目录下, 请问(1)你能不能直接输入ls来运行?(2)若不能,你该如何运行ls这个命令?(3)若要直接输入ls即可运行,又该如何进行?
答: 由於这个例题的重点是将某个运行档移动到非正规目录去,所以我们先要进行底下的动作才行:(务必使用root的身份)
(1)接下来不论你在那个目录底下输入任何与ls相关的命令,都没有办法顺利的运行ls了! 也就是说,你不能直接输入ls来运行,因为/root这个目录并不在PATH指定的目录中, 所以,即使你在/root目录下,也不能够搜寻到ls这个命令! (2)因为这个ls确实存在於/root底下,并不是被删除了!所以我们可以透过使用绝对路径或者是相对路径直接指定这个运行档档名, 底下的两个方法都能够运行ls这个命令:
(3)如果想要让root在任何目录均可运行/root底下的ls,那么就将/root加入PATH当中即可。 加入的方法很简单,就像底下这样:
上面这个作法就能够将/root加入到运行档搜寻路径PATH中了!不相信的话请您自行使用『echo $PATH』去查看吧! 如果确定这个例题进行没有问题了,请将ls搬回/bin底下,不然系统会挂点的!
|
例题:
如果我有两个ls命令在不同的目录中,例如/usr/local/bin/ls与/bin/ls那么当我下达 ls 的时候,哪个ls会被运行?
答: 那还用说,就找出 PATH 里面哪个目录先被查询,则那个目录下的命令就会被先运行了!
|
例题:
为什么PATH搜寻的目录不加入本目录(.)?加入本目录的搜寻不是也不错?
答: 如果在PATH中加入本目录(.)后,确实我们就能够在命令所在目录进行命令的运行了。 但是由於你的工作目录并非固定(常常会使用cd来切换到不同的目录), 因此能够运行的命令会有变动(因为每个目录底下的可运行档都不相同嘛!),这对使用者来说并非好事。
另外,如果有个坏心使用者在/tmp底下做了一个命令,因为/tmp是大家都能够写入的环境,所以他当然可以这样做。 假设该命令可能会窃取使用者的一些数据,如果你使用root的身份来运行这个命令,那不是很糟糕? 如果这个命令的名称又是经常会被用到的ls时,那『中标』的机率就更高了! 所以,为了安全起见,不建议将『.』加入PATH的搜寻目录中。 |
而由上面的几个例题我们也可以知道几件事情:
- 不同身份使用者默认的PATH不同,默认能够随意运行的命令也不同(如root与vbird);
- PATH是可以修改的,所以一般使用者还是可以透过修改PATH来运行某些位於/sbin或/usr/sbin下的命令来查询;
- 使用绝对路径或相对路径直接指定某个命令的档名来运行,会比搜寻PATH来的正确;
- 命令应该要放置到正确的目录下,运行才会比较方便;
- 本目录(.)最好不要放到PATH当中。
对於PATH更详细的『变量』说明,我们会在第三篇的bash shell中详细说明的!
文件与目录管理:
谈了谈目录与路径之后,再来讨论一下关於文件的一些基本管理吧!文件与目录的管理上,不外乎『显示属性』、 『拷贝』、『删除文件』及『移动文件或目录』等等,由於文件与目录的管理在 Linux 当中是很重要的, 尤其是每个人自己家目录的数据也都需要注意管理!所以我们来谈一谈有关文件与目录的一些基础管理部分吧!
文件与目录的检视: ls
[root@www ~]# ls [-aAdfFhilnrRSt] 目录名称 |
在Linux系统当中,这个 ls 命令可能是最常被运行的吧!因为我们随时都要知道文件或者是目录的相关资讯啊~ 不过,我们Linux的文件所记录的资讯实在是太多了,ls 没有需要全部都列出来呢~ 所以,当你只有下达 ls 时,默认显示的只有:非隐藏档的档名、 以档名进行排序及档名代表的颜色显示如此而已。举例来说, 你下达『 ls /etc 』之后,只有经过排序的档名以及以蓝色显示目录及白色显示一般文件,如此而已。
那如果我还想要加入其他的显示资讯时,可以加入上头提到的那些有用的选项呢~ 举例来说,我们之前一直用到的 -l 这个长串显示数据内容,以及将隐藏档也一起列示出来的 -a 选项等等。 底下则是一些常用的范例,实际试做看看:
范例一:将家目录下的所有文件列出来(含属性与隐藏档) |
其实 ls 的用法还有很多,包括查阅文件所在 i-node 号码的 ls -i 选项,以及用来进行文件排序的 -S 选项,还有用来查阅不同时间的动作的 --time=atime 等选项(更多时间说明请参考本章后面touch的说明)。而这些选项的存在都是因为 Linux 文件系统记录了很多有用的资讯的缘故。那么 Linux 的文件系统中,这些与权限、属性有关的数据放在哪里呢? 放在 i-node 里面。关於这部分,我们会在下一章继续为你作比较深入的介绍啊!
无论如何, ls 最常被使用到的功能还是那个 -l 的选项,为此,很多 distribution 在默认的情况中, 已经将 ll (L 的小写) 配置成为 ls -l 的意思了!其实,那个功能是 Bash shell 的 alias 功能呢~也就是说,我们直接输入 ll 就等於是输入 ls -l 是一样的~关於这部分,我们会在后续 bash shell 时再次的强调滴~
复制、删除与移动: cp, rm, mv
要复制文件,请使用 cp (copy) 这个命令即可~不过, cp 这个命令的用途可多了~ 除了单纯的复制之外,还可以创建连结档 (就是捷径罗),比对两文件的新旧而予以升级, 以及复制整个目录等等的功能呢!至於移动目录与文件,则使用 mv (move), 这个命令也可以直接拿来作更名 (rename) 的动作喔!至於移除吗?那就是 rm (remove) 这个命令罗~底下我们就来瞧一瞧先~
- cp (复制文件或目录)
[root@www ~]# cp [-adfilprsu] 来源档(source) 目标档(destination) |
复制(cp)这个命令是非常重要的,不同身份者运行这个命令会有不同的结果产生,尤其是那个-a, -p的选项, 对於不同身份来说,差异则非常的大!底下的练习中,有的身份为root有的身份为一般帐号(在我这里用vbird这个帐号), 练习时请特别注意身份的差别喔!好!开始来做复制的练习与观察:
范例一:用root身份,将家目录下的 .bashrc 复制到 /tmp 下,并更名为 bashrc |
这个 cp 的功能很多,由於我们常常会进行一些数据的复制,所以也会常常用到这个命令的。 一般来说,我们如果去复制别人的数据 (当然,该文件你必须要有 read 的权限才行啊! ^_^) 时, 总是希望复制到的数据最后是我们自己的,所以,在默认的条件中, cp 的来源档与目的档的权限是不同的,目的档的拥有者通常会是命令操作者本身。举例来说, 上面的范例二中,由於我是 root 的身份,因此复制过来的文件拥有者与群组就改变成为 root 所有了! 这样说,可以明白吗?^_^
由於具有这个特性,因此当我们在进行备份的时候,某些需要特别注意的特殊权限文件, 例如密码档 (/etc/shadow) 以及一些配置档,就不能直接以 cp 来复制,而必须要加上 -a 或者是 -p 等等可以完整复制文件权限的选项才行!另外,如果你想要复制文件给其他的使用者, 也必须要注意到文件的权限(包含读、写、运行以及文件拥有者等等), 否则,其他人还是无法针对你给予的文件进行修订的动作喔!注意注意!
范例三:复制 /etc/ 这个目录下的所有内容到 /tmp 底下 |
范例四可有趣了!使用 -l 及 -s 都会创建所谓的连结档(link file),但是这两种连结档却有不一样的情况。这是怎么一回事啊? 那个 -l 就是所谓的实体连结(hard link),至於 -s 则是符号连结(symbolic link), 简单来说,bashrc_slink 是一个『捷径』,这个捷径会连结到bashrc去!所以你会看到档名右侧会有个指向(->)的符号!
至於bashrc_hlink文件与bashrc的属性与权限完全一模一样,与尚未进行连结前的差异则是第二栏的link数由1变成2了! 鸟哥这里先不介绍实体连结,因为实体连结涉及 i-node 的相关知识,我们下一章谈到文件系统(filesystem)时再来讨论这个问题。
范例五:若 ~/.bashrc 比 /tmp/bashrc 新才复制过来 |
例题:
你能否使用vbird的身份,完整的复制/var/log/wtmp文件到/tmp底下,并更名为vbird_wtmp呢?
答: 实际做看看的结果如下:
由於vbird的身份并不能随意修改文件的拥有者与群组,因此虽然能够复制wtmp的相关权限与时间等属性, 但是与拥有者、群组相关的,原本vbird身份无法进行的动作,即使加上 -a 选项,也是无法达成完整复制权限的! |
总之,由於 cp 有种种的文件属性与权限的特性,所以,在复制时,你必须要清楚的了解到:
- 是否需要完整的保留来源文件的资讯?
- 来源文件是否为连结档 (symbolic link file)?
- 来源档是否为特殊的文件,例如 FIFO, socket 等?
- 来源档是否为目录?
- rm (移除文件或目录)
[root@www ~]# rm [-fir] 文件或目录 |
这是移除的命令(remove),要注意的是,通常在Linux系统下,为了怕文件被误杀,所以很多 distributions 都已经默认加入 -i 这个选项了!而如果要连目录下的东西都一起杀掉的话, 例如子目录里面还有子目录时,那就要使用 -r 这个选项了!不过,使用『 rm -r 』这个命令之前,请千万注意了,因为该目录或文件『肯定』会被 root 杀掉!因为系统不会再次询问你是否要砍掉呦!所以那是个超级严重的命令下达呦! 得特别注意!不过,如果你确定该目录不要了,那么使用 rm -r 来循环杀掉是不错的方式!
另外,范例四也是很有趣的例子,我们在之前就谈过,档名最好不要使用 "-" 号开头, 因为 "-" 后面接的是选项,因此,单纯的使用『 rm -aaa- 』系统的命令就会误判啦! 那如果使用后面会谈到的正规表示法时,还是会出问题的!所以,只能用避过首位字节是 "-" 的方法啦! 就是加上本目录『 ./ 』即可!如果 man rm 的话,其实还有一种方法,那就是『 rm -- -aaa- 』也可以啊!
- mv (移动文件与目录,或更名)
[root@www ~]# mv [-fiu] source destination |
这是搬移 (move) 的意思!当你要移动文件或目录的时后,呵呵!这个命令就很重要啦! 同样的,你也可以使用 -u ( update )来测试新旧文件,看看是否需要搬移罗! 另外一个用途就是『变更档名!』,我们可以很轻易的使用 mv 来变更一个文件的档名呢!不过,在 Linux 才有的命令当中,有个 rename , 可以用来更改大量文件的档名,你可以利用 man rename 来查阅一下,也是挺有趣的命令喔!
取得路径的文件名称与目录名称
我们前面介绍的完整档名 (包含目录名称与文件名称) 当中提到,完整档名最长可以到达 4096 个字节。 那么你怎么知道那个是档名?那个是目录名?嘿嘿!就是利用斜线 (/) 来分辨啊! 其实,取得档名或者是目录名称,一般的用途应该是在写程序的时候,用来判断之用的啦~ 所以,这部分的命令可以用在第三篇内的 shell scripts 里头喔! 底下我们简单的以几个范例来谈一谈 basename 与 dirname 的用途!
[root@www ~]# basename /etc/sysconfig/network |
文件内容查阅:
如果我们要查阅一个文件的内容时,该如何是好呢?这里有相当多有趣的命令可以来分享一下: 最常使用的显示文件内容的命令可以说是 cat 与 more 及 less 了!此外,如果我们要查看一个很大型的文件 (好几百MB时),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用 tail 呀,此外, tac 这个命令也可以达到!好了,说说各个命令的用途吧!
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写!
- nl 显示的时候,顺道输出行号!
- more 一页一页的显示文件内容
- less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
- head 只看头几行
- tail 只看尾巴几行
- od 以二进位的方式读取文件内容!
直接检视文件内容
直接查阅一个文件的内容可以使用 cat/tac/nl 这几个命令啊!
- cat (concatenate)
[root@www ~]# cat [-AbEnTv] |
嘿嘿!Linux 里面有『猫』命令?喔!不是的, cat 是 Concatenate (连续)的简写, 主要的功能是将一个文件的内容连续的印出在萤幕上面!例如上面的例子中,我们将 /etc/issue 印出来!如果加上 -n 或 -b 的话,则每一行前面还会加上行号呦!
鸟哥个人是比较少用 cat 啦!毕竟当你的文件内容的行数超过 40 行以上,嘿嘿!根本来不及在萤幕上看到结果! 所以,配合等一下要介绍的 more 或者是 less 来运行比较好!此外,如果是一般的 DOS 文件时,就需要特别留意一些奇奇怪怪的符号了, 例如断行与 [tab] 等,要显示出来,就得加入 -A 之类的选项了!
- tac (反向列示)
[root@www ~]# tac /etc/issue Kernel \r on an \m |
tac 这个好玩了!怎么说呢?详细的看一下, cat 与 tac ,有没有发现呀!对啦! tac 刚好是将 cat 反写过来,所以他的功能就跟 cat 相反啦, cat 是由『第一行到最后一行连续显示在萤幕上』,而 tac 则是『 由最后一行到第一行反向在萤幕上显示出来 』,很好玩吧!
- nl (添加行号列印)
[root@www ~]# nl [-bnw] 文件 |
nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能呢。
可翻页检视
前面提到的 nl 与 cat, tac 等等,都是一次性的将数据一口气显示到萤幕上面,那有没有可以进行一页一页翻动的命令啊? 让我们可以一页一页的观察,才不会前面的数据看不到啊~呵呵!有的!那就是 more 与 less 罗~
- more (一页一页翻动)
[root@www ~]# more /etc/man.config |
仔细的给他看到上面的范例,如果 more 后面接的文件内容行数大於萤幕输出的行数时, 就会出现类似上面的图示。重点在最后一行,最后一行会显示出目前显示的百分比, 而且还可以在最后一行输入一些有用的命令喔!在 more 这个程序的运行过程中,你有几个按键可以按的:
- 空白键 (space):代表向下翻一页;
- Enter :代表向下翻『一行』;
- /字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
- :f :立刻显示出档名以及目前显示的行数;
- q :代表立刻离开 more ,不再显示该文件内容。
- b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
要离开 more 这个命令的显示工作,可以按下 q 就能够离开了。而要向下翻页,就使用空白键即可。 比较有用的是搜寻字串的功能,举例来说,我们使用『 more /etc/man.config 』来观察该文件, 若想要在该文件内搜寻 MANPATH 这个字串时,可以这样做:
[root@www ~]# more /etc/man.config |
如同上面的说明,输入了 / 之后,光标就会跑到最底下一行,并且等待你的输入, 你输入了字串并按下[enter]之后,嘿嘿! more 就会开始向下搜寻该字串罗~而重复搜寻同一个字串, 可以直接按下 n 即可啊!最后,不想要看了,就按下 q 即可离开 more 啦!
- less (一页一页翻动)
[root@www ~]# less /etc/man.config |
less 的用法比起 more 又更加的有弹性,怎么说呢?在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,呵呵!就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,你瞧,是不是更容易使用来观看一个文件的内容了呢!
除此之外,在 less 里头可以拥有更多的『搜寻』功能喔!不止可以向下搜寻,也可以向上搜寻~ 实在是很不错用~基本上,可以输入的命令有:
- 空白键 :向下翻动一页;
- [pagedown]:向下翻动一页;
- [pageup] :向上翻动一页;
- /字串 :向下搜寻『字串』的功能;
- ?字串 :向上搜寻『字串』的功能;
- n :重复前一个搜寻 (与 / 或 ? 有关!)
- N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
- q :离开 less 这个程序;
查阅文件内容还可以进行搜寻的动作~瞧~ less 是否很不错用啊! 其实 less 还有很多的功能喔!详细的使用方式请使用 man less 查询一下啊! ^_^
你是否会觉得 less 使用的画面与环境与 man page 非常的类似呢?没错啦!因为man这个命令就是呼叫 less 来显示说明文件的内容的! 现在你是否觉得 less 很重要呢? ^_^
数据撷取
我们可以将输出的数据作一个最简单的撷取,那就是取出前面 (head) 与取出后面 (tail) 文字的功能。 不过,要注意的是, head 与 tail 都是以『行』为单位来进行数据撷取的喔!
- head (取出前面几行)
[root@www ~]# head [-n number] 文件 |
head 的英文意思就是『头』啦,那么这个东西的用法自然就是显示出一个文件的前几行罗! 没错!就是这样!若没有加上 -n 这个选项时,默认只显示十行,若只要一行呢?那就加入『 head -n 1 filename 』即可!
另外那个 -n 选项后面的参数较有趣,如果接的是负数,例如上面范例的-n -100时,代表列前的所有行数, 但不包括后面100行。举例来说,/etc/man.config共有141行,则上述的命令『head -n -100 /etc/man.config』 就会列出前面41行,后面100行不会列印出来了。这样说,比较容易懂了吧? ^_^
- tail (取出后面几行)
[root@www ~]# tail [-n number] 文件 |
有 head 自然就有 tail ( 尾巴 ) 罗!没错!这个 tail 的用法跟 head 的用法差不多类似,只是显示的是后面几行就是了!默认也是显示十行,若要显示非十行,就加 -n number 的选项即可。
范例一的内容就有趣啦!其实与head -n -xx有异曲同工之妙。当下达『tail -n +100 /etc/man.config』 代表该文件从100行以后都会被列出来,同样的,在man.config共有141行,因此第100~141行就会被列出来啦! 前面的99行都不会被显示出来喔!
至於范例二中,由於/var/log/messages随时会有数据写入,你想要让该文件有数据写入时就立刻显示到萤幕上, 就利用 -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 行之间的内容了! 但是里面涉及到管线命令,需要在第三篇的时候才讲的到!
|
非纯文字档: od
我们上面提到的,都是在查阅纯文字档的内容。 那么万一我们想要查阅非文字档,举例来说,例如 /usr/bin/passwd 这个运行档的内容时, 又该如何去读出资讯呢?事实上,由於运行档通常是 binary file ,使用上头提到的命令来读取他的内容时, 确实会产生类似乱码的数据啊!那怎么办?没关系,我们可以利用 od 这个命令来读取喔!
[root@www ~]# od [-t TYPE] 文件 |
利用这个命令,可以将 data file 或者是 binary file 的内容数据给他读出来喔! 虽然读出的来数值默认是使用非文字档,亦即是 16 进位的数值来显示的, 不过,我们还是可以透过 -t c 的选项与参数来将数据内的字节以 ASCII 类型的字节来显示, 虽然对於一般使用者来说,这个命令的用处可能不大,但是对於工程师来说, 这个命令可以将 binary file 的内容作一个大致的输出,他们可以看得出东西的啦~ ^_^
如果对纯文字档使用这个命令,你甚至可以发现到 ASCII 与字节的对照表!非常有趣! 例如上述的范例二,你可以发现到每个英文字 e 对照到的数字都是 145,转成十进位你就能够发现那是 101 罗! 如果你有任何程序语言的书,拿出来对照一下 ASCII 的对照表,就能够发现真是正确啊!呵呵!
修改文件时间或建置新档: touch
我们在 ls 这个命令的介绍时,有稍微提到每个文件在linux底下都会记录许多的时间参数, 其实是有三个主要的变动时间,那么三个时间的意义是什么呢?
-
modification time (mtime):
当该文件的『内容数据』变更时,就会升级这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔! -
status time (ctime):
当该文件的『状态 (status)』改变时,就会升级这个时间,举例来说,像是权限与属性被更改了,都会升级这个时间啊。 -
access time (atime):
当『该文件的内容被取用』时,就会升级这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man.config , 就会升级该文件的 atime 了。
这是个挺有趣的现象,举例来说,我们来看一看你自己的 /etc/man.config 这个文件的时间吧!
[root@www ~]# ls -l /etc/man.config |
看到了吗?在默认的情况下,ls 显示出来的是该文件的 mtime ,也就是这个文件的内容上次被更动的时间。 至於鸟哥的系统是在 9 月 4 号的时候安装的,因此,这个文件被产生导致状态被更动的时间就回溯到那个时间点了(ctime)! 而还记得刚刚我们使用的范例当中,有使用到man.config这个文件啊,所以啊,他的 atime 就会变成刚刚使用的时间了!
文件的时间是很重要的,因为,如果文件的时间误判的话,可能会造成某些程序无法顺利的运行。 OK!那么万一我发现了一个文件来自未来,该如何让该文件的时间变成『现在』的时刻呢? 很简单啊!就用『touch』这个命令即可!
Tips: 嘿嘿!不要怀疑系统时间会『来自未来』喔!很多时候会有这个问题的!举例来说在安装过后系统时间可能会被改变! 因为*时区在国际标准时间『格林威治时间, GMT』的右边,所以会比较早看到阳光,也就是说,*时间比GMT时间快了八小时! 如果安装行为不当,我们的系统可能会有八小时快转,你的文件就有可能来自八小时后了。 至於某些情况下,由於BIOS的配置错误,导致系统时间跑到未来时间,并且你又创建了某些文件。 等你将时间改回正确的时间时,该文件不就变成来自未来了?^_^ |
[root@www ~]# touch [-acdmt] 文件 |
在上面这个案例当中我们使用了『ll』这个命令(两个英文L的小写),这个命令其实就是『ls -l』的意思, ll本身不存在,是被『做出来』的一个命令别名。相关的命令别名我们会在bash章节当中详谈的,这里先知道ll="ls -l"即可。 至於分号『 ; 』则代表连续命令的下达啦!你可以在一行命令当中写入多重命令, 这些命令可以『依序』运行。由上面的命令我们会知道ll那一行有三个命令被下达在同一行中。
至於运行的结果当中,我们可以发现数据的内容与属性是被复制过来的,因此文件内容时间(mtime)与原本文件相同。 但是由於这个文件是刚刚被创建的,因此状态(ctime)与读取时间就便呈现在的时间啦! 那如果你想要变更这个文件的时间呢?可以这样做:
范例三:修改案例二的 bashrc 文件,将日期调整为两天前 |
透过 touch 这个命令,我们可以轻易的修订文件的日期与时间。并且也可以创建一个空的文件喔! 不过,要注意的是,即使我们复制一个文件时,复制所有的属性,但也没有办法复制 ctime 这个属性的。 ctime 可以记录这个文件最近的状态 (status) 被改变的时间。无论如何,还是要告知大家, 我们平时看的文件属性中,比较重要的还是属於那个 mtime 啊!我们关心的常常是这个文件的『内容』 是什么时候被更动的说~了乎?
无论如何, touch 这个命令最常被使用的情况是:
- 创建一个空的文件;
- 将某个文件日期修订为目前 (mtime 与 atime)
文件与目录的默认权限与隐藏权限
由第六章、Linux文件权限的内容我们可以知道一个文件有若干个属性, 包括读写运行(r, w, x)等基本权限,及是否为目录 (d) 与文件 (-) 或者是连结档 (l) 等等的属性! 要修改属性的方法在前面也约略提过了(chgrp, chown, chmod) ,本小节会再加强补充一下!
除了基本r, w, x权限外,在Linux的Ext2/Ext3文件系统下,我们还可以配置其他的系统隐藏属性, 这部份可使用 chattr 来配置,而以 lsattr 来查看,最重要的属性就是可以配置其不可修改的特性!让连文件的拥有者都不能进行修改! 这个属性可是相当重要的,尤其是在安全机制上面 (security)!
首先,先来复习一下上一章谈到的权限概念,将底下的例题看一看先:
例题:
你的系统有个一般身份使用者 dmtsai,他的群组属於 users,他的家目录在 /home/dmtsai, 你是root,你想将你的 ~/.bashrc 复制给他,可以怎么作?
答: 由上一章的权限概念我们可以知道 root 虽然可以将这个文件复制给 dmtsai,不过这个文件在 dmtsai 的家目录中却可能让 dmtsai 没有办法读写(因为该文件属於 root 的嘛!而 dmtsai 又不能使用 chown 之故)。 此外,我们又担心覆盖掉 dmtsai 自己的 .bashrc 配置档,因此,我们可以进行如下的动作喔:
|
例题:
我想在 /tmp 底下创建一个目录,这个目录名称为 chapter7_1 ,并且这个目录拥有者为 dmtsai, 群组为 users ,此外,任何人都可以进入该目录浏览文件,不过除了 dmtsai 之外,其他人都不能修改该目录下的文件。
答: 因为除了 dmtsai 之外,其他人不能修改该目录下的文件,所以整个目录的权限应该是 drwxr-xr-x 才对! 因此你应该这样做:
|
在上面这个例题当中,如果你知道 755 那个分数是怎么计算出来的,那么你应该对於权限有一定程度的概念了。 如果你不知道 755 怎么来的?那么...赶快回去前一章看看 chmod 那个命令的介绍部分啊!这部分很重要喔!你得要先清楚的了解到才行~否则就进行不下去罗~ 假设你对於权限都认识的差不多了,那么底下我们就要来谈一谈,『新增一个文件或目录时,默认的权限是什么?』这个议题!
文件默认权限:umask
OK!那么现在我们知道如何创建或者是改变一个目录或文件的属性了,不过, 你知道当你创建一个新的文件或目录时,他的默认权限会是什么吗?呵呵!那就与 umask 这个玩意儿有关了!那么 umask 是在搞什么呢?基本上, umask 就是指定 『目前使用者在创建文件或目录时候的权限默认值』, 那么如何得知或配置 umask 呢?他的指定条件以底下的方式来指定:
[root@www ~]# umask |
查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字型态的权限配置分数, 一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了! 奇怪的是,怎么 umask 会有四组数字啊?不是只有三组吗?是没错啦。 第一组是特殊权限用的,我们先不要理他,所以先看后面三组即可。
在默认权限的属性上,目录与文件是不一样的。从第六章我们知道 x 权限对於目录是非常重要的! 但是一般文件的创建则不应该有运行的权限,因为一般文件通常是用在於数据的记录嘛!当然不需要运行的权限了。 因此,默认的情况如下:
- 若使用者创建为『文件』则默认『没有可运行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下:
-rw-rw-rw- - 若使用者创建为『目录』,则由於 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下:
drwxrwxrwx
要注意的是,umask 的分数指的是『该默认值需要减掉的权限!』因为 r、w、x 分别是 4、2、1 分,所以罗!也就是说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉运行与写入的权限,也就是 3 分,这样了解吗?请问你, 5 分是什么?呵呵! 就是读与运行的权限啦!
如果以上面的例子来说明的话,因为 umask 为 022 ,所以 user 并没有被拿掉任何权限,不过 group 与 others 的权限被拿掉了 2 (也就是 w 这个权限),那么当使用者:
- 创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
- 创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
不相信吗?我们就来测试看看吧!
[root@www ~]# umask |
呵呵!瞧见了吧!确定新建文件的权限是没有错的。
- umask的利用与重要性:专题制作
想像一个状况,如果你跟你的同学在同一部主机里面工作时,因为你们两个正在进行同一个专题, 老师也帮你们两个的帐号创建好了相同群组的状态,并且将 /home/class/ 目录做为你们两个人的专题目录。 想像一下,有没有可能你所制作的文件你的同学无法编辑?果真如此的话,那就伤脑筋了!
这个问题很常发生啊!举上面的案例来看就好了,你看一下 test1 的权限是几分? 644 呢!意思是『如果 umask 订定为 022 ,那新建的数据只有使用者自己具有 w 的权限, 同群组的人只有 r 这个可读的权限而已,并无法修改喔!』这样要怎么共同制作专题啊!您说是吧!
所以,当我们需要新建文件给同群组的使用者共同编辑时,那么 umask 的群组就不能拿掉 2 这个 w 的权限! 所以罗, umask 就得要是 002 之类的才可以!这样新建的文件才能够是 -rw-rw-r-- 的权限模样喔! 那么如何配置 umask 呢?简单的很,直接在 umask 后面输入 002 就好了!
[root@www ~]# umask 002 |
所以说,这个 umask 对於新建文件与目录的默认权限是很有关系的!这个概念可以用在任何服务器上面, 尤其是未来在你架设文件服务器 (file server) ,举例来说, SAMBA Server 或者是 FTP server 时, 都是很重要的观念!这牵涉到你的使用者是否能够将文件进一步利用的问题喔!不要等闲视之!
例题:
假设你的 umask 为 003 ,请问该 umask 情况下,创建的文件与目录权限为?
答: umask 为 003 ,所以拿掉的权限为 --------wx,因此:
|
Tips: 关於 umask 与权限的计算方式中,教科书喜欢使用二进位的方式来进行 AND 与 NOT 的计算, 不过,鸟哥还是比较喜欢使用符号方式来计算~联想上面比较容易一点~ 但是,有的书籍或者是 BBS 上面的朋友,喜欢使用文件默认属性 666 与目录默认属性 777 来与 umask 进行相减的计算~这是不好的喔!以上面例题来看, 如果使用默认属性相加减,则文件变成:666-003=663,亦即是 -rw-rw--wx ,这可是完全不对的喔! 想想看,原本文件就已经去除 x 的默认属性了,怎么可能突然间冒出来了? 所以,这个地方得要特别小心喔! |
在默认的情况中, root 的 umask 会拿掉比较多的属性,root 的 umask 默认是 022 , 这是基於安全的考量啦~至於一般身份使用者,通常他们的 umask 为 002 ,亦即保留同群组的写入权力! 其实,关於默认 umask 的配置可以参考 /etc/bashrc 这个文件的内容,不过,不建议修改该文件, 你可以参考第十一章 bash shell 提到的环境参数配置档 (~/.bashrc) 的说明!
文件隐藏属性:
什么?文件还有隐藏属性?光是那九个权限就快要疯掉了,竟然还有隐藏属性,真是要命~ 但是没办法,就是有文件的隐藏属性存在啊!不过,这些隐藏的属性确实对於系统有很大的帮助的~ 尤其是在系统安全 (Security) 上面,重要的紧呢!不过要先强调的是,底下的chattr命令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个命令了。底下我们就来谈一谈如何配置与检查这些隐藏的属性吧!
- chattr (配置文件隐藏属性)
[root@www ~]# chattr [+-=][ASacdistu] 文件或目录名称 |
这个命令是很重要的,尤其是在系统的数据安全上面!由於这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性呦!其中,个人认为最重要的当属 +i 与 +a 这个属性了。+i 可以让一个文件无法被更动,对於需要强烈的系统安全的人来说, 真是相当的重要的!里头还有相当多的属性是需要 root 才能配置的呢!
此外,如果是 log file 这种的登录档,就更需要 +a 这个可以添加,但是不能修改旧有的数据与删除的参数了!怎样?很棒吧! 未来提到登录档 (十九章) 的认知时,我们再来聊一聊如何配置他吧!
- lsattr (显示文件隐藏属性)
[root@www ~]# lsattr [-adR] 文件或目录 |
使用 chattr 配置后,可以利用 lsattr 来查阅隐藏的属性。不过, 这两个命令在使用上必须要特别小心,否则会造成很大的困扰。例如:某天你心情好,突然将 /etc/shadow 这个重要的密码记录文件给他配置成为具有 i 的属性,那么过了若干天之后, 你突然要新增使用者,却一直无法新增!别怀疑,赶快去将 i 的属性拿掉吧!
文件特殊权限: SUID, SGID, SBIT
我们前面一直提到关於文件的重要权限,那就是 rwx 这三个读、写、运行的权限。 但是,眼尖的朋友们在第六章的目录树章节中, 一定注意到了一件事,那就是,怎么我们的 /tmp 权限怪怪的? 还有,那个 /usr/bin/passwd 也怪怪的?怎么回事啊?看看先:
[root@www ~]# ls -ld /tmp ; ls -l /usr/bin/passwd |
不是应该只有 rwx 吗?还有其他的特殊权限( s 跟 t )啊?啊.....头又开始昏了~ @_@ 因为 s 与 t 这两个权限的意义与系统的帐号 (第十四章)及系统的程序(process, 第十七章)较为相关, 所以等到后面的章节谈完后你才会比较有概念!底下的说明先看看就好,如果看不懂也没有关系, 先知道s放在哪里称为SUID/SGID以及如何配置即可,等系统程序章节读完后,再回来看看喔!
- Set UID
当 s 这个标志出现在文件拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个文件的权限状态:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 的特殊权限。 那么SUID的权限对於一个文件的特殊功能是什么呢?基本上SUID有这样的限制与功能:
- SUID 权限仅对二进位程序(binary program)有效;
- 运行者对於该程序需要具有 x 的可运行权限;
- 本权限仅在运行该程序的过程中有效 (run-time);
- 运行者将具有该程序拥有者 (owner) 的权限。
讲这么硬的东西你可能对於 SUID 还是没有概念,没关系,我们举个例子来说明好了。 我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:『-r-------- 1 root root』,意思是这个文件仅有root可读且仅有root可以强制写入而已。 既然这个文件仅有 root 可以修改,那么鸟哥的 vbird 这个一般帐号使用者能否自行修改自己的密码呢? 你可以使用你自己的帐号输入『passwd』这个命令来看看,嘿嘿!一般使用者当然可以修改自己的密码了!
唔!有没有冲突啊!明明 /etc/shadow 就不能让 vbird 这个一般帐户去存取的,为什么 vbird 还能够修改这个文件内的密码呢? 这就是 SUID 的功能啦!藉由上述的功能说明,我们可以知道
- vbird 对於 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 vbird 能运行 passwd;
- passwd 的拥有者是 root 这个帐号;
- vbird 运行 passwd 的过程中,会『暂时』获得 root 的权限;
- /etc/shadow 就可以被 vbird 所运行的 passwd 所修改。
但如果 vbird 使用 cat 去读取 /etc/shadow 时,他能够读取吗?因为 cat 不具有 SUID 的权限,所以 vbird 运行 『cat /etc/shadow』 时,是不能读取 /etc/shadow 的。我们用一张示意图来说明如下:
图4.4.1、SUID程序运行的过程示意图
另外,SUID 仅可用在binary program 上, 不能够用在 shell script 上面!这是因为 shell script 只是将很多的 binary 运行档叫进来运行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的配置, 而不是 shell script 本身。当然,SUID 对於目录也是无效的~这点要特别留意。
- Set GID
当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID 罗!是这样没错!^_^。 举例来说,你可以用底下的命令来观察到具有 SGID 权限的文件喔:
[root@www ~]# ls -l /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 |
与 SUID 非常的类似,若我使用 vbird 这个帐号去运行 locate 时,那 vbird 将会取得 slocate 群组的支持, 因此就能够去读取 mlocate.db 啦!非常有趣吧!
除了 binary program 之外,事实上 SGID 也能够用在目录上,这也是非常常见的一种用途! 当一个目录配置了 SGID 的权限后,他将具有如下的功能:
- 使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
- 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
- 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。
SGID 对於专案开发来说是非常重要的!因为这涉及群组权限的问题,您可以参考一下本章后续情境模拟的案例,应该就能够对於 SGID 有一些了解的!^_^
- Sticky Bit
这个 Sticky Bit, SBIT 目前只针对目录有效,对於文件已经没有效果了。 SBIT 对於目录的作用是:
- 当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
- 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件
换句话说:当甲这个使用者於 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示『甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等动作。』 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。
举例来说,我们的 /tmp 本身的权限是『drwxrwxrwt』, 在这样的权限内容下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。这个特性也是挺重要的啊!你可以这样做个简单的测试:
- 以 root 登陆系统,并且进入 /tmp 当中;
- touch test,并且更改 test 权限成为 777 ;
- 以一般使用者登陆,并进入 /tmp;
- 尝试删除 test 这个文件!
由於 SUID/SGID/SBIT 牵涉到程序的概念,因此再次强调,这部份的数据在您读完第十七章关於程序方面的知识后,要再次的回来瞧瞧喔! 目前,你先有个简单的基础概念就好了!文末的参考数据也建议阅读一番喔!
- SUID/SGID/SBIT 权限配置
前面介绍过 SUID 与 SGID 的功能,那么如何配置文件使成为具有 SUID 与 SGID 的权限呢? 这就需要第六章的数字更改权限的方法了! 现在你应该已经知道数字型态更改权限的方式为『三个数字』的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!
- 4 为 SUID
- 2 为 SGID
- 1 为 SBIT
假设要将一个文件权限改为『-rwsr-xr-x』时,由於 s 在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来配置!此外,还有大 S 与大 T 的产生喔!参考底下的范例啦!
Tips: 注意:底下的范例只是练习而已,所以鸟哥使用同一个文件来配置,你必须了解 SUID 不是用在目录上,而 SBIT 不是用在文件上的喔! |
[root@www ~]# cd /tmp |
最后一个例子就要特别小心啦!怎么会出现大写的 S 与 T 呢?不都是小写的吗? 因为 s 与 t 都是取代 x 这个权限的,但是你有没有发现阿,我们是下达 7666 喔!也就是说, user, group 以及 others 都没有 x 这个可运行的标志( 因为 666 嘛 ),所以,这个 S, T 代表的就是『空的』啦!怎么说? SUID 是表示『该文件在运行的时候,具有文件拥有者的权限』,但是文件 拥有者都无法运行了,哪里来的权限给其他人使用?当然就是空的啦! ^_^
而除了数字法之外,你也可以透过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t 罗!来看看如下的范例:
# 配置权限成为 -rws--x--x 的模样: |
观察文件类型:file
如果你想要知道某个文件的基本数据,例如是属於 ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函式库 (share library) 等等的资讯,就可以利用 file 这个命令来检阅喔! 举例来说:
[root@www ~]# file ~/.bashrc |
透过这个命令,我们可以简单的先判断这个文件的格式为何喔!
命令与文件的搜寻:
文件的搜寻可就厉害了!因为我们常常需要知道那个文件放在哪里,才能够对该文件进行一些修改或维护等动作。 有些时候某些软件配置档的档名是不变的,但是各 distribution 放置的目录则不同。 此时就得要利用一些搜寻命令将该配置档的完整档名捉出来,这样才能修改嘛!您说是吧!^_^
命令档名的搜寻:
我们知道在终端机模式当中,连续输入两次[tab]按键就能够知道使用者有多少命令可以下达。 那你知不知道这些命令的完整档名放在哪里?举例来说,ls 这个常用的命令放在哪里呢? 就透过 which 或 type 来找寻吧!
- which (寻找『运行档』)
[root@www ~]# which [-a] command |
这个命令是根据『PATH』这个环境变量所规范的路径,去搜寻『运行档』的档名~ 所以,重点是找出『运行档』而已!且 which 后面接的是『完整档名』喔!若加上 -a 选项,则可以列出所有的可以找到的同名运行档,而非仅显示第一个而已!
最后一个范例最有趣,怎么 cd 这个常用的命令竟然找不到啊!为什么呢?这是因为 cd 是『bash 内建的命令』啦! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的啊!那怎办?没关系!我们可以透过 type 这个命令喔! 关於 type 的用法我们将在 第十一章的 bash 再来谈!
文件档名的搜寻:
再来谈一谈怎么搜寻文件吧!在 Linux 底下也有相当优异的搜寻命令呦!通常 find 不很常用的!因为速度慢之外, 也很操硬盘!通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻呦! 为什么呢?因为 whereis 与 locate 是利用数据库来搜寻数据,所以相当的快速,而且并没有实际的搜寻硬盘, 比较省时间啦!
- whereis (寻找特定文件)
[root@www ~]# whereis [-bmsu] 文件或目录名 |
等一下我们会提到 find 这个搜寻命令, find 是很强大的搜寻命令,但时间花用的很大! (因为 find 是直接搜寻硬盘,为如果你的硬盘比较老旧的话,嘿嘿!有的等!) 这个时候 whereis 就相当的好用了!另外, whereis 可以加入选项来找寻相关的数据, 例如如果你是要找可运行档( binary )那么加上 -b 就可以啦! 如果不加任何选项的话,那么就将所有的数据列出来罗!
那么 whereis 到底是使用什么咚咚呢?为何搜寻的速度会比 find 快这么多? 其实那也没有什么!这是因为 Linux 系统会将系统内的所有文件都记录在一个数据库文件里面, 而当使用 whereis 或者是底下要说的 locate 时,都会以此数据库文件的内容为准, 因此,有的时后你还会发现使用这两个运行档时,会找到已经被杀掉的文件! 而且也找不到最新的刚刚创建的文件呢!这就是因为这两个命令是由数据库当中的结果去搜寻文件的所在啊! 更多与这个数据库有关的说明,请参考下列的 locate 命令。
- locate
[root@www ~]# locate [-ir] keyword |
这个 locate 的使用更简单,直接在后面输入『文件的部分名称』后,就能够得到结果。 举上面的例子来说,我输入 locate passwd ,那么在完整档名 (包含路径名称) 当中,只要有 passwd 在其中, 就会被显示出来的!这也是个很方便好用的命令,如果你忘记某个文件的完整档名时~~
但是,这个东西还是有使用上的限制呦!为什么呢?你会发现使用 locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由『已创建的数据库 /var/lib/mlocate/』 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速罗!
那么有什么限制呢?就是因为他是经由数据库来搜寻的,而数据库的创建默认是在每天运行一次 (每个 distribution 都不同,CentOS 5.x 是每天升级数据库一次!),所以当你新创建起来的文件, 却还在数据库升级之前搜寻该文件,那么 locate 会告诉你『找不到!』呵呵!因为必须要升级数据库呀!
那能否手动升级数据库哪?当然可以啊!升级 locate 数据库的方法非常简单,直接输入『 updatedb 』就可以了! updatedb 命令会去读取 /etc/updatedb.conf 这个配置档的配置,然后再去硬盘里面进行搜寻档名的动作, 最后就升级整个数据库文件罗!因为 updatedb 会去搜寻硬盘,所以当你运行 updatedb 时,可能会等待数分钟的时间喔!
- updatedb:根据 /etc/updatedb.conf 的配置去搜寻系统硬盘内的档名,并升级 /var/lib/mlocate 内的数据库文件;
- locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字档名。
- find
[root@www ~]# find [PATH] [option] [action] |
时间参数真是挺有意思的!我们现在知道 atime, ctime 与 mtime 的意义,如果你想要找出一天内被更动过的文件名称, 可以使用上述范例一的作法。但如果我想要找出『4天内被更动过的文件档名』呢?那可以使用『 find /var -mtime -4 』。那如果是『4天前的那一天』就用『 find /var -mtime 4 』。有没有加上『+, -』差别很大喔!我们可以用简单的图示来说明一下:
图5.2.1、find 相关的时间参数意义
图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图5.2.1我们可以清楚的知道:
- +4代表大於等於5天前的档名:ex> find /var -mtime +4
- -4代表小於等於4天内的文件档名:ex> find /var -mtime -4
- 4则是代表4-5那一天的文件档名:ex> find /var -mtime 4
非常有趣吧!你可以在 /var/ 目录下搜寻一下,感受一下输出文件的差异喔!再来看看其他 find 的用法吧!
选项与参数: |
如果你想要找出某个使用者在系统底下创建了啥咚咚,使用上述的选项与参数,就能够找出来啦! 至於那个 -nouser 或 -nogroup 的选项功能中,除了你自行由网络上面下载文件时会发生之外, 如果你将系统里面某个帐号删除了,但是该帐号已经在系统内创建很多文件时,就可能会发生无主孤魂的文件存在! 此时你就得使用这个 -nouser 来找出该类型的文件罗!
选项与参数: |
上述范例中比较有趣的就属 -perm 这个选项啦!他的重点在找出特殊权限的文件罗! 我们知道 SUID 与 SGID 都可以配置在二进位程序上,假设我想要找出来 /bin, /sbin 这两个目录下, 只要具有 SUID 或 SGID 就列出来该文件,你可以这样做:
[root@www ~]# find /bin /sbin -perm +6000 |
因为 SUID 是 4 分,SGID 2 分,总共为 6 分,因此可用 +6000 来处理这个权限! 至於 find 后面可以接多个目录来进行搜寻!另外, find 本来就会搜寻次目录,这个特色也要特别注意喔! 最后,我们再来看一下 find 还有什么特殊功能吧!
选项与参数: |
find 的特殊功能就是能够进行额外的动作(action)。我们将范例八的例子以图解来说明如下:
图5.2.2、find 相关的额外动作
该范例中特殊的地方有 {} 以及 \; 还有 -exec 这个关键字,这些东西的意义为:
- {} 代表的是『由 find 找到的内容』,如上图所示,find 的结果会被放置到 {} 位置中;
- -exec 一直到 \; 是关键字,代表 find 额外动作的开始 (-exec) 到结束 (\;) ,在这中间的就是 find 命令内的额外动作。 在本例中就是『 ls -l {} 』罗!
- 因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。
透过图 5.2.2 你应该就比较容易了解 -exec 到 \; 之间的意义了吧!
如果你要找的文件是具有特殊属性的,例如 SUID 、文件拥有者、文件大小等等, 那么利用 locate 是没有办法达成你的搜寻的!此时 find 就显的很重要啦! 另外,find 还可以利用万用字节来找寻档名呢!举例来说,你想要找出 /etc 底下档名包含 httpd 的文件, 那么你就可以这样做:
[root@www ~]# find /etc -name '*httpd*' |
不但可以指定搜寻的目录(连同次目录),并且可以利用额外的选项与参数来找到最正确的档名!真是好好用! 不过由於 find 在寻找数据的时后相当的操硬盘!所以没事情不要使用 find 啦!有更棒的命令可以取代呦!那就是上面提到的 whereis 与locate 罗!
极重要!权限与命令间的关系:
我们知道权限对於使用者帐号来说是非常重要的,因为他可以限制使用者能不能读取/创建/删除/修改文件或目录! 在这一章我们介绍了很多文件系统的管理命令,第六章则介绍了很多文件权限的意义。在这个小节当中, 我们就将这两者结合起来,说明一下什么命令在什么样的权限下才能够运行吧!^_^
一、让使用者能进入某目录成为『可工作目录』的基本权限为何:
- 可使用的命令:例如 cd 等变换工作目录的命令;
- 目录所需权限:使用者对这个目录至少需要具有 x 的权限
- 额外需求:如果使用者想要在这个目录内利用 ls 查阅档名,则使用者对此目录还需要 r 的权限。
二、使用者在某个目录内读取一个文件的基本权限为何?
- 可使用的命令:例如本章谈到的 cat, more, less等等
- 目录所需权限:使用者对这个目录至少需要具有 x 权限;
- 文件所需权限:使用者对文件至少需要具有 r 的权限才行!
三、让使用者可以修改一个文件的基本权限为何?
四、让一个使用者可以创建一个文件的基本权限为何?
- 目录所需权限:使用者在该目录要具有 w,x 的权限,重点在 w 啦!
五、让使用者进入某目录并运行该目录下的某个命令之基本权限为何?
- 目录所需权限:使用者在该目录至少要有 x 的权限;
- 文件所需权限:使用者在该文件至少需要有 x 的权限
例题:
让一个使用者 vbird 能够进行『cp /dir1/file1 /dir2』的命令时,请说明 dir1, file1, dir2 的最小所需权限为何?
答: 运行 cp 时, vbird 要『能够读取来源档,并且写入目标档!』所以应参考上述第二点与第四点的说明! 因此各文件/目录的最小权限应该是:
|
例题:
有一个文件全名为 /home/student/www/index.html ,各相关文件/目录的权限如下:
drwxr-xr-x 23 root root 4096 Sep 22 12:09 / 请问 vbird 这个帐号(不属於student群组)能否读取 index.html 这个文件呢? 答: 虽然 www 与 index.html 是可以让 vbird 读取的权限,但是因为目录结构是由根目录一层一层读取的, 因此 vbird 可进入 /home 但是却不可进入 /home/student/ ,既然连进入 /home/student 都不许了, 当然就读不到 index.html 了!所以答案是『vbird不会读取到 index.html 的内容』喔!
那要如何修改权限呢?其实只要将 /home/student 的权限修改为最小 711 ,或者直接给予 755 就可以罗! 这可是很重要的概念喔! |
重点回顾
- 绝对路径:『一定由根目录 / 写起』;相对路径:『不是由 / 写起』
- 特殊目录有:., .., -, ~, ~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 -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 可以加入许多选项来直接查询文件系统,以获得自己想要知道的档名。
本章习题:
( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
情境模拟题一:假设系统中有两个帐号,分别是 alex 与 arod ,这两个人除了自己群组之外还共同支持一个名为 project 的群组。假设这两个用户需要共同拥有 /srv/ahome/ 目录的开发权,且该目录不许其他人进入查阅。 请问该目录的权限配置应为何?请先以传统权限说明,再以 SGID 的功能解析。
- 目标:了解到为何专案开发时,目录最好需要配置 SGID 的权限!
- 前提:多个帐号支持同一群组,且共同拥有目录的使用权!
- 需求:需要使用 root 的身份来进行 chmod, chgrp 等帮用户配置好他们的开发环境才行! 这也是管理员的重要任务之一!
首先我们得要先制作出这两个帐号的相关数据,帐号/群组的管理在后续我们会介绍, 您这里先照著底下的命令来制作即可:
[root@www ~]# groupadd project <==添加新的群组 |
然后开始来解决我们所需要的环境吧!
- 首先创建所需要开发的专案目录:
[root@www ~]# mkdir /srv/ahome
[root@www ~]# ll -d /srv/ahome
drwxr-xr-x 2 root root 4096 Sep 29 22:36 /srv/ahome - 从上面的输出结果可发现 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,因此似乎没问题了! - 实际分别以两个使用者来测试看看,情况会是如何?先用 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 可以删除他,但是却不能编辑他!这不是我们要的样子啊!赶紧来重新规划一下。
- 加入 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 这个群组才行!
简答题部分:
- 什么是绝对路径与相对路径
绝对路径的写法为由 / 开始写,至於相对路径则不由 / 开始写!此外,相对路径为相对於目前工作目录的路径!
- 如何更改一个目录的名称?例如由 /home/test 变为 /home/test2
mv /home/test /home/test2
- PATH 这个环境变量的意义?
这个是用来指定运行档运行的时候,命令搜寻的目录路径。
- umask 有什么用处与优点?
umask 可以拿掉一些权限,因此,适当的定义 umask 有助於系统的安全, 因为他可以用来创建默认的目录或文件的权限。
- 当一个使用者的 umask 分别为 033 与 044 他所创建的文件与目录的权限为何?
在 umask 为 033 时,则默认是拿掉 group 与 other 的 w(2)x(1) 权限,因此权限就成为『文件 -rw-r--r-- , 目录 drwxr--r-- 』而当 umask 044 时,则拿掉 r 的属性,因此就成为『文件 -rw--w--w-,目录 drwx-wx-wx』
- 什么是 SUID ?
当一个命令具有 SUID 的功能时,则:
- SUID 权限仅对二进位程序(binary program)有效;
- 运行者对於该程序需要具有 x 的可运行权限;
- 本权限仅在运行该程序的过程中有效 (run-time);
- 运行者将具有该程序拥有者 (owner) 的权限。
- 当我要查询 /usr/bin/passwd 这个文件的一些属性时(1)传统权限;(2)文件类型与(3)文件的隐藏属性,可以使用什么命令来查询?
ls -al
file
lsattr - 尝试用 find 找出目前 linux 系统中,所有具有 SUID 的文件有哪些?
find / -perm +4000 -print
- 找出 /etc 底下,文件大小介於 50K 到 60K 之间的文件,并且将权限完整的列出 (ls -l):
find /etc -size +50k -a -size -60k -exec ls -l {} \;
注意到 -a ,那个 -a 是 and 的意思,为符合两者才算成功 - 找出 /etc 底下,文件容量大於 50K 且文件所属人不是 root 的档名,且将权限完整的列出 (ls -l);
find /etc -size +50k -a ! -user root -exec ls -ld {} \;
find /etc -size +50k -a ! -user root -type f -exec ls -l {} \;
上面两式均可!注意到 ! ,那个 ! 代表的是反向选择,亦即『不是后面的项目』之意! - 找出 /etc 底下,容量大於 1500K 以及容量等於 0 的文件:
find /etc -size +1500k -o -size 0
相对於 -a ,那个 -o 就是或 (or) 的意思罗!
参考数据与延伸阅读
- 小洲大大回答 SUID/SGID 的一篇讨论:
http://phorum.vbird.org/viewtopic.php?t=20256