1、选择题20分,10个
2、填空题10分,5个
3、简答题20分,5个
4、情景题20分,2个
5、shell编程题30分,3个
重点
主机规划与磁盘分区
各硬件装置在Linux中的文件名 p66
磁盘分区:课本例题 p67
磁盘分区表例题 p70
磁盘分区的选择 p75
第6章Linux的文件权限与目录配置
文件名为目录、拥有者权限、同用户组用户权限、其他用户权限
linux文件属性,例题。如何改变文件属性和权限。
142 chmod 644 basic 146
详细看例题,有原题。
根目录的上一层与根目录自己是同一个目录
第7章Linux文件与目录
目录和路径,目录的操作,文件目录管理,看例题。171
文件目录的权限与隐藏权限。有题,主要是例题。180,181,182
情景模拟题:
情境模拟题一:假设系统中有两个帐号,分别是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 这个群组才行!
简答题:
当一个使用者的 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』
找出 /etc 底下,文件大小介於 50K 到 60K 之间的文件,并且将权限完整的列出 (ls -l):
find /etc -size +50k -a -size -60k -exec ls -l {} \;
找出 /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) 的意思啰!
第8章
磁盘与文件系统管理
Linux的Ext2文件系统 200
挂载点的意义
文件系统的简单操作 # fdisk/dev/hdc
磁盘分区、格式化、检验与挂载
磁盘挂载与卸载
本章课后练习情景1和情景2考试其中一个
•情境模拟题一:复原本章的各例题练习,本章新增非常多partition ,请将这些partition 删除,恢复到原本刚安装好时的状态。
◦目标:了解到删除分割槽需要注意的各项资讯;
◦前提:本章的各项范例练习你都必须要做过,才会拥有/dev/hdc6, /dev/hdc7 出现;
◦需求:熟悉fdisk, umount, swapoff 等指令。
由于本章处理完毕后,将会有/dev/hdc6 与/dev/hdc7 这两个新增的partition ,所以请删除掉这两个partition 。删除的过程需要注意的是:
1.需先以free / swapon -s / mount 等指令查阅, /dev/hdc6, /dev/hdc7 不可以被使用!如果有被使用,则你必须要使用umount 卸载档案系统。如果是记忆体置换空间,则需使用swapon -s 找出被使用的分割槽, 再以swapoff 去卸载他!
2.观察/etc/fstab ,该档案不能存在这两个partition;
3.使用『 fdisk /dev/hdc 』删除,注意,由于是逻辑分割槽,这些分割槽一定从5 号开始连续编号,因此你最好不要从6 号删除!否则原本的7 号在你删除6 号后,将会变成6 号!因此,你应该由7 号删除掉,再删除6 号。
•情境模拟题二:由于我的系统原本分割的不够好,我的用户希望能够独立一个filesystem 附挂在/srv/myproject 目录下。那你该如何建立新的filesystem ,并且让这个filesystem 每次开机都能够自动的挂载到/srv/myproject , 且该目录是给project 这个群组共用的,其他人不可具有任何权限。且该 filesystem 具有 5GB 的容量。
◦目标:理解档案系统的建置、自动挂载档案系统与专案开发必须要的权限;
◦前提:你需要进行过第七章的情境模拟才可以继续本章;
◦需求:本章的所有概念必须要清楚!
那就让我们开始来处理这个流程吧!
1.首先,我们必须要使用fdisk /dev/hdc 来建立新的partition ,由于本章之前范例的partition 已经在上一个练习中删除, 因此你应该会多出一个/dev/hdc6 才对:『fdisk / dev/hdc』,然后按下『 n 』,按下『Enter』选择预设的启始磁柱, 按下『+5000M』建立5GB 的磁碟分割槽,可以多按一次『p 』看看是否正确,若无问题则按下『w』写入分割表;
2.避免重新开机,因此使用『 partprobe 』强制核心更新分割表;如果萤幕出现类似:『 end_request: I/O error dev fd0, sector 0 』的错误时,不要担心啊!这个说明的是『找不到软碟』,我们本来就没有软碟, 所以这个错误是可以忽略的。
3.建立完毕后,开始进行格式化的动作如下:『mkfs -t ext3 /dev/hdc6』,这样就OK 了!
4.开始建立挂载点,利用:『 mkdir /srv/myproject 』来建立即可;
5.编写自动挂载的设定档:『 nano /etc/fstab 』,这个档案最底下新增一行,内容如下:
/dev/hdc6 /srv/myproject ext3 defaults 1 2
6.测试自动挂载:『 mount -a 』,然后使用『 df 』观察看看有无挂载即可!
7.设定最后的权限,使用:『 chgrp project /srv/myproject 』以及『 chmod 2770 /srv/myproject 』即可。
课后简答题:
如果由于你的主机磁盘容量不够大,你想要添加一颗新磁盘,并将该磁盘全部分割成单一分割槽,且将该分割槽挂载到 /home 目录, 你该如何处置?
详细的流程可以分为硬体组装、磁碟分割、格式化、资料搬移与挂载等。
◦安装硬碟:关掉Linux 主机电源,若为IDE 介面时,需要处理跳针(jump) ,放入主机后插好硬碟的排线与电源线,重新启动电源;
◦磁碟分割:透过类似上述情境模拟二的动作,将整颗磁碟分割成单一主要分割槽,类似/dev/sdb1 占有全部容量;
◦格式化:透过mkfs -t ext3 来格式化;
◦资料搬移:由于原本的/home 还会有资料存在,因此你可以mount /dev/sdb1 /mnt ,再将/home 的资料复制到/mnt/ 中,例如:『 cp -a /home/* / mnt 』即可。复制完毕后卸载 /home 以及 /mnt
◦重新挂载:编辑/etc/fstab ,将/home 所在的filesystem 装置改为/dev/sdb1 之类的新分割槽,然后mount -a 测试看看是否正确,如果正确的话,才是顺利结束了这次的动作。
当我有两个文件,分别是 file1 与 file2 ,这两个文件互为 hard link 的文件,请问, 若我将 file1 删除,然后再以类似 vi 的方式重新创建一个名为 file1 的文件, 则 file2 的内容是否会被更动?
这是来自网友的疑问。当我删除file1 之后, file2 则为一个正规档案,并不会与他人共同分享同一个inode 与block ,因此,当我重新建立一个档名为file1 时,他所利用的inode 与block 都是由我们的filesystem 主动去搜寻meta data ,找到空的inode 与block 来建立的, 与原本的file1 并没有任何关连性喔!所以,新建的file1 并不会影响file2 呢!
第9章
练习文件的压缩与打包,
情景题:2,3
•情境模拟题二:妳想要逐时备份/srv/myproject 这个目录内的资料,又担心每次备份的资讯太多, 因此想要使用dump 的方式来逐一备份资料到/backups 这个目录下。该如何处理?
◦目标:了解到dump 以及各个不同level 的作用;
◦前提:被备份的资料为单一partition ,亦即本例中的/srv/myproject
◦需求:/srv/myproject 为单一filesystem ,且在/etc/fstab 内此挂载点的dump 栏位为 1
实际处理的方法其实还挺简单的!我们可以这样做看看:
1.先替该目录制作一些资料,亦即复制一些东西过去吧!
cp -a /etc /boot /srv/myproject
2.开始进行dump ,记得,一开始是使用level 0 的完整备份喔!
mkdir /backups
dump -0u -j -f /backups/myproject.dump /srv/myproject
上面多了个-j 的选项,目的是为了要进行压缩,减少备份的资料量。
3.尝试将/srv/myproject 这个档案系统加大,将/var/log/ 的资料复制进去吧!
cp -a /var/log/ /srv/myproject
此时原本的/srv/myproject 已经被改变了!继续进行备份看看!
4.将/srv/myproject 以level 1 来进行备份:
dump -1u -j -f /backups/myproject.dump.1 /srv/myproject
ls -l /backups
妳应该就会看到两个档案,其中第二个档案(myproject.dump.1) 会小的多!这样就搞定啰备份资料!
•情境模拟三:假设过了一段时间后,妳的/srv/myproject 变的怪怪的,妳想要将该filesystem 以刚刚的备份资料还原, 此时该如何处理呢?妳可以这样做的:
1.先将/srv/myproject 卸载,并且将该partition 重新格式化!
umount /dev/hdc6
mkfs -t ext3 /dev/hdc6
2.重新挂载原本的partition ,此时该目录内容应该是空的!
mount -a
妳可以自行使用df 以及ls -l /srv/myproject 查阅一下该目录的内容,是空的啦!
3.将完整备份的level 0 的档案/backups/myproject.dump 还原回来:
cd /srv/myproject
restore -r -f /backups/myproject.dump
此时该目录的内容为第一次备份的状态!还需要进行后续的处理才行!
4.将后续的level 1 的备份也还原回来:
cd /srv/myproject
restore -r -f /backups/myproject.dump.1
此时才是恢复到最后一次备份的阶段!如果还有level 2, level 3 时,就得要一个一个的依序还原才行!
第10章
vi操作部分,简单看一下操作即可。
第11章
变量的显示与设置
变量内容的删除、替代与替换
数据流重定向
命令执行的判断依据:;,&&,||
管道命令
简答题:
如何配置一个变量名称为 name 内容为 It's my name ?
name=It\'s\ my\ name 或 name="It's my name"
•bash 环境设定档主要分为哪两种类型的读取?分别读取哪些重要档案?
(1)login shell:主要读取/etc/profile 及~/.bash_profile
(2)non-logni shell:主要读取~/.bashrc 而已。
•CentOS 5.x 的man page 的路径设定档案?
/etc/man.config
试说明 ', ", 与 ` 这些符号在变量定义中的用途?
参考变数规则那一章节,其中, " 可以具有变数的内容属性,' 则仅有一般字元,至于` 之内则是可先被执行的指令。
连续命令中, ;, &&, || 有何不同?
分号可以让两个command 连续运作,不考虑command1 的输出状态, && 则前一个指令必需要没有错误讯息,亦即回传值需为0 则command2 才会被执行, || 则与&& 相反!
请问 foo1 && foo2 | foo3 > foo4 ,这个命令串当中, foo1/foo2/foo3/foo4 是命令还是文件? 整串命令的意义为?
foo1, foo2 与foo3 都是指令, foo4 是装置或档案。整串指令意义为:
(1)当foo1 执行结果有错误时,则该指令串结束;
(2)若foo1 执行结果没有错误时,则执行foo2 | foo3 > foo4 ;其中:
(2-1)foo2 将stdout 输出的结果传给foo3 处理;
(2-2)foo3 将来自foo2 的stdout 当成stdin ,处理完后将资料流重新导向foo4 这个装置/档案
第12章 正则表达式与文件格式化处理
grep的使用
sed工具:注意考试得是这一节的例题
awk工具的使用
情景练习1,2
•情境模拟题一:透过grep 搜寻特殊字串,并配合资料流重导向来处理大量的档案搜寻问题。
◦目标:正确的使用正规表示法;
◦前提:需要了解资料流重导向,以及透过子指令$(command) 来处理档名的搜寻;
我们简单的以搜寻星号(*) 来处理底下的任务:
1.利用正规表示法找出系统中含有某些特殊关键字的档案,举例来说,找出在/etc 底下含有星号(*) 的档案与内容:
解决的方法必须要搭配万用字元,但是星号本身就是正规表示法的字符,因此需要如此进行: [root@www ~]# grep '\*' /etc/*
你必须要注意的是,在单引号内的星号是正规表示法的字符,但我们要找的是星号,因此需要加上跳脱字符(\)。但是在/etc/* 的那个* 则是bash 的万用字元!代表的是档案的档名喔!不过由上述的这个结果中,我们仅能找到/etc 底下第一层子目录的资料,无法找到次目录的资料, 如果想要连同完整的/etc 次目录资料,就得要这样做: [root@ www ~]# grep '\*' $(find /etc -type f)
2.但如果档案数量太多呢?如同上述的案例,如果要找的是全系统(/) 呢?你可以这样做: [root@www ~]# grep '\*' $(find / -type f)
-bash: /bin/grep: Argument list too long
真要命!由于指令列的内容长度是有限制的,因此当搜寻的对象是整个系统时,上述的指令会发生错误。那该如何是好?此时我们可以透过管线命令以及xargs 来处理。举例来说,让grep 每次仅能处理10 个档名,此时你可以这样想:
a.先用 find 去找出档案;
b.用xargs 将这些档案每次丢10 个给grep 来作为参数处理;
c.grep 实际开始搜寻档案内容。
所以整个作法就会变成这样: [root@www ~]# find / -type f | xargs -n 10 grep '\*'
3.从输出的结果来看,资料量实在非常庞大!那如果我只是想要知道档名而已呢?你可以透过grep 的功能来找到如下的参数! [root@www ~]# find / -type f | xargs -n 10 grep -l '\*'
•情境模拟题二:使用管线命令配合正规表示法建立新指令与新变数。我想要建立一个新的指令名为myip , 这个指令能够将我系统的IP 捉出来显示。而我想要有个新变数,变数名为MYIP ,这个变数可以记录我的IP 。
处理的方式很简单,我们可以这样试看看:
1.首先,我们依据本章内的ifconfig, sed 与awk 来取得我们的IP ,指令为:
[root@www ~]# ifconfig eth0 | grep 'inet addr' | \
> sed 's/^.*inet addr://g'| cut -d ' ' -f1
2.再来,我们可以将此指令利用alias 指定为myip 喔!如下所示: [root@www ~]# alias myip="ifconfig eth0 | grep 'inet addr' | \
> sed 's/^.*inet addr://g'| cut -d ' ' -f1 "
3.最终,我们可以透过变数设定来处理MYIP 喔! [root@www ~]# MYIP=$( myip )
4.如果每次登入都要生效,可以将alias 与MYIP 的设定那两行,写入你的~/.bashrc 即可!
第13章shell script
1、课后作业题
2、传递参数给脚本的计算机题。
1、请建立一支 script ,当你执行该 script 的时候,该 script 可以显示:
1.你目前的身份(用 whoami ) 2.你目前所在的目录(用 pwd)
#!/bin/bash
echo -e "Your name is ==> `whoami`"
echo -e "The current directory is ==> `pwd`"
2、请自行建立一支程序,该程序可以用来计算『你还有几天可以过生日』啊?
#!/bin/bash
read -p "Pleas input your birthday (MMDD, ex> 0709): " bir
now=`date +%m%d`
if [ "$bir" == "$now" ]; then
echo "Happy Birthday to you!!!"
elif [ "$bir" -gt "$now" ]; then
year=`date +%Y`
total_d=$(($((`date --date="$year$bir" +%s`-`date +%s`))/60/60/24))
echo "Your birthday will be $total_d later"
else
year=$((`date +%Y`+1))
total_d=$(($((`date --date="$year$bir" +%s`-`date +%s`))/60/60/24))
echo "Your birthday will be $total_d later"
fi
3、让用户输入一个数字,程序可以由 1+2+3... 一直累加到用户输入的数字为止。
#!/bin/bash
read -p "Please input an integer number: " number
i=0
s=0
while [ "$i" != "$number" ]
do
i=$(($i+1))
s=$(($s+$i))
done
echo "the result of '1+2+3+...$number' is ==> $s"
4、撰写一支程序,他的作用是: 1.) 先查看一下 /root/test/logical 这个
名称是否存在; 2.) 若不存在,则建立一 个文件,使用 touch 来建立,建立完成后离开;
3.) 如果存在的话,判断该名称是否为文件,若为文件则 将之删除后建立一个目录,文件名
为 logical ,之后离开; 4.) 如果存在的话,而且该名称为目录,则移除 此目录!
#!/bin/bash
if [ ! -e logical ]; then
touch logical
echo "Just make a file logical"
exit 1
elif [ -e logical ] && [ -f logical ]; then rm logical
mkdir logical
echo "remove file ==> logical"
echo "and make directory logical"
exit 1
elif [ -e logical ] && [ -d logical ]; then rm -rf logical
echo "remove directory ==> logical"
exit 1
else
echo "Does here have anything?"
fi
5、我们知道 /etc/passwd 里面以 : 来分隔,第一栏为账号名称。请写一只程序,可以将
/etc/passwd 的第一栏 取出,而且每一栏都以一行字符串『The 1 account is "root"
』来显示,那个 1 表示行数。
#!/bin/bash
accounts=`cat /etc/passwd | cut -d':' -f1`
for account in $accounts
do
declare -i i=$i+1
echo "The $i account is \"$account\" "
done