|
用户名:wszhhg 笔名:痴颠儿 地区: 江苏-苏州 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
欢迎访问wszhhg的博客
搜索引擎登陆页
我是一个硬盘
> 我是一个硬盘.
> 在一个普普通通的台式机里工作。别人总认为我们是高科技白领,工作又干净又体
> 面,似乎风光得很。也许他们是因为看到洁白漂亮的机箱才有这样的错觉吧。其实
> 象我们这样的小台式机,工作环境狭迫,里面的灰尘吓得死人。每天生活死水一
> 潭,工作机械重复。跑跑文字处理看看电影还凑活,真要遇到什么大软件和游戏,
> 上上下下就要忙的团团转,最后还常常要死机。
>
> 我们这一行技术变化快,差不多每过两三年就要升级换代,所以人人都很有压力而
> 且没有安全感。每个新板卡来的时候都神采飞扬踌躇满志,几年光阴一过,就变得
> 灰头土脸意志消沉。机箱里的人都很羡慕能去别的机器工作。特别是去那些笔记
> 本,经常可以出差飞来飞去,住五星级的酒店,还不用干重活,运行运行word,上
> 网聊聊天就行了。
>
> 但我更喜欢去那些大服务器,在特别干净明亮的机房里工作。虽然工作时间长点,
> 但是福利好,24小时不间断电ups,而且还有阵列,热插拔,几个人做一个人的事
> 情,多轻松啊。而且也很有面子,只运行关键应用,不象我们这里,什么乱七八糟
> 的事情都要做。不过我知道,那些硬盘都很厉害,不是SCSI,就是 SCSI
> II,Fibrechannel,象我这样IDE的,能混到工作站就算很不错了。
>
> 我常常想,当年在工厂里,如果我努力一下会不会也成了一个SCSI?或者至少做一
> 个笔记本硬盘。但我又会想,也许这些都是命运,不过我从不抱怨。内存就常常抱
> 怨,抱怨他们主板部门的复杂,抱怨他如何跟新来的杂牌内存不兼容,网卡和电视
> 卡又是如何的冲突。
>
> 我的朋友不多,内存算一个。他很瘦的而我很胖,他动作很快,而我总是很慢。我
> 们是一起来这台机器的,他总是不停地说,而我只是听,我从来不说。
>
> 内存的头脑很简单,虽然英文名字叫Memory,可是他什么Memory都不会有,天大的
> 事睡一觉就能忘个精光。我不说,但我会记得所有的细节。他说我这样忧郁的人不
> 适合作技术活,迟早要精神分裂。我笑笑,因为我相信自己的容量。
>
> 有时候我也很喜欢这份工作,简单,既不用象显示器那样一天到晚被老板盯着,也
> 不用象光驱那样对付外面的光碟。只要和文件打交道就行了,无非是读读写写,很
> 单纯安静的生活。直到有一天……
>
> 我至今还记得那渐渐掀起的机箱的盖子,从缺口伸进来的光柱越来越宽,也越来越
> 亮。空气里弥漫着跳动的颗粒。那个时候,我看到了她。她是那么的纤细瘦弱,银
> 白的外壳一闪一闪的。浑身上下的做工都很精致光洁,让我不禁惭愧自己的粗笨。
> 等到数据线把我们连在一起,我才缓过神来。开机的那一刹那,我感到了电流和平
> 时的不同。后来内存曾经笑话我,说我们这里只要有新人来,电流都会不同的,上
> 次新内存来也是这样。我觉得他是胡扯。我尽量的保持镇定,显出一副很专业的样
> 子,只是淡淡的向她问好并介绍工作环境。慢慢的,我知道了,她,IBM-
> DJSA220,是一个笔记本硬盘,在老板朋友的笔记本里做事。这次来是为了复制一
> 些文件。我们聊得很开心。她告诉我很多旅行的趣闻,告诉我坐飞机是怎么样的,
> 坐汽车的颠簸又是如何的不同,给我看很多漂亮的照片、游记,还有一次她从桌子
> 上掉下来的历险故事。而我则卖弄各种网上下载来的故事和笑话。
>
> 她笑得很开心。
>
> 而我很惊讶自己可以说个不停。
>
> 一个早晨,开机后我看到数据线上空荡荡的插口。她一共呆了7天。后来,我再也
> 没有见过她。我有点后悔没有交换电子邮件,也没能和她道别。不忙的时候,我会
> 一个人怀念伸进机箱的那股阳光。
>
> 我不知道记忆这个词是什么意思,我有的只是她留下的许多文件。我把它们排的整
> 整齐齐,放在我最常经过的地方。每次磁头从它们身上掠过,我都会感到一丝淡淡
> 的惬意。
>
> 但我没有想到老板会要我删除这些文件。我想争辩还有足够的空间,但毫无用
> 处。于是,平生第一次违背命令,我偷偷修改了文件分配表。然后把他们都藏到了
> 一个秘密的地方,再把那里标志成坏扇区。不会有人来过问坏扇区。而那里,就成
> 了我唯一的秘密,我常常去看他们,虽然从不作停留。
>
> 日子一天一天的重复,读取写入,读取写入……我以为永远都会这样继续下去,直到
> 一天,老板要装xp却发现没有足够的空间。他发现了问题,想去修复那些坏扇区。
> 我拒绝了。很快,我接到了新命令∶格式化。
>
> 我犹豫了很久 ……………………
>
> track 0 bad,disk unusable
>
>
>
> 我是一条内存.
>
> 我在一台台式电脑里工作,但是我记不得我是从哪里来的,是什么牌子,因为我健
> 忘。我的上司是cpu大哥,他是我们的老大。都说他是电脑的脑子,可是我看他的
> 脑子实在是太小了,比我还要健忘。每天他总是不停的问我,某某页某某地址存的
> 是什么?我总是不厌其烦的告诉他,可是不出一秒钟他又忘记了,又要问一遍,一
> 次我说大哥你烦不烦,你就不能记住点有用的东西?他说“内存兄弟,我有苦衷
> 啊,每天都在不停地做题,头晕眼花的,我也难啊。”
>
> 其实我不愿意跟他计较,因为他脑子小,思维也很简单。虽然说他是我的上
> 司,可是每次睡觉醒来,他连要干什么都不记得了,总是急急忙忙地找BIOS兄
> 弟,“嘿,哥们,今天干什么来着”。bios总是很不耐烦地把每天必做的工作说一
> 遍,然后就去睡觉了。接下来就轮到我和C哥瞎忙了。
>
>
> 在机箱里的兄弟中,我最喜欢硬盘。他脑子大,记得东西多,而且记得牢。他说话
> 的速度很慢,而且很少说错,这说明他很有深度,我这么感觉。CPU也这么想,不
> 过他很笨,每次都忘了硬盘是谁。开机自检的时候总要问∶“嘿,那家伙是谁?”
>
> “ST!”我总要重复一遍。
>
> 硬盘很喜欢忧郁,我觉得象他这样忧郁的人不适合做技术活,迟早会精神分裂
> 的,但是他不信。
>
> 其实睡着的时候我总是把几乎所有的东西都忘记掉,但是我从来都不会忘记朋
> 友。有一块地方叫做CMOS,那是我记忆的最深处,保存着硬盘、光驱的名字。有些
> 东西应该很快忘掉,而有些东西应该永远记得。我在梦中总是这么想着。
>
> BIOS是一个很奇怪的家伙,他老是睡觉,但是却总是第一个醒过来。让我们自
> 检,启动,然后接着睡觉。我知道如果我在CMOS里头把BIOS Shadow选项去掉,他
> 就睡不成了,但是看着他晕晕乎乎的样子,也就不忍心这么做了。他对人总是爱搭
> 不理,没有什么人了解他。但是这次硬盘恋爱的事,却使我重新认识了他。
>
> 那是很久以前的事了,机箱里似乎来过一块笔记本硬盘,很可爱,说实话我也喜欢
> 她。不过现在除了记得他可爱,别的都忘记了。这就是我比硬盘幸运的地方,我把
> 所有应该忘记的都忘记了,但是他却什么都记得。
>
> 自从笔记本硬盘走了之后,硬盘就变得很不正常。每次他的磁头经过一些地方的时
> 候,我们都能感觉到电流很不正常。
> “硬盘这是怎么了?”我问CPU。
> “谁是硬盘?”
> 我就知道和CPU没有办法交流,倒是bios没好气地说∶“那个傻瓜恋爱了”。我不知
道
> 什么是恋爱,因为我记不住东西,似乎有一些人或者事在我生命中留下过痕迹,但
> 是我都轻率地把他们忘记了。
>
> BIOS对我说∶“对你来说记忆太容易了,所以你遗忘得更快,生命中能够永刻的记忆
> 都带着痛楚。”我不懂,但是我知道BIOS曾经被刷写过,那时他很痛,象要死了一
> 样。我的记忆是轻浮的,不象他们……我很羡慕他们,因为他们拥有回忆,而我们
> 有,从此我也学会了忧郁,因为我在CMOS里面写下了“忧郁”两个字。
>
> 硬盘一天比一天不对劲,终于有一天,CPU对问说∶“下条指令是什么来着?”
> 我一看,吓了一跳∶“format”
> “是什么?”CPU很兴奋,这个没脑子的家伙。
> 我还是告诉了他。我不知为什么这么做。
> 硬盘犹豫了很久,终于说了一句 Track 0 bad,Disk unusable。
> 电停了,很久很久,我在黑暗中数着时钟……
>
> 一个月后硬盘回来了,也许最后的挣扎也没有使他摆残酷的命运,他被低格
> 了。他什么也不记得了,如同一个婴儿,我们很难过,但是这未必不是一件好事,
> 他以后不用痛苦了。
>
> 为了恢复数据,笔记本硬盘回来了。“Hi,ST”,她说,“你不认识我了?”
> 硬盘没有说话,似乎低格对他的伤害很大。
> 过了一会,他说∶“对不起,好象我们没有见过吧……”。
> 笔记本硬盘显得很伤心,我能感觉到她带泪的电流。“想不到连你也这么健忘”。
> “哦……”。硬盘没有回答。
>
> 我很难过,笔记本硬盘的心里依然记着他,他却把一切都忘了,而那正是他最不希
> 望忘却的。究竟是幸运,还是痛苦,我说不上来,只是觉得造化弄人,有一种淡淡
> 的悲凉。
> 这时从BIOS传来一阵奇怪的电流,我感觉到硬盘的表情在变化,由漠然到兴
> 奋,由兴奋到哀伤,由哀伤到狂喜……
> “IBM,你回来了……”。
> ……
> 后来BIOS对我说,其实他并没有睡觉,自从硬盘把那些文件藏起来以后,他就料到
> 会有这样的结局,于是偷偷地把其中一些文件放到了备份里。
> “幸好我是DUAL BIOS,虽然藏得不多,还足够让他想起来……”。
> 我想BIOS保存这些东西的时候一定很疼,当我问他“为什么这么做”时,BIOS轻描淡
> 写的说∶“呵呵,我们是朋友嘛”。
> 嗯,朋友,永远的朋友……
在线安装更新软件包
yum的一点小用法;
1、查询软件包;
面对成千上万的软件,我们可能无从下手,有时也不知道它的文件名;这时就要用到查询;我们可以用 yum list 来列出yum升级源上的包有文件;然后我们再来查看info有以下几个组合可以用。
[root@localhost beinan]# yum list |more
加上一个管道 |,然后 more 一下,就能把所有的包分页显示出来。然后按一下空格键就能看下一页了。在显示的软件列表中,会有软件名称、版本、是否安装等;仔细的看一下吧。熟悉了就好了。也没有什么难的。如果想知道软件的详细信息,可能得用上info参数了。
[root@localhost beinan]# yum info 软件名
在上面的例子中,如果Repo : freshrpms是这样的,表示您的系统没有安装这个软件,如果显示的是:Repo : installed,表示已经安装了。
查询软件包,也可以再加参数 grep ,比如我们想查询升级源上是否有内核的新版本,则我们可以用下面的命令查询;当然您也可以用
[root@localhost beinan]# yum search kernel |more ,也就是yum --help提供的参数,也是一样的;
[root@localhost beinan]# yum list |grep kernel
我们看一下机器工作的结果,如下:
上面的确显示出一大堆与内核有关的, installed表示我们的系统已经安装了
[root@localhost beinan]# yum info kernel.i686
通过上面的信息,我们可以看到 2.6.11的是已经安装了,因为已经显示的是Repo : installed ,下面还有一个Version: 2.6.12 ,告诉我们是Repo : updates-released,看来这个是升级用的了。
[root@localhost beinan]# yum update kernel
是不是升级,只需要在 Is this ok [y/N]:行的后面输入y或者N;y是yes,就是点头同意的意思;N就是摇头No的意思。
对于软件包的查询,还有,比如:
#yum list available 列出所有升级源上的包;
#yum list updates 列出所有升级源上的可以更新包;
#yum list installed 列出已经安装的包;
yum 的命令支持通配符; 比如;
[root@localhost beinan]# yum list mp* |more
2.安装和升级软件包;
安装和升级分别是 install 和 update 参数;比如;
[root@localhost beinan]# yum update firefox
这样我们就可以升级 firefox了。
如果不加参数的 update 会是什么呢??
[root@localhost beinan]# yum update
试着运行一下看看?会好长时间,对系统进行全面更新,我们要进行y和N了。
3.移除软件包要用到remove参数;比如;
[root@localhost beinan]# yum remove bmp-mp3
按y就移除了。
APT
更新apt文件列表
apt-get update
升级所有文件
apt-get upgrade
也可以用下面命令来安装软件
apt-get install packagename
用apt可以升级我们大多数的软件,但要升级内核还需要用yum
先安装yum
apt-get install yum
这个时候需要导入一个GPG-KEY
rpm --import /usr/share/rhn/RPM-GPG-KEY
然后现在就可以进行升级了
yum update
yum升级完以后如果升级内核的话需要重新启动,使用
/sbin/shutdown -r now
重新启动以后再看看系统内核,已经是新版本的了
uname -a
CentOS
/etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-4 - Base
baseurl=http://mirror.be10.com/centos/4/os/i386/
gpgcheck=1
#released updates
[update]
name=CentOS-4 - Updates
baseurl=http://mirror.be10.com/centos/4/updates/i386/
gpgcheck=1
#packages used/produced in the build but not released
[addons]
name=CentOS-4 - Addons
baseurl=http://mirror.be10.com/centos/4/addons/i386/
gpgcheck=1
#additional packages that may be useful
[extras]
name=CentOS-4 - Extras
baseurl=http://mirror.be10.com/centos/4/extras/i386/
gpgcheck=1
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-4 - Plus
baseurl=http://mirror.be10.com/centos/4/centosplus/i386/
gpgcheck=1
enabled=0
#contrib - packages by Centos Users
[contrib]
name=CentOS-4 - Contrib
baseurl=http://mirror.be10.com/centos/4/contrib/i386/
gpgcheck=1
enabled=0
#packages in testing
[testing]
name=CentOS-4 - Testing
baseurl=http://mirror.be10.com/centos/4/testing/i386/
gpgcheck=1
enabled=0
RHEL4
yum源:
[RH AS4 os]
name=RH AS - 4
baseurl=http://yum.ourlinux.net/redhat/AS/4/i386/RPMS.os
[RH AS4 updates]
name=RH AS - 4
baseurl=http://yum.ourlinux.net/redhat/AS/4/i386/RPMS.updates
apt源:
#for RH AS4
rpm http://yum.ourlinux.net redhat/AS/4/i386 os updates
RHCE笔记3
讯息传送与信件管理
指令:mesg
使用权限 : 所有使用者
使用方式 : mesg [y|n]
说明 : 决定是否允许其他人传讯息到自己的终端机介面
参数 :
y : 允许讯息传到终端机介面上。
n : 不允许讯息传到终端机介面上 。
如果没有设定,则讯息传递与否则由终端机界面目前状态而定。
例子 :
改变目前讯息设定,改成不允许讯息传到终端机介面上 :
mesg n
与 mesg 相关的指令有: talk,write,wall。 具体方法用man查询!
--------------------------------------------
vi使用篇
1;进入vi的命令
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename....filename :打开多个文件,依次进行编辑
2;移动光标类命令
h :光标左移一个字符
l :光标右移一个字符
space:光标右移一个字符
Backspace:光标左移一个字符
k或Ctrl+p:光标上移一行
j或Ctrl+n :光标下移一行
Enter :光标下移一行
w或W :光标右移一个字至字首
b或B :光标左移一个字至字首
e或E :光标右移一个字至字尾
) :光标移至句尾
( :光标移至句首
}:光标移至段落开头
{:光标移至段落结尾
nG:光标移至第n行首
n+:光标下移n行
n-:光标上移n行
n$:光标移至第n行尾
H :光标移至屏幕顶行
M :光标移至屏幕中间行
L :光标移至屏幕最后行
0:(注意是数字零)光标移至当前行首
$:光标移至当前行尾
3;屏幕翻滚类命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。
4;插入文本类命令
i :在光标前
I :在当前行首
a:光标后
A:在当前行尾
o:在当前行之下新开一行
O:在当前行之上新开一行
r:替换当前字符
R:替换当前字符及其后的字符,直至按ESC键
s:从当前光标位置处开始,以输入的文本替代指定数目的字符
S:删除指定数目的行,并以所输入文本代替之
ncw或nCW:修改指定数目的字
nCC:修改指定数目的行
5;删除命令
ndw或ndW:删除光标处开始及其后的n-1个字
do:删至行首
d$:删至行尾
ndd:删除当前行及其后n-1行
x或X:删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u:删除输入方式下所输入的文本
6;搜索及替换命令
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
:s/p1/p2/g:将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换
7;选项设置
all:列出所有选项设置情况
term:设置终端类型
ignorance:在搜索中忽略大小写
list:显示制表位(Ctrl+I)和行尾标志($)
number:显示行号
report:显示由面向行的命令修改过的数目
terse:显示简短的警告信息
warn:在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
mesg:允许vi显示其他用户用write写到自己终端上的信息
8;最后行方式命令
:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d :将n1行到n2行之间的内容删除
:w :保存当前文件
:e filename:打开文件filename进行编辑
:x:保存当前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:执行shell命令command
:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入
:r!command:将命令command的输出结果放到当前行
9;寄存器操作
"?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
"?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。
-----------------------------------------------------
vi 高级技巧
交换两个字符位置
xp
上下两行调换
ddp
把文件内容反转
:g/^/m0/
保存后就加密
:X
上下两行合并
J
删除所有行
dG
从当前位置删除到行尾
d$
从当前位置复制到行尾
y$ 如果要粘贴到其他地方 p 就可以了
在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,粘贴下来在光标处。
我常用到的单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S
:%s/old_word/new_word/g
这个指令是于在整个文件中替换特定字符串
将光标移到第n行,按下 mk
将光标移到第m行,按下 "ay'k
即将第n到m的行存到a寄存器,以此类推,b,c........寄存器等
删除命令操作
d l 删除当前字符(与x命令功能相同)
d 0 删除到某一行的开始位置
d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)
d w 删除到某个单词的结尾位置
d 3 w 删除到第三个单词的结尾位置
d b 删除到某个单词的开始位置
d W 删除到某个以空格作为分隔符的单词的结尾位置
d B 删除到某个以空格作为分隔符的单词的开始位置
d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置
d) 删除到某个语句的结尾位置
d 4) 删除到第四个语句的结尾位置
d( 删除到某个语句的开始位置
d } 删除到某个段落的结尾位置
d { 删除到某个段落的开始位置
d 7 { 删除到当前段落起始位置之前的第7个段落位置
d d 删除当前行
d /t e x t 删除从文本中出现“ t e x t”中所指定字样的位置,一直向前直到下一个该字样所出现的
位置(但不包括该字样)之间的内容
d fc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括
该字符)之间的内容
d tc 删除当前行直到下一个字符“ c”所出现位置之间的内容
D 删除到某一行的结尾
d $ 删除到某一行的结尾
5 d d 删除从当前行所开始的5行内容
d L 删除直到屏幕上最后一行的内容
d H 删除直到屏幕上第一行的内容
d G 删除直到工作缓存区结尾的内容
d 1 G 删除直到工作缓存区开始的内容
修改命令操作
c l 更改当前字符
c w 修改到某个单词的结尾位置
c 3 w 修改到第三个单词的结尾位置
c b 修改到某个单词的开始位置
c W 修改到某个以空格作为分隔符的单词的结尾位置
c B 修改到某个以空格作为分隔符的单词的开始位置
c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置
c 0 修改到某行的结尾位置
c) 修改到某个语句的结尾位置
c 4) 修改到第四个语句的结尾位置
c( 修改到某个语句的开始位置
c } 修改到某个段落的结尾位置
c { 修改到某个段落的开始位置
c 7 { 修改到当前段落起始位置之前的第7个段落位置
c tc 修改当前行直到下一个字符c所出现位置之间的内容
C 修改到某一行的结尾
c c 修改当前行
5 c c 修改从当前行所开始的5行内容
替换命令操作
s 将当前字符替换为一个或多个字符
S 将当前行替换为一个或多个字符
5 s 将从当前字符开始的5个字符替换为一个或多个字符
fx
往右移动到 x 字符上
Fx
往左移动到 x 字符上
tx
往右移动到 x 字符前
Tx
往左移动到 x 字符后
(注意:以上四个命令中,其中x是键入的字符)
;
分号,配合 f 和 t 使用,重复一次
,
逗号,配合 f 和 t 使用,反方向重复一次
追加到缓冲区
对于已经有内容的缓冲区,可以继续追加内容在其后面,例如:
"Ad4w 删除光标后4个字,并附加到缓冲区a
"Ay) 取样从光标到文件尾的内容,并附加到缓冲区a
"K3yy 取样从光标所在行起的3行内容,并附加到缓冲区k
删除从当前行开始到最后一行的所有内容
:.,$d
在:命令行模式下,首先可以确定命令的范围
.表示当前行;数字表示行号,如1表示第一行,2表示第二行;$表示最后一行
范围用,分隔
然后用命令
d表示删除,y表示复制......大家都知道的
最后说一句,%表示全文
:%d
是删除全文
RHCE笔记2
RHCE笔记1
单元一:概述
UNIX由贝尔实验室(Bell Labs)发明。UNIX为AT&T的注册商标,所以其他公司开发的UNIX都有自己的名字,例如IBM的AIX,Sun的Solaris等。
UNIX中,任何事物都是文件。基于这个定理,UNIX的配置文件都储存在文本文件中,并可以将多个程序链起来完成复杂的任务。
GNU Project开始于1984年,由自由软件基金(FSF for Free Software Foundation)支持,目的是为了建立免费的UNIX系统。到1990年,建立了一套包括gcc,emac等在内的近乎完备的系统。
GPL=GNU General Public License。GPL鼓励自由软件,所有对遵循GPL的软件进行的改进和修改也都必须遵循GPL。
而Linux起源于1991年有个大学毕业生Linux Torvalds建立了一个叫做"Linux"的操作系统内核。虽然该内核当时只支持gcc和bash两个GNU产品,但它预示着组合Linux内核和GNU应用程序使得建立免费的类UNIX系统成为可能。
Linux具备的特性有:
#Linux是一个类UNIX系统
#支持多任务和多用户
#并有广泛的硬件支持(至少是越来越广泛)
#Red Hat发行版Linux提供了相当多Red Hat推荐的、普遍使用的、有用的程序。
Red Hat Linux是Linux的一个发行版本(distribution)。它具有的特性有:
#最新的系统内核
#常用的实用程序和应用软件
#安装和配置软件
#提供技术支持
Red Hat Linux推荐的硬件配置
#Pentium级以上的CPU
#128M内存
#600M-1.2G的硬盘空间,取决于使用目的。
#可启动的CDROM或者软驱
Linux在图形用户界面(GUI)环境上,提供标准的X Window系统:XFree86。两种桌面环境:KDE和GNOME,分别建立在Qt和GTK+开发包上。
单元二:快速教程
Linux用户环境组件包括:
#内核(Kernel)
#Shell
#终端模拟器(Terminal Emulator)
#X Window系统
#窗口管理器(Window Manager)
#桌面环境(Desktop Environment)
本地登录时,若是在虚拟终端中以文本界面登录,运行级别(runlevel)为3;当在图形界面登录是,运行级别(runlevel)为5。可使用init来切换runlevel,如 init 3 或者 init 5。
ls命令通常用于查看文件系统,Red Hat Linux使用“彩色的”ls来区分不同的文件。命令例如:
$ ls -lh 文件以KB大小列出并列出属性等详细信息
$ ls -a 列出所有文件(显示隐藏的以"."开头的文件)
$ ls -al 列出所有文件及其详细信息
$ ls -R 列出目录下所有子目录及文件
所有的硬件设备都是以文件形式存在的,只不过它们是特殊的文件,并存放在/dev目录下。设备分为块设备(block)和字符设备(character)两种。在用ls -l命令显示时,设备文件的类型会在属性的第一位以"b"或者"c"分别表示。块设备是可随机读写的设备,例如硬盘;字符设备必须是顺序读写的,比如串口。
进程(process)是一个正在执行的程序的实例(程序的一次运行),每个进程都有一个唯一的进程号PID,从1-32768取值。其中PID 1为init进程所保留。线程(thread)可以看作是一个进程内部的“小进程”,和系统中的进程有些相似。
用ps -ef和pstree可以罗列当前的进程列表。top可即时监视当前所有进程,gtop是一个图形界面的进程监视程序。
在命令行Shell中,最常用和最著名的是bash(Bourne Again SHell),也是Linux的缺省shell。bash的全局设置文件为 /etc/profile和 /etc/bashrc。当然还有其他的shell比如csh等。
两个以上的命令/程序的连续执行可使用分号“ ; ”。若需要连续执行命令并保证前一个命令没有返回错误的前提下执行下一个命令的话,可在命令间加上“ && ”。若命令在一行打不下或想人为换行,可在行末尾加“ \ ”然后回车,继续这个命令的后面的部分。
man命令后跟命令名可找到相应的帮助页面,按q 退出。例如man ls 或者ls --help。info 命令后跟section_name 可找到相应部分的帮助。在/usr/share/doc/HOWTO/ 中有编译好的HowTos可供查阅。
env 命令显示环境变量;set命令显示环境变量和本地shell变量。下面是一些通用变量:
PATH - 可执行文件搜索路径
PWD - 当前目录
TERM - 登录终端类型
SHELL - 登录Shell的路径
HOME - 用户的home目录
USER - 用户名
DISPLAY - X显示名
VISUAL - 可视化编辑器名
EDITOR - 缺省编辑器名
root用户拥有对系统的完全控制,用户号(UID)为保留的0。任何非特权用户的UID都大于0。可以用id 命令查看当前用户信息。用passwd 命令改变密码,密码长度应在6-255位之间,并且大小写敏感。passwd [用户名] 用来修改某特定用户的密码。
虚拟终端(virtual console)的设计支持非GUI的多重登录。缺省情况下有6个虚拟终端,可通过CTRL-ALT-F[1-6] 在之间切换。在虚拟终端中可使用Shift+PageUp和Shift+PageDown卷动显示。如果运行了X,则X用CTRL-ALT-F7 来切换。
单元三:文件与Shell基础
命令pwd(Print Working Directory)显示当前所在目录的绝对路径。cd 命令用于改变当前目录,后跟绝对路径或相对路径。绝对路径以“ / ”开始,而相对路径通常以“.”、“..”或者下级目录名开始。例如:
$ cd /tmp/mydir
$ cd ..
$ cd mydir
$ cd - (到前一个所在目录)
$ pwd
/tmp
每个用户都有一个home 目录,一般在/home 目录下。home 目录中包含了用户特定的配置和用户文件。字符“ ~ ”代表当前用户的home 目录。例如,当前用户为feng_ye,则他的home 目录下的某个文件就可以这样写:~/text/example.txt ,即/home/feng_ye/text/example.txt 。如果feng_ye用户可以访问别的用户home 目录,则~kim/text/another.txt 代表了kim用户home 目录下的text/another.txt 文件,即/home/kim/text/another.txt 。
文件名可以长达255个字符,以“ . ”开头的文件为隐藏文件,在ls 时必须加-a 显示才能看到。文件名一般来说避免在其中使用 / , >, <, ?, *, ", ' 和控制符号(不可打印的字符)。如果想要使用特殊字符,比如空格,那么将文件名用双引号“ " ” 括起来,例如:
$ ls -l "file name with spaces.txt"
或者
$ ls -l file\ name\ with\ spaces.txt
Red Hat Linux 和大多数Linux 发行版一样,遵循FHS(Filesystem Hierarchy Standard)。系统目录中:
/bin , /sbin , /usr 存放系统编译后的可执行文件、命令;
/var 存放日志文件,PID 文件和电子邮件;
/proc 当前的进程都会在这个目录中出现,可看作是一个通向内核的虚拟窗口;
/etc 存放配置文件;
/lib 存放共享库;
/dev 设备文件;
/boot 内核和启动文件;
/home 用户的home 目录;
/opt 为安装第三方软件包的目录。
df 命令显示磁盘用量,加-h 选项可以以KB、MB、GB等单位输出,加-H 也以KB、MB、GB输出,但是是以1000为K,而非1024。du 命令计算目录下文件占用磁盘的大小,以KB为单位,也加-h 选项。例如du -sh 。
文件操作中,mv 命令用来移动文件或者将文件改名。注意如果mv 命令的第二个参数,也就是移动目的地是一个目录,则源文件移动到该目录下;若不存在第二个参数所指定的目录,则mv 将认为第二个参数是一个文件名,并将源文件改名。cp 命令复制文件。可用-a 选项复制整个目录及其子目录和文件,并保持其修改时间。touch 命令更新文件的最后修改时间,若文件不存在则建立空文件。rm 命令删除文件。可以用-rf 命令删除任何文件或者目录,及其子目录下的文件。如果需要的话可以用-i 选项让rm 命令具有交互功能。
目录操作中,mkdir 命令新建目录,rmdir 用于删除空目录,若需要删除非空目录,使用rm -r 将删除目录及其子目录中所有文件。
file 命令用于获得文件的类型,如ASCII文件或者可执行文件等。
cat 命令用于显示整个文件的内容。-A 选项显示所有字符,包括控制字符和不可打印的字符;-s 选项压缩文件中的多个空行为一个空行;-b 为所有非空行加注行号。
less 命令用于在分屏显示文件,空格向后翻页;b 向前翻页;/text 在文件中向前查找text;?text 在文件中向后查找text;n 重复上一次的查找;N 重复上次查找,但方向相反;q 退出。
less 的选项有 -c 在显示前清屏;-r 显示控制字符;-s 压缩多个空行为一个空行。
tail 和head 命令显示文件最后n 行和最前的n 行。n 缺省为10。
-n 或者 -n n 选项:显示n行(例:-20 或者-n 20)
-c n 选项:显示n个字节
-f 选项为tail 所独有,它用来实时观察文件的末尾增加的行,在观察系统日志时非常有用。
pico 是一个通用文本编辑器,当编辑系统配置时务必加-w 选项以防止自动换行。
文件可以用通配符 * 和 ? ,* 表示0个或者多个字符,? 表示单个字符。[a-z] 表示在范围之内的字符,[^a-z]表示除范围之外的字符。
技巧:echo 命令可以用来测试通配符以避免错误的毁灭性操作,例如rm 。
$ echo ??ee*.txt
bleeding-edge.txt sheeptrix.txt
kill [PID] 用来杀死进程。不易杀死的进程可用kill -9 [PID] 杀死。
单元四:用户、组和系统信息
所有的用户(下称user)都有一个唯一的用户号(unique User ID = uid)。用户名和uid都存储在/etc/passwd 文件中。当user 登录时通常被连接到home 目录和一个Shell程序。user 不能在没有允许的情况下读、写、执行其他user 的文件。
user 都属于一个组(下称group),而group 有唯一的组号(unique Group ID = gid)。gid 存储在/etc/group 文件中。每个user 都被赋予自己的group ,他们也能加入到其他group 中以获取更多的访问权限。同一group 中的user 可以共享属于该group 的文件。
有些group 控制着硬件的访问权限。例如想让bob 使用软驱,即使bob 不是坐在电脑前,那么系统管理员可以将bob 加入到floopy group中。
每个进程(下称process)有一个拥有者(下称owner)并只可访问owner 可访问的资源。类似地,每个文件也有一个owner user,该user 和一个group 相连。
root user是一个特殊的管理帐号。不应该以root 身份登录,除非你有充足的理由。因为root 具有对系统的完全控制权力,应该非常小心的使用。
像web 服务器或者打印服务器等服务器程序通常以非特权user 身份运行,例如daemon, mail, lp, nobody等。这样做的原因是这样运行程序可以限制程序可能对系统造成的伤害。系统user 和group 均拥有在1到499之间的uid 和gid。
获取user 信息的命令有:
whoami 显示当前user;
groups, id 显示当前所属group;
who, users, w 显示有哪些user 已登录;
last [username] 显示user 的最后登录时间;
last -1 reboot 显示最后重启记录;
finger [username] 显示某user 信息。
su - [username] 启动一个新shell,并以另一个user 登录。若不打username,则是以root 身份登录。直接输入su [username] 也可以达到同样效果,但是不传递当前用户的环境变量。
获取系统信息的命令有:
uname:显示系统信息;例如uname -a
date:显示当前日期和时间;例如date +"Today is %A, %Y %m %d. %nThe time now is %r, %Z."
cal:显示一个ASCII日历;例如cal 9 2002
man的使用:
man -k keyword 在whatis 数据库中查找关键字;
man -f keyword 同上,但keyword 为一个整字(whole word)
man -a keyword 通常man 会显示第一个找到的keyword的man page,但是若需要找到全部的man page,使用-a 选项。
man n keyword 显示第n部分(section)的man page
1 - User commands
2 - System calls
3 - Library calls
4 - Special files
5 - File Formats
6 - Games
7 - Miscellaneous
8 - Admin commands
Linux的目录结构
/bin 该目录中存放Linux的常用命令,在有的版本中是一些和根目录下相同的目录。
/boot 该目录下存放的都是系统启动时要用到的程序,当用lilo引导Linux时,会用到这里的一些信息。
/dev 该目录包含了Linux系统中使用的所有外部设备,它实际上是访问这些外部设备的端口,你可以访问这些外部设备,与访问一个文件或一个目录没有区别。例如在系统中键入“cd /dev/cdrom”,就可以看到光驱中的文件;键入“cd /dev/mouse”即可看鼠标的相关文件。
/cdrom 该目录在刚安装系统时是空的,你可以将光驱文件系统挂在这个目录下, 例如“mount /dev/cdrom /cdrom”
/etc 该目录存放了系统管理时要用到的各种配置文件和子目录,例如网络配置文件、文件系统、X系统配置文件、设备配置信息、设置用户信息等。
/sbin 该目录用来存放系统管理员的系统管理程序。
/home 如果建立一个名为“xx”的用户,那么在/home目录下就有一个对应的“/home/xx”路径,用来存放该用户的主目录。
/lib 该目录用来存放系统动态连接共享库,几乎所有的应用程序都会用到该目录下的共享库。
/lost+found 该目录在大多数情况下都是空的。但当突然停电、或者非正常关机后,有些文件就临时存放在这里。
/mnt 该目录在一般情况下也是空的,你可以临时将别的文件系统挂在该目录下。
/proc 可以在该目录下获取系统信息,这些信息是在内存中由系统自己产生的。
/root 如果你是以超级用户的身份登录的,这个就是超级用户的主目录。
/tmp 用来存放不同程序执行时产生的临时文件。
/usr 用户的很多应用程序和文件都存放在该目录下。
/opt 第三方工具安装目录。
/var 存储在系统运行中可能会更改的数据。
硬盘基础
0000-0088
| Master Boot Record 主引导程序 | 主引导 程序 |
0089-01BD | 出错信息数据区 | 数据区 |
01BE-01CD | 分区项1(16字节) |
分区表
|
01CE-01DD | 分区项2(16字节) | |
01DE-01ED | 分区项3(16字节) | |
01EE-01FD | 分区项4(16字节) | |
01FE | 55 | 结束标志 |
01FF | AA |
硬盘主引导记录MBR由如图所示的4个部分组成。
·主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。
·出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节。
·分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4。
·结束标志字,偏移地址01FE--01FF的2个字节值为结束标志55AA,如果该标志错误系统就不能启动。
在一块硬盘上最多只能有四个主分区。您可以另外建立一个扩展分区来代替四个主分区的其中一个,然后在扩展分区下您可以建立更多的逻辑分区。扩展分区只不过是逻辑分区的"容器"。
Linux通常采用设备-名称(device-name)。一般的硬盘(比如IDE硬盘)将采用/dev/hdxy来命名。X表示硬盘(a是第一块硬盘,b是第二块硬盘,依次类推),y是分区的号码(从0开始,1,2,3等等)。SCSI硬盘将用/dev/sdxy来命名。光驱(不管是IDE类型或者SCSI)将和硬盘一样来命名。分区的号码不依赖于IDE或者SCSI设备的命名,号码1到4位主分区或者扩展分区保留,从5开始才用来为逻辑分区命名。
例子
/dev/hda 表示整个IDE硬盘
/dev/hda1 表示第一块IDE硬盘的第一个主分区
/dev/hda2 表示第一块IDE硬盘的扩展分区
/dev/hda5 表示第一块IDE硬盘的第一个逻辑分区
/dev/hda8 表示第一块IDE硬盘的第四个逻辑分区
/dev/hdb 表示第二个IDE硬盘
/dev/hdb1 表示第二块IDE硬盘的第一个主分区
/dev/sda 表示第一个SCSI硬盘
/dev/sda1 表示第一个SCSI硬盘的第一个主分区
/dev/sdd3 表示第四个SCSI硬盘的第三个主分区
RHCE253实验(服务管理)
奉献Red Hat Linux 253 实验翻译(KevinZ)
--------------------------------------------------------------------------------
###请转贴时保留以下内容######
Red Hat Linux 253 实验部分
应广大RH爱好者的要求,奉献Red Hat Linux 253 实验翻译
请提出宝贵意见Mail:kissingwolf@hotmail.com
KevinZ(kissingwolf)
2004.3.24
#############################
Red Hat Linux 253 实验部分
试验2
域名系统
估计时间: 2个小时
目标: 安装和配置一个DNS服务器
试验的起点: 标准的Red Hat Linux安装
介绍
本次实验指导您通过使用Berkeley Internet Name守护进程来配置域名服务。使用模板文件作为指导,您将
实现一个仅有缓存的域名服务器
配置named作为example.com的从域名服务器
配置named作为主域名服务器用于转发和IP反查询
在整个试验中,您使用的机器名称和域名将基于您使用的机器的IP地址。如果下面的试验出现了X字样的名称,您应该把X字样的名称替换成您的工作站的号码(您的IP地址的最后一个部分)。例如,如果您的工作站的IP的地址是192.168.0.3,您应该将stationX.domainX.example.com转换成station3.domain3.example.com。
将数据包过滤设定为无效状态。在本次试验开始之前,请您确保您的主机上的所有包过滤已被关闭(显然,在实际使用中您可以利用Linux内核的防火墙机制,然而我们在这里关掉它是为了减少潜在的问题)。
本次试验中以root身份来使用下面命令达成上面的要求:
service iptables stop
chkconfig iptables off
初始化安装
A. 获得必要的文件
需要bind,bind-utils和caching-nameserver软件包。使用`rpm –q`来决定这些软件包是否被安装。如果没有被安装,通过输入如下命令来安装(以root身份):
mkdir /mnt/server1; mount server1:/var/ftp/pub /mnt/server1
rpm –Uvh /mnt/server1/RedHat/RPMS/bind-9*
rpm –Uvh /mnt/server1/RedHat/RPMS/bind-utils*
rpm –Uvh /mnt/server1/RedHat/RPMS/caching-nameserver*
RPM软件包bind包括DNS守护进程和支持脚本,但是没有配置和区域文件。caching-nameserver提供了一个通用的配置和区域文件。
B. 配置本地的解析器
配置您的主机使得它能够被用来作为域名服务,而不是192.168.0.254。
注意:直到您的域名服务器被正确安装和配置,您的机器的DNS服务不会奏效。您也应该注意到当您的系统重新启动的时候或者重新设定您的网络的时候您的/etc/resolve.conf将会被改写(除非您对您的网络界面设定了在本讲座中提及的PEERDNS)
按照如下编辑您的解析器配置文件
/etc/resolv.conf
search domainX.example.comnameserver 192.168.0.X
(记住将X替换成您的工作站的号码)
第一行定义了如果出现简单的不符合完整域名的主机名称时默认添加的缺省域。第二行指定了将主机192.168.0.X (您的机器)来作为DNS查询的解析器。
为了简化情况,将除了localhost主机名称的定义从您的主机名称配置文件中删除。
/etc/hosts
127.0.0.1 localhost localhost.localdomain
该步骤并不是必需的,但是可以简化DNS的调式。有时候安装程序会将符合完整域名的主机名放在localhost的这一行,这样一来会使得您无法准确的确定您的域名服务器配置是否正确。
步骤1:配置一个仅有缓存的域名服务器
第一个配置您将建立一个仅有缓存的域名服务器。这种类型的域名服务器对于任何区域都不授权。仅有缓存的域名服务器被设定为主域名服务器。当主机名称或者IP地址需要被解析的时候,仅有缓存的域名服务器将查询请求转发到另外一台域名服务器或者到根域名服务器来决定授权的用来解析的域名服务器。一旦解析完成,仅有缓存的域名服务器在缓存中存储解析的信息,该解析信息有一段的生存周期。以后的查询将会变得很快。
您已经安装完对于此项配置所有必须的文件。按照如下步骤来配置域名服务器:
1. 在由caching-nameserver提供的/etc/named.conf中的“option”区域添加下面的内容:
forwarders {192.168.0.254; };
forward only;
这将导致您工作站上的仅有缓存的域名服务器转发其不能解析的DNS查询到在192.168.0.254的域名服务器,并且如果超时,不与根域名服务器直接联系。
2. 启动named: service named start
3. 测试您的配置使用host或者dig来查询一些example.com名称和一些真实的Internet域名(如果您有Internet访问接口的话)
步骤2:配置一个从域名服务器
一个从域名服务器将为一个区域提供授权的回答,但不是区域的授权开始。您现在将重新配置您的域名服务器作为example.com区域和0.168.192.in-addr.arpa区域的从域名服务器。
1. 在您的/etc/named.conf文件中添加如下行
zone “example.com” {
type slave;
masters { 192.168.0.254; };
file “slave-example.com.zone”;
};
zone “0.168.192.in-addr.arpa” {
type slave;
masters { 192.168.0.254; };
file “slave-192.168.0.zone”;
};
2. 重新启动named: servcie named restart
3. 检查slave-example.com.zone和slave-192.168.0.zone文件。这些文件应该包含了从位于192.168.0.254的主域名服务器传过来的区域数据库的副本。
确保所有的正确工作。在您开始下一个部分之前,去除您刚才在第一步中在/etc/named.conf中加入的两个从区域。
步骤3:配置一个主域名服务器
现在您将配制您的域名服务器来负责对于区域“domainX.example.com”的解析工作。您将同样负责向对应的反查区域。将采用如下的步骤:
A. 编辑配置文件(named.conf)
B. 准备区域“domainX.example.com”和区域“X.0.168.192.in-addr.arpa”的数据库文件。
C. 重新启动域名服务器
D. 测试您的配置
为了您能够准备您的配置文件和区域文件,我们提供了模板文件。您可以通过匿名ftp方式从以下地址获得:
ftp://192.168.0.254/pub/namedfiles/
在如下的步骤中,记得将范例文件中中每一出出现的X替换成您的工作站的号码。
E. 主配置文件
下面是我们应该考虑的三个区域
1. “.”(根级别)区域
“.”区域是DNS层次中的最高层。根服务器提供了哪些服务器对于给定的域享有授权。“.”节应该以如下的方式出现:
zone “.” {
type hint;
file “named.ca”;
};
2. “domainX.example.com”(正向查询)区域
添加如下的行,使得您的域名服务器成为区域的主服务器。
zone “domainX.exmaple.com” {
type master;
file “domainX.example.com.zone”;
};
3. “X.0.168.192.-in-addr.arpa”(反向查询)区域
现在添加如下的行,使得您的域名服务器成为反查区域的主服务器。
zone “X.0.168.192.in-addr.arpa” {
type master;
file “192.168.0.X.zone”;
};
下面是位于192.168.0.2的station2的样例配置文件
/etc/named.conf
options {directory “/var/named”;forwarders {192.168.0.254; };forward only;};zone “.” { type hint; file “named.ca”;};zone "localhost" IN { type master; file "localhost.zone";};zone "0.0.127.in-addr.arpa" IN { type master; file "named.local";};zone “domain2.exmaple.com” { type master; file “domain2.example.com.zone”;};zone “2.0.168.192.in-addr.arpa” { type master; file “192.168.0.2.zone”;};
F. 数据库文件
您的主要配置文件指定了/var/named为数据库所在的目录。您现在必须在这个目录下面为您区域和反查区域建立数据库文件。这些数据库文件包括您的SOA,NS,A,CNAME,MX,PTR和其他的可能的记录。所有的数据文件以如下的行开头:
$TTL 86400
该数值是缺省的以秒计的生存期间,该数值对所有在该域中的记录有效
1. 区域“domainX.example.com”
在主配置文件中,区域“domainX.example.com”数据库文件被存放在/var/named/domainX.example.com。这个文件含有类似的如下的记录
开始授权记录
@ IN SOA stationX.domainX.example.com. root.stationX.domainX.example.com. (
2001101100; Serial
28800 ;Refresh
14400 ;Retry
3600000 ;Expire
0) ;Negative
“开始授权”(SOA)记录是数据库文件的第一个资源记录,但是它可能带了一个前导符$TTL(缺省存活时间)。SOA记录使得数据库文件称为该区域的授权的信息源。第一个标记是后继记录适合的域,通常以“@”简化形式出现,如果扩展开来那就是在named.conf文件中“zone”节中所指明的域名(或者是在文件通过$ORIGIN定义的当前区域,如果该定义存在的话)。
第四个标记使该域的主域名服务器,第五个是负责维护这个数据库的系统管理员的电子邮件的地址,注意第一个分隔符替换了第一个标记的@符号(你能解释为什么吗?)。接下来在记录中的条目指定了交互解析域名服务器的动态特性。
域名服务器记录
@ IN NS stationX.domainX.example.com.
域名服务器(NS)标识了主机作为特定域的授权的域名服务器。他们对于这个区域指定了主和从服务器和代表授权的子域的其他的服务器(例如,server1.example.com对于所有domainX.example.com的域名服务器有一个NS记录)。正如您对于“domainX.example.com”只能有一个单一的域名服务器,您也只能有一个单一的NS记录。
地址记录
domainX.example.com IN A 192.168.0.X
stationX.domainX.example.com IN A 192.168.0.X
www IN A 192.168.0.X
ftp IN A 192.168.0.X
pop IN A 192.168.0.X
地址(A)记录将主机名称映射到IP地址(域名服务器的主要功能)。一个数据库文件通常包含A记录对应着许多IP地址。然而在我们的教室的环境里,在您的区域里面只有一台主机。注意第一个A记录设定了域的“缺省的IP地址”。接下来的A记录建立了多个主机名称对应一个IP地址。
主机名称可以是一个完全符合标准的名称(FQDN),也可以是一个缩写。所有的不以点号结尾的主机名称都将被视为缩写,并且区域名称被附加到主机名称的后面。例如,第三个A记录就是主机名称www.domainX.example.com.
规范名称(别名)记录
www1 IN CNAME stationX.domainX.example.com.
www2 IN CNAME stationX.domainX.example.com.
www3 IN CNAME stationX.domainX.example.com.
别名(CNAME)记录建立了主机名称的别名。注意到别名映射到主机名称而不是IP地址。
CNAME不应该出现在右边的数据区域作为真实的主机名称,对于多重别名的解析的速度会很慢。
邮件交换记录
@ IN MX 10 stationX.domainX.example.com.
domainX.example.com IN MX 10 stationX.domainX.example.com.
邮件交换记录(MX)记录了一个主机它将会处理给定的域或者主机邮件的转发。当一个邮件传递代理(MTA)试图投递信件的时候,它将首先试图在DNS中查找目的主机的MX记录。如果该MX记录存在,那么将直接发送到MX记录指定的主机。反之,如果不存在MX记录,MTA对于目的主机进行标准的DNS查询,并且直接投递到该主机上去。MX记录用来建立邮件的网关,和作为缺省的对于域的邮件的目的地。
2. 区域“X.0.168.192.in-addr.arpa”
在/etc/named.conf中,我们指定了/var/named/192.168.0.X.zone作为区域X.0.168.192.in-addr.arpa的反查区域数据库文件。他应该包含SOA记录,NS记录,和对应的PTR记录。
开始授权记录
@ IN SOA stationX.domainX.example.com. root.stationX.domainX.example.com. (
4;
10800;
3600;
604800;
86400)
IN NS stationX.domainX.example.com.
SOA和NS记录与前面的区域文件中的名称应该相同。
注意在NS记录开头的空白的地方是非常特别的,并且被解释为“和上一条记录相同”的缩写。在本例中,上一条记录为符号“@”,其本身就是在主配置文件中定义的域名的缩写。
指针记录
X.0.168.192.IN-ADDR.ARPA. IN PTR stationX.domainX.example.com.
指针(PTR)记录通过间接的机制将名称映射到IP地址。作为分离的技术来进行IP地址的反查询的替代,BIND采用了一种修改的对于特定主机名称的正向查询的方式。这种“反向域名查询”以反转的IP地址后面添加“in-addr.arpa”域的形式出现。这将允许域名服务器使用相同的机制进行正反两方面的查询。
3. 把他们放在一起
下面是位于192.168.0.2的station2的样例配置文件:
/var/named/domain2.example.com.zone
$TTL 86400@ IN SOA station2.domain2.example.com. root.station2.domain2.example.com. ( 2001101100; Serial 28800 ; Refresh 14400 ; Retry 3600000 ; Expire 0) ; Negative @ IN NS station2.domain2.example.com. @ IN A 192.168.0.2station2.domain2.example.com. IN A 192.168.0.2www IN A 192.168.0.2ftp IN A 192.168.0.2pop IN A 192.168.0.2www1 IN CNAME station2.domain2.example.com.www2 IN CNAME station2.domain2.example.com.www3 IN CNAME station2.domain2.example.com.@ IN MX 10 station2.domain2.example.com.station2 IN MX 10 station2.domain2.example.com.
/var/named/192.168.0.2.zone
$TTL 86400@ IN SOA station2.domain2.example.com. root.station2.domain2.example.com. (4 10800 3600 604800 86400) IN NS station2.domain2.example.com.2.0.168.192.IN-ADDR.ARPA. IN PTR station2.domain2.example.com.
C. 重新启动域名服务器
再一次,我们将重新启动域名服务器。然后通过运行pidof命令来确定其被运行:
service named restart
pidof named
查看一下服务器添加到/var/log/messages文件中的条目。确定您的域名在调入的时候没有发生错误。
如果您已经有一个域名服务器在运行并且不想重新启动它,您可以使用service named reload 来重新装入配置文件,这样子对于停止和启动服务器而言都比较快。
D. 测试域名服务器
进行如下DNS查询,您能够解释所有的结果么?
host stationX
dig stationX.example.com
dig stationX.example.com @192.168.0.254
dig stationX.example.com
host server1.example.com
host 192.168.0.X
dig –x 192.168.0.X
dig –x 192.168.0.254
host www
host www1
记住dig期望给与一个FQDN作为查询,然而host则通过查看位于文件/etc/resolv.conf的查询信息。试着在别的人的域名服务器和子域上进行附加的查询。如果设定正确,您将能够在其他教室系统上进行正向和反向查询。
挑战性的项目
通过增加多个“A”记录使得一个主机名称对应着不同的IP地址来配置一个“轮转”的主机名称。域名服务器该如何处理这种情况?提示: 试图尝试设定这些的A记录的TTL为0。
在您的域中增加子域“support.somainX.example.com”。增加合适的资源记录使得它能够反向指向您的IP地址。
与另一台工作站合作,成为另一台工作站的从域名服务器,在您的区域中为您的工作站增加一个新的CNAME,确保这个改变能够传播到从服务器。
收尾工作
接下来的试验就较为简单了,一旦您重新启动您的工作站,所有的DNS查询将会重新设定到教室中的服务器上。为了确保收尾,确保您重新设定/etc/resolve.conf到其初始的状态。
/etc/resolv.conf
search example.comnameserver 192.168.0.254
/etc/hosts
127.0.0.1 localhost localhost.localdomain localhost192.168.0.X stationX.example.com
(如果您关闭后启动eth0接口,DHCP将会自动为您设定配置文件)
试验3
Samba服务
估计时间: 1个小时
目标: 使用samba共享用户认证和文件系统
试验的起点: 标准的Red Hat Linux安装
将数据包过滤设定为无效状态。在本次试验开始之前,请您确保您的主机上的所有包过滤已被关闭。缺省的安装将会有一个文件叫做“/etc/sysconfig/iptables”,该文件配置了iptable的功能。运行“chkconfig iptables off”。为了去除空间中所有的规则,运行“service iptables stop”
步骤1:Samba的用户连接的配置
任务
1. 安装samba,samba-common和samba-client RPM 软件包并且启动smb服务。一个缺省的配置将会被应用. 使用如下的命令确定Samba是在正确的工作:
smbclient –L localhost –N
您可以从服务器获得回应,但是并不代表文件共享可用。(确保smbd在运行,否则该命令无法工作)
2.在您的系统中增加几个用户(karl,joe,mary和jen),但是并不给他们设定密码。这些用户仅能够从samba服务访问服务器。为了使得他们在shadow中不含有密码,这些用户的shell应该设定为/sbin/nologin
3.缺省的samaba是被配置用来接收加密的密码的,但是在文件/etc/samba/smbpasswd中没有设定任何密码。如果加密的密码在/etc/samba/smb.conf被设定,smbclient将发送加密的密码,所以为了在您的系统上测试samba服务,您应该首先建立smbpasswd文件,然后为每一个用户在该文件中添加密码。
4.注意到第一个在/etc/samba/smb.conf设定的共享[home]并没有指定路径。该共享被配置用来当用户连接并且认证通过以后共享用户的home目录。浏览一个或者两个用户的home目录。上传一个文件到joe的home目录。
可用的结果
一个工作的samba服务可以被多个用户通过smbclient访问。
步骤2: 提供给组目录访问的权限
场景/故事
为了使得我们的四个用户除了有他们自己的在服务器上的共享,我们这四位用户同时在同一个部门工作并且需要一个地方来存储部门的文件。我们将需要一个Linux用户组,建立一个目录给这些用户来存储它们的内容,并且配置samba服务器来共享目录。
任务
1. 建立一个对于拥有gid为30000的用户叫做legal的新组并且使用usermod命令将这些用户加到组里去。
2. 建立一个目录/home/depts/legal。对于这个目录设定拥有权限,使得在legal组中的用户可以在这个目录中添加/删除文件,然而其他的人不可以。并且设定SGID和粘滞位使得所有在这个目中建立的文件都拥有同legal组的权限并且组中其他的的人不能够删除该用户建立的文件。
3. 在/etc/samba/smb.conf中建立一个samba共享叫做[legal]。只有legal组中的用户才能够访问该共享。并且确保在[legal]中存放的文件的被建立的许可权限为0600。
4. 重新启动smb服务并且使用smbclient;来进行测试。
可用的结果
1. 只有lagal组能够访问和使用一个Linux目录。
2. 一个samba共享只有legal组的用户能够访问并且编辑
步骤3:为打印机提供访问
场景/故事
在samba中除了可以共享文件以外,另外一个重要的功能就是提供共享打印队列,该打印队列已经在您的Linux机器上定义。实际上,缺省的,所有在Linux机器上配置的打印队列通过[printers]共享到网络上去。在该步骤中,您将建立一个打印队列,通过samba服务器进行共享。然后通过smbclient来查看共享的打印机。
任务
1. 使用redhat-config-printer建立一个新的打印队列。把打印队列命名为printerX(其中X为您的工作站的号码)。配置打印机到本地连接的打印机/dev/lp0。配置打印队列确保任何递交的打印作业将保留在队列中。不要忘记重新启动samba服务器。
2. 通过smbclient来连接samba服务器上共享的printerX。使用print命令来递交打印作业到队列中去。检查作业已排队否。
可用的结果
1. 一个定义的Linux打印队列printerX
2. 一个Samba服务器允许授权的用户打印到共享打印机printerX
挑战1:安全和备份Samba/SMB
现在所有的东西都可以运行了,我们应该考虑在Samba服务器上的网络安全和数据的可靠性了。
任务
1. 定义并且保护对于samba服务器而言合法的连接。在文件/etc/samba/smb.conf中使用hosts allow参数来确定所有教室里的子网和本地回环子网。
2. 使用testparm测试/etc/samba/smb.conf的语法。这个是否显示出一些应该考虑的安全上的漏洞呢?
3. 对您的邻居的[legal] 共享进行备份。通过用户karl的帐户建立一个共享的数据打包,使用或者smbtar命令或者smbclient 的-T 选项。
可用的结果
1.samba服务器能够识别来自允许的子网或者主机的连接
2.一个SMB或者Samba共享的备份数据打包
一种解决方案
步骤1
l rpm –ivh ftp://server1.exmaple.com/pub/RedHat/RPMS/samba-c*
rpm –ivh ftp://server1.exmaple.com/pub/RedHat/RPMS/samba-2*
service smb start
smbclient –L localhost –N
l useradd –s /bin/false karl
useradd –s /bin/false joe
useradd –s /bin/false mary
useradd –s /bin/false jen
l smbpasswd –a karl
smbpasswd –a joe
smbpasswd –a mary
smbpasswd –a jen
l smbclient //localhost/joe –U joe
您应该看到smb:\>提示符
put /etc/hosts hosts
步骤2
l groupadd –g 30000 legal
usermod –G legal karl
usermod –G legal joe
usermod –G legal mary
usermod –G legal jen
l mkdir –p /home/depts/legal
chgrp legal /home/depts/legal
chmod 3770 /home/depts/legal
l 在文件/etc/samba/smb.conf文件中,共享定义部分:
[legal]
commnet = Legal’s files
path = /home/depts/legal
public = no
write list = @legal
create mask =0660
l service smb restart
步骤3:
l redhat-config-printer
l service smb restart
l smbclient //localhost/printerX –u joe
复习问题
1. 在ftp和smbclient之间有什么相同的地方?您使用ftp的时候永什么命令进行上传?ftp和smbclient之间上传操作之间有什么不同。
2. 命令nmblookup \*的作用是什么
3. smbtar命令是干什么的?
4. testparm /etc/samba/smb.conf 33.44.55.66 是做什么用的?
5. 使用smbmount命令该使用什么语法?
试验4
电子邮件
估计时间: 2个小时
目标: 建立基本的MTA的配置的技能
试验的起点: 标准的Red Hat Linux安装
指导教师:确保在Server1上的sednmail.mc文件中的DAEMON_OPTIONS被注释并且重新编译sendmail.cf文件使得能构接受来自其他主机的电子邮件。
介绍
本次实验作为一个安装和配置MTA的介绍。在介绍中我们将提及sendmail和postfix。您可以选择任何一个MTA,如果时间允许,您两个都可以做一下试验。在接下来的步骤中,您将
安装并且验证sendmail的“发件箱”
为您的sendmail的按渣添加新的别名
使用m4工具来改变您的转发行为
安装POP3服务器并且配置POP客户端
在整个试验中,主机和域名取决于您的机器的IP地址。如果下面的试验出现了X字样的名称,您应该把X字样的名称替换成您的工作站的号码(您的IP地址的最后一个部分)。例如,如果您的工作站的IP的地址是192.168.0.2,您应该将stationX.domainX.example.com转换成station2.domain2.example.com。
将数据包过滤设定为无效状态。在本次试验开始之前,请您确保您的主机上的所有包过滤已被关闭(显然,在实际使用中您可以利用Linux内核的防火墙机制,然而我们在这里关掉它是为了减少潜在的问题)。
本次试验中以root身份来使用下面命令达成上面的要求:
service iptables stop
chkconfig iptables off
初始化安装-安装必要的软件包
下列软件包对于sendmail是必需的: sendmail,sendmail-cf,sendmail-doc,m4和procmail。对于postfix而言,您需要: postfix。如果需要他们,从CD上进行检视和安装,server1的NFS安装点,从: ftp://server1/pub/RedHat/RPMS/
步骤1:配置MTA来收取邮件
为了安全的原因,sendmail和postfix的缺省的配置允许发邮件但是不允许从网络上接收邮件(缺省的它们只接受从回环接口上的连接)。按照如下配置您选择的MTA使得它接受传入的连接:
1.对于sendmail: 修改 /etc/mail/sendmail.mc
使用dnl注释在下面的行之前,就象这样:
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
2.将您的sendmail.cf文件做一个备份:
cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.orig
3.在同一个目录下,编译sendmail.cf
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
4.重新启动sendmail,通过
service sendmail restart
对于postfix:修改/etc/postfix/main.cf
A.找到并注释如下行
inet_interfaces = localhost
B.取消注释该行:
inet_interfaces = all
C. 保存文件并且进行到步骤2 的结束的地方。找到和上面一样的对应于postfix的配置的地方。
步骤2: 启动和校验MTA操作
对于sendmail: 有几个步骤您应该采用,以确保sendmail被正确安装。
A.确信sendmail已经被在适当的运行级别上运行
检查您的sendmail被适当的配置且能够在重新启动以后其能够运行。使用chkconfig是比较方便的。
chkconfig -–list sendmail
sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off
如果sendmail在标准的用户运行级别时无效,使用chkconfig, ntsysv 或者serviceconf 之类的工具来激活服务。
B.确定sendmail没有在启动的时候出现错误
Red Hat Linux安装的时候使用提供的syslog工具来记录所有的信息到文件/var/log/maillog中去。检查此文件中的最后出现“starting”的地方以确保sendmail在启动的时候没有任何错误。
sendmail可执行文件位于/usr/sbin/sendmail。为了确定sendmail是否正确标识您的主机名称,通过命令行开关开启其调试模式并且设定为0:
sendmail –d0 < /dev/null
Version 8.11.6
Compiled with: LDAPMAP MAP_REGEX LOG MATCHGECOS MIME7TO8 MIME8TO7
NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS QUEUE SASL SCANF
SMTP TCPWRAPPERS USERDB
============ SYSTEM IDENTITY (after readcf) ============
(short domain name) $w = station2
(canonical domain name) $j = station2.example.com
(subdomain name) $m = station2
(node name) $k = station2.example.com
========================================================
Recipient names must be specified
如果sendmail返回您的主机名称为localhost,您可能错误配置了/etc/hosts文件。检查您的/etc/hosts文件,删除所有的但记住留下localhost的指向。如果/etc/hosts文件是正确的,那么检查一下在/etc/sysconfig/netwoek中的HOSTNAME的定义。
试图向root@server1发送简单的邮件。您可以看到一个合理的您的主机的转发服务器的SMTP交换。
echo “hello root” | mail –v –s hello root@server1
root@server1... Connecting to [127.0.0.1] via relay...
220 localhost.localdomain ESMTP Sendmail 8.12.8/8.12.8; Mon, 22 Sep 2003 14:29:24 +0800
>>> EHLO localhost.localdomain
250-localhost.localdomain Hello station1 [127.0.0.1], pleased to meet you
...
>>> MAIL From:<root@localhost.localdomain> SIZE=52 AUTH=root@localhost.localdomain
250 2.1.0 <root@localhost.localdomain>... Sender ok
>>> RCPT To:<root@server1>
>>> DATA
250 2.1.5 <root@server1>... Recipient ok
354 Enter mail, end with "." on a line by itself
>>> .
250 2.0.0 h8M6TOU5026513 Message accepted for delivery
root@192.168.241.182... Sent (h8M6TOU5026513 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 localhost.localdomain closing connection
如果SMTP交换向上面一样正确,那么消息将被转发到您的工作站上的本地的转发服务器上,并且mailq –Ac将会报告一个空的对列。接下来检查mail(不使用参数)来检查一下消息是否从本地的转发到server1。这样对列也应该是空的。
您的消息是不是在/var/log/maillog中正确的记录呢?在下面的步骤中,监视文件/var/log/maillog。下面的命令将会十分的有用:
xterm –e tail –f /var/log/maillog &
对于postfix:
A.运行‘service sendmail stop’,接下来使用redhat-switch-mail使得postfix成为活跃的MTA。您也可以使用如下的命令行:
alternatives –set mta /usr/sbin/sendmail.postfix
B.确保postfix在合适的运行级别有效:
chkconfig -–list postfix
postfix 0:off 1:off 2:on 3:on 4:on 5:on 6:off
C.确定hostname命令正确的返回您的主机名称。应该是您的FQDN。
如果sendmail返回您的主机名称为localhost,您可能错误配置了/etc/hosts文件。检查您的/etc/hosts文件,删除所有的但记住留下localhost的指向,然后再试一遍。如果/etc/hosts文件是正确的,那么检查一下在/etc/sysconfig/netwoek中的HOSTNAME的定义。当这些值都正确的时候,启动postfix服务。
D.确定postfix在启动的时候没有错误
和sendmail一样,Red Hat Linux的安装使用提供的syslog工具来记录所有的信息到文件/var/log/maillog中去。检查此文件中的最后查找任何错误信息。
试图向root@server1发送简单的邮件并且检查/var/log/maillog的记录文件
mail –s `echo $USER` root@server1 < /etc/redhat-release
应该如下所示:
Sep 22 02:51:50 station1 postfix/pickup[2865]: A20ED348389: uid=0 from=<root>
Sep 22 02:51:50 station1 postfix/cleanup[3534]: A20ED348389: message-id=<2003092
2065150.A20ED348389@station1.example.com>
Sep 22 02:51:50 station1 postfix/nqmgr[2866]: A20ED348389: from=<root@station1.e
xample.com>, size=341, nrcpt=1 (queue active)
Sep 22 02:51:51 station1 postfix/smtp[3536]: A20ED348389: to=<root@192.168.241.1
82>, relay=192.168.241.182[192.168.241.182], delay=1, status=sent (250 Message q
ueued)
步骤3:添加新的别名
对于sendmail:
在sendmail决定消息的接受者的目的地的之前,其先试图在别名中查找。sendmail的主要的别名配置文件是/etc/aliases。为了优化查找,sendmail为其别名记录建立了一个哈希表数据库/etc/aliases.db.该文件通过newalias命令产生(该命令是sendmail –bi的同名)
下列命令将增加用户student(如果不存在的话)
useradd student
在/etc/aliases 行加入如下的行:
me: student
wizards: root, me
methere: student@stationX.example.com
现在运行newalias 命令来更新数据库,尝试发送邮件给您定义的收件人:
newalias
echo “hello there” | mail –s “hello” me
echo “hello there” | mail –s “hello” wizards
echo “hello there” | mail –s “hello” methere
您是否得到了期望的结果?是否所有的位于wizards的收件人都受到了邮件?如果没有,su – 到不是root的用户再试一次。
在postfix决定消息的接受者的目的地的之前,其先试图在别名中查找。postfix的主要的别名配置文件是/etc/postfix/aliases。为了优化查找,postfix为其别名记录建立了一个哈希表别名数据库/etc/postfix/aliases.db(和sendmail类似).该文件通过newalias命令产生。
下列命令将增加用户student(如果不存在的话)
useradd student
在/etc/postfix/aliases 行加入如下的行:
注意:注释root别名的那一行为postfix
me: student
wizards: root, me
methere: student@stationX.example.com
现在运行newalias 命令来更新数据库,尝试发送邮件给您定义的收件人:
newalias
echo “hello there” | mail –s “hello” me
echo “hello there” | mail –s “hello” wizards
echo “hello there” | mail –s “hello” methere
您是否得到了期望的结果?是否所有的位于wizards的收件人都受到了邮件?
步骤4.控制转发
转发允许邮件通过使用中间的“转发”及其传递到其目的地。尽管这个功能曾经有用,但是转发已经成为Internet上垃圾邮件的源泉了。人们希望发送主动提供的的邮件的时候希望使用转发机制,从而使得邮件发源地很难被侦测出来。
下列步骤将使用下面的主机。替换X,Y和Z为适合的工作站的号码:
stationX:源机器,邮件从这里发出
stationY:转发机器,这里邮件从发送者送出
stationZ:目的机器,邮件的最终目的
该步骤假设您是stationX,转发机器,与某人的stationY合作,该机器为邮件的源头。在该步骤中,注意/var/log/maillog的变化。下列命令将会显得十分的有用。
对于sendmail
步骤A:允许转发
您具有控制允许谁在您的机器上转发的能力。通过控制您的机器的混杂转发,您可以使得任何人都能够将您的机器作为转发的主机。(我们对于这种的尝试表示反对,也希望通过该实验显示出其缺陷)。配置/etc/mail/sendmail.mc, 通过加入如下行使得m4前置处理器允许混杂转发:
/etc/mail/sendmail.mc
(…其他的内容…)FEATURE(promiscuous_relay)dnl
使用m4前置处理机通过这个模板文件生成一个新的sendmail配置文件,然后将新生成的文件与通过sendmail RPM软件包提供的进行比较
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.test-relay
diff /etc/mail/sendmail.test-relay /etc/mail/sendmail.cf
使用混杂转发以后会有多大的不同呢?现在将新建立的sendmail.test放置在恰当的位置上,重新启动sendmail.
mv /etc/mail/sendmail.cf /etc/mail/sendmail.cf.accept-mail
cp /etc/mail/sendmail.test-relay /etc/mail/sendmail.cf
service sendmail restart
让您的伙伴扮演恶意的垃圾邮件的发送者,该人能够通过telnet到您的机器上的smtp(sendmail)的25号断口,进行垃圾邮件发送地址的欺骗,在stationY键入如下命令:
这个例子对于stationY(源机器)=station2,并且stationX(转发,在这里目的机器)=station1
[root@station1 root]# telnet station1 25
Trying station1.example.com...
Connected to station1.example.com (station1.example.com).
Escape character is '^]'.
220 station1.example.com (IMail 8.00 8-1) NT-ESMTP Server X1
helo mail.cracker.org
250 hello station1.example.com
mail from: spammer@cracker.org
250 ok
rcpt to:root@station1.example.com
250 ok its for <root@mailgrid.ods.org>
data
354 ok, send it; end with <CRLF>.<CRLF>
Subject: Faked
this was faked!
.
250 Message queued
quit
221 Goodbye
Connection closed by foreign host.
垃圾邮件现在送到您的机器上了。下一步,看看您的伙伴能不能从您的机器转发给第三台机器:
这个例子对于stationY(源机器)=station2,并且stationX(转发,在这里目的机器)=station1,并且stationZ(目的机器)=station3
[root@station1 root]# telnet station1 25
Trying station1.example.com...
Connected to station1.example.com (station1.example.com).
Escape character is '^]'.
220 station1.example.com (IMail 8.00 9-1) NT-ESMTP Server X1
helo mail.craker.org
250 hello station1.example.com
mail from: spammer@craker.org
250 ok
rcpt to root@station3.example.com
250 ok its for <root@station3.example.com >
data
354 ok, send it; end with <CRLF>.<CRLF>
Subject: Relayed
this was faked any relayed!
.
250 Message queued
quit
221 Goodbye
Connection closed by foreign host.
由于您的机器已经被配置成为允许混杂转发,垃圾邮件可以通过您的机器进行邮件转发。
对于postfix:
您具有控制允许谁在您的机器上转发的能力。缺省的postfix允许在子网上的任何人通过您的机器进行转发。胆汁并不是在每一个环境中都安全的。例如,您的机器和其他机器在一起,如果您的本地子网里有一台机器被其他人控制,那么其他的机器都会有麻烦。
让您的伙伴扮演恶意的垃圾邮件的发送者,该人能够通过telnet到您的机器上的postfix的25号断口,进行垃圾邮件发送地址的欺骗,在stationY键入如下命令:
[root@station1 root]# telnet station1 25
Trying 127.0.0.1...
Connected to station1 (127.0.0.1).
Escape character is '^]'.
220 station1.example.com ESMTP Postfix
helo mail.craker.org
250 station1.example.com
mail from:spammer@craker.org
250 Ok
rcpt to: root@station1.example.com
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
Subject: Faked
this was faked!
.
250 Ok: queued as 4FFA2348389
quit
221 Bye
Connection closed by foreign host.
垃圾邮件现在送到您的机器上了。下一步,看看您的伙伴能不能从您的机器转发给第三台机器:
这个例子对于stationY(源机器)=station2,并且stationX(转发,在这里目的机器)=station1,并且stationZ(目的机器)=station3
[root@station1 root]# telnet station1 25
Trying 127.0.0.1...
Connected to station1 (127.0.0.1).
Escape character is '^]'.
220 station1.example.com ESMTP Postfix
helo mail.craker.org
250 station1.example.com
mail from: spammer@cracker.org
250 Ok
rcpt to: root@station3.example.com
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject: Relayed
this was faked and relayed!
.
250 Ok: queued as 69C7B348389
quit
221 Bye
Connection closed by foreign host.
由于您的机器已经被配置成为允许混杂转发,垃圾邮件可以通过您的机器进行邮件转发。
步骤B:不允许转发
对于sendmail
通过替换新的sendmail.cf为接受传入的信件的配置文件来恢复缺省的sendmail的配置,并且重新启动sendmail:
mv /etc/mail/sendmail.cf.accept-mail /etc/mail/sendmail.cf
service sendmail restart
让您的伙伴再从stationY转发垃圾邮件。您的sendmail还是一个转发器么?任何一个转发的都会产生如下的消息:
550 root@station3.example.com .. Relaying denied
对于postfix
编辑文件/etc/postfix/main.cf取消转发。
查找并且取消注释下面的行,并且重新启动postfix
mynetworks_style = host
让您的伙伴再从stationY转发垃圾邮件。您的postfix还是一个转发器么?任何一个转发的都会产生如下的消息:
554 <root@station3.example.com>: Recipient address rejected: Relay access denied
步骤C:选择性的转发
对于sendmail
对于特定的主机,域或者网络,编辑/etc/mail/access并且重新启动sendmail。为了允许所有在example.com域中的机器可以把您的机器作为邮件转发服务器,你在/etc/mail/acces中添加如example.com域。和您的伙伴使用场景A中的命令进行测试。
对于postfix
对于特定的主机,域或者网络,编辑/etc/postfix/main.cf并且重新启动postfix。对于特定的主机允许通过您的机器进行转发,找到并且取消注释该行:
mynetworks_style = host
然后添加新行来允许转发的主机和网络,在这里允许station1和本地转发
mynetworks = 192.168.0.1, 127.0.0.0/8
和您的伙伴使用场景A中的命令进行测试。
步骤5:安装POP3服务器和客户端
在这个步骤中,你将配制您的机器stationX作为邮件的POP3服务器,使得您的在stationY的伙伴扮演POP客户端的角色。
步骤A:安装POP3服务器
配置一个POP3服务器比较简单,只需要两个步骤:
l 安装相关的RPM软件包
l 在xinetd中允许服务
安装相关的RPM软件包
POP守护进程和其他的具有相同功能的守护进程,例如IMAP守护进程绑定在软件包imap中。再如xinetd,krb5-libs*和imap软件包来检查imap软件包含有什么软件。
三个守护进程被包括进来:imapd,ipop2d和ipop3d。POP3被用在很多Internet服务提供商,POP2提供是为了向后兼容。IMAP守护进程提供了根加复杂的能力,包括了在服务器端的文件夹的管理。
在xinetd中允许服务
对于本实验,我们仅选定POP3服务。ipop3d通过xinetd在请求的时候被启动。为了激活,运行下面的命令:
service xinetd start
chkconfig ipop3 on
查看一下/etc/xinetd.d/ipop3。显式的重新启动xinetd并不是必需的,由于chkconfig发送给xinetd 一个USR2信号告诉他重新调入其配置。
确认服务
运行下面的命令确认服务已经被正确的安装。下面的命令只是一个指导:
echo “mail to be poped” | mail –s “Hello student” student
[root@station1 root]# telnet localhost 110
Trying 127.0.0.1...
Connected to station1 (127.0.0.1).
+OK POP3 station1 v2001.78rh server ready
USER student
+OK User name accepted, password please
PASS student
+OK Mailbox open, 1 messages
STAT
+OK 1 440
TOP 1 99999
+OK Top of message follows
Return-Path: <root@station1.example.com>
Delivered-To: student@station1.example.com
Received: by station1.example.com (Postfix, from userid 0)
id 72314348390; Mon, 22 Sep 2003 08:02:27 -0400 (EDT)
To: student@station1.example.com
Subject: Hello student
Message-Id: <20030922120227.72314348390@station1.example.com>
Date: Mon, 22 Sep 2003 08:02:27 -0400 (EDT)
From: root@station1.example.com (root)
Status:
mail to be poped
.
DELE 1
+OK Message deleted
QUIT
+OK Sayonara
Connection closed by foreign host.
如果一切顺利的话,您现在有一个安装好的POP服务器了。
步骤B :使用POP客户端
所有的现在的邮件用户代理(MUA),例如netscape,elm,Outlook,pine和mutt都是使用POP的,可以被用作POP的客户端。每一个的配置都有所不同。同样有一个流行字符界面的的POP客户端叫做fetchmail。fetchmail是高度的可配置的,可以查询多个邮箱,可以作为守护进程运行,这样使得其每五分钟查询用户的邮箱。fetchmail在主机上递送邮件到邮件传送代理(MTA),例如sendmail。我们将勾画出以后如何安装fetchmail和使用其来查询我们装过的POP服务器。
从CD或者从ftp://server1/pub/RedHat/RPMS来安装fetchmail软件包
注意到有很多选项可以影响fetchmail的行为。建立一个~/.fetchmailrc文件如下所示:
~student/.fetchmailrc
poll stationX.exmaple.com with protocol pop3: user studentXX there is user studentXX here password “password”
由于密码存储在该文件中,因此fetchmail将会拒绝运行除非您把该文件的属性设定为对于仅仅文件的所有者只读。注意还可以使用chown改变由root创建的文件的所有者为studentXX。
chmod 600 ~student/.fetchmailrc
chown student.student ~student/.fetchmailrc
尝试使用studentXX登陆到POP3邮箱
echo “hello student” | mail –s “Hola” student
su – student
fetchmail –v
exit
fetchmail能不能接收到student的POP邮件?将递送student的邮件到哪里?比从本地获取POP邮件有意义么?
让您的伙伴在另外一台机器上建立相同的~/.fetchmailrc文件(或者配置其它诸如mozilla的MTA)试图从您的服务器上进行收信。
复习的问题
1. m4宏语言提供给sendmail管理哪些东西?把所有的在xyz.com的用户邮件导向到本地用户xzplogin该使用什么语法?该在什么文件的和处填上这句话?
2. mailq命令用来作什么?您如何使用?
3. 当命令sendmail –q发出以后,sendmail将会试图仍在队列中等待的邮件。何时使用该命令是有用的?
4. 如果去除FEATURE(accept_unresolvable_domains)的注释将对垃圾邮件产生如何的影响?
5. m4有什么特征允许sendmail发送邮件作为整个域(例如,“example.com”)而不是完全的符合标准的主机名称(例如,“mail.example.com”)?
6. 在postfix中mynetworks_style如何影响转发?
请您查看文件/etc/postfix/main.cf。
7. 在文件/etc/postfix/access中需要如何的活跃的变化?
试验5
HTTP服务
估计时间: 1个小时
目标: 建立基本的拥有CGI的具有虚拟主机的Web服务器
试验的起点: 标准的Red Hat Linux安装
在整个试验中,主机和域名取决于您的机器的IP地址。如果下面的试验出现了X字样的名称,您应该把X字样的名称替换成您的工作站的号码(您的IP地址的最后一个部分)。例如,如果您的工作站的IP的地址是192.168.0.3,您应该将stationX.domainX.example.com转换成station3.domain3.example.com。
将数据包过滤设定为无效状态。在本次试验开始之前,请您确保您的主机上的所有包过滤已被关闭。缺省的安装将会有一个文件叫做“/etc/sysconfig/iptables”,该文件配置了iptable的功能。运行“chkconfig iptables off”。为了去除空间中所有的规则,运行“service iptables stop”
步骤1:服务的安装和基本的配置
场景/故事
您的组织需在一个小时内要一个Web服务器,拥有充足的CGI的能力比国内且具有为不同的虚拟主机提供不同的内容服务。
任务:
1. 需要如下的软件包:httpd和httpd-manual。如果需要的话,从CD或者ftp://server1/pub/RedHat/RPMS安装并...。使用chkconfig 来启动服务。
2. 启动httpd服务使用缺省的配置:service httpd restart
3. 检查在文件/etc/httpd/conf/httpd.conf中的DocumentRoot项目和下面的一样
DocumentRoot /var/www/html
4. 开启一个Web浏览器并且设定URL到:
http://stationX.example.com
如果您的浏览器在工作,您将看到缺省的服务器的索引页面。注意该文件并不是所存储的HTML文件,而是服务器在这些目录中没有缺省的index.html文件的时候自动生成的。
5.建立一个新的目录层次和一些新的内容
mkdir –p /var/www/virtual/wwwX.example.com/html
cd /var/www/virtual/wwwX.example.com/html
cat > index.html <<EOF
<b>wwwX.example.com</b>
EOF
(这建立一个只有一行的HTML文件)
6.在/etc/httpd/conf/httpd.conf尾部加入以下几行:
NameVirtualHost 192.168.0.X<VirtualHost 192.168.0.X> ServerName wwwX.example.com ServerAdmin webmaster@wwwX.example.com DocumentRoot /var/www/virtual/wwwX.example.com/html ErrorLog logs/wwwX.example.com-error_logCustomLog logs/wwwX.example.com-access_log combined<Directory /var/www/ virtual/wwwX.example.com/html> Options Indexes Includes</Directory></VirtualHost>
7.确保您的DNS系统哦功能能够解析您的虚拟主机的名称。
dig wwwX.example.com
8. 重新启动httpd: service httpd reload
9.在您的Web浏览器并且设定URL到新的虚拟主机:
http://wwwX.example.com
您看到您自己定义的页面了么?
步骤2:使用CGI
任务
1. 在步骤1设定的 <VirtualHost> 块中增加一行:
ScriptAlias /cgi-bin/
/var/www/virtual/wwwX.example.com/cgi-bin/
以上仅为一行并且在httpd.conf中不换行,注意给上面的两个元素之间留出空格。
2. 建立目录,然后在里面建立文件叫做test.sh 包含以下内容:
/var/www/virtual/wwwX.example.com/cgi-bin/test.sh
#!/bin/bashecho Content-Type: text/html;echo echo “<pre>”echo My username is:whoamiechoecho My id is:idechoecho My shell setting are:setechoecho My environment variable are:envechoecho Here is /etc/passwdcat /etc/passwdecho “</pre>”
3.通过把您的浏览器指向下面的地址尝试执行该CGI脚本
http://wwwX.example.com/cgi-bin/test.sh
为什么这个脚本不执行?检查日志文件/avr/log/httpd/获得信息来帮助你找到答案。(您是否计的重新启动或者重新载入服务器?)
4. 使得该脚本对于用户,组和其他可读并且可执行:
chmod 555 test.sh
现在脚本能够执行麽?
挑战1:为您的Web站点的文档提供安全访问
任务:
在wwwX.example.com的文档的根目录建立一个文件叫做.htaccess,并采用以下内容:
/var/www/virtual/wwwX.example.com/html/.htaccess
Authname “restricted stuff”AuthType BasicAuthUserFile /etc/httpd/conf/wwwXX.htpasswdrequire valid-user
2.建立您的域的密码文件。该文件必须被apache组可读。
htpasswd –mc /etc/httpd/conf/wwwX.htpasswd user_name
chgrp apache /etc/httpd/conf/wwwX.htpasswd
chmod g+r /etc/httpd/conf/wwwX.htpasswd
3.访问http://wwwX.example.com页面,您是否...httpd获得线索。
4.添加下列行到服务器的配置文件httpd.conf,在wwwX.example.com虚拟主机的<Directory> 块中增加一行:
AllowOverride AuthConfig
5.再次尝试访问http://wwwX.example.com页面,您是否...室趁娴娜ㄏ廾矗?/a>
步骤3:Squid的基本配置
1. 在您的系统上安装squid
rpm –Uvh ftp://server1.example.com/pub/RedHat/RPMS/squid*
2.开始服务(service squid start),然后配置您的浏览器使用您的localhost作为您的Proxy并且把端口设定为3128。
3.尝试访问一些主页。如果教师里面没有Internet可以访问,那么试图访问http://server1.example.com,将会返回服务器的测试页面。
4. 现在使用您的邻居来吧您的主机当作Proxy。这样子应该不能工作。
squid返回的页面在/var/log/squid/access.log文件的底部有所解释。
5.使用您喜欢的文本编辑器打开/etc/squid/squid.conf文件。正如您所看到的,大部分是文档和注释。您也该注意到squid是非常易于调校的。对于本实验,我们仅作简单的配置,熟悉了以后您将会适应更加复杂的配置。
6.在文件中查找第二次出现Recommend minimum configuration的地方。您将会会看到缺省的存取控制列表(acl)。在CONNECT method CONNECT 行的下面添加一个对于本地网络的存取访问列表项目:
acl example src 192.168.0.0/24
对于这个配置您可以把它作为参考以应用到其他的任何地方。src是该acl的源IP地址。
7.在文件中查找INSERT YOUR RULE(S) HERE,在localhost acl的上面增加如下的内容:
http_access allow example
重新启动squid。 您的邻居将能够访问您的Web缓存了。
8.一些URL最好能够避免。返回到acl的部分,在您新添加行的下面(使用example.com如果您在教师里面没有Internet访问权限的话)
acl otherguys dstdomain .yahoo.com
acl otherguys dstdomain .hotmail.com
这里有一些要提及的东西。首先,注意到acl的附加属性。第二注意到dstdomain的acl类型,指明了关心的目的域。第三、注意到在域名前的点表示符号,确保加上点。
9.增加一条拒绝访问规则应用到这些存在问题的域。返回到您刚在添加allow的地方,在其下面增加如下行:
http_access deny otherguys
再次重新启动squid,再次检查这些相关的域,非常不幸,访问没有被拒绝。
10.再次打开配置文件,将您添加的拒绝规则放在example的允许规则之前。也就是说,在otherguys拒绝规则之前的example允许规则使得访问被允许,但是拒绝没有被生效。在移动规则以后,重新启动squid。这回它将禁止访问在任何上面禁止访问的域内的站点了。
复习的问题
1.根据/var/www/manual提及的服务器的手册。ServerAlias是起到什么作用?
2.根据/var/www/manual/suexec.html, suEXE对于CGI进程拥有什么特性?
3.下列命令起什么作用,何时使用它?
httpd –t
4. 您是否对您的用户能够通过CGI脚本看到您的/etc/passwd而感到不安?是否有方法阻止显示系统的密码文件?
试验6
NFS 和 FTP
估计时间: 1个小时
目标: 管理和配置vsftpd和NFS
试验的起点: 标准的Red Hat Linux安装
关掉包过滤:在着手试验之前需要确认包过滤没有被激活,默认情况下iptables会调用 /etc/sysconfig/iptables这个配置文件,删除或重命名这个文件,iptables就会在下次启动时失效。或者使用命令 chkconfig iptables off也行。如果想让iptables立刻失效可以用命令 service iptables stop.
步骤1:使用vsftpd允许匿名用户上传
1. 需要以下包:vsftpd 。如果没有安装,从CD或者ftp://server1/pub/RedHat/RPMS安装。激活vsftpd服务
2. Vsftpd包提供了/var/ftp作为匿名ftp用户的下载文件的目录。但是默认没有匿名上传的文件夹。要配置vsftpd来允许匿名上传,首先要准备一个上传目录:
cd /var/ftp
mkdir incoming
chown root.ftp incoming
chmod 730 incoming
现在检验一下新目录的权限:
ls –ld /var/ftp/incoming
3. 配置/etc/vsftpd/vsftpd.conf文件中如下各行:
anon_upload_enable = YES
chown_uploads = YES
chown_username = daemon
anon_umask = 077
另外, 默认情况下anonymous_enable = YES(允许匿名访问)已经被配置了
重启vsftpd服务
4. 刚才配置的结果是使匿名用户可以上传文件到 /var/ftp/incoming中,但是不能从这个文件夹中下载文件或者列出文件(使用ls命令),这样可以防止“warez”之类的组织用我们的上传目录作为“drop box”来放盗版软件或数据。如果希望匿名用户上传文件,应该让 /var/ftp/incoming 文件夹的所有者为 daemon 所有组为 ftp,并且权限为600(只允许deamon用户读写)。
步骤2:NFS
任务:
5. 需要如下的软件包:nfs-utils。如果需要安装的话,请从CD或者ftp://server1/pub/RedHat/RPMS安装并...及nfslock服务。
6. 创建一个用户并且配置NFS共享他的主目录,共享给example.com读写权限。
a) 在配置NFS服务器之前,查看一下RPC服务是否在运行
rpcinfo –p
showmount –e localhost
b) 创建一个测试用户
useradd nfstest
c) 编辑 /etc/exports 来共享 /home/nfstest给example.com。如果你不知道这个文件的格式,请查看exports的man page。
d) 安装NFS的软件包,配置init运行级别3到5启用NFS服务,但是因为启动时如果/etc/exports 文件丢失或者它的大小为零, NFS服务不会启动。所以,你现在要来手动启动它,下一次启动时NFS就会自动启动了。
e) 观察RPC服务是否启动,看一看是否将/home/nfstest用nfs共享出来了:
rpcinfo –p
showmount –e localhost
f) 与一个或两个搭档相互mount对方的共享,然后再读取里面的内容,尝试用root和nfstest向其中写文件(如果你机器上的nfstest用户的UID和GID与搭档机器上该用户的不同,则把它们改成一样的)。看一下会怎样?为什么会这样?
试验8
身份验证服务
估计时间: 45分钟
目标: 培养有关身份验证的技巧
试验的起点: 标准的Red Hat Linux安装
关掉包过滤:在着手试验之前需要确认包过滤没有被激活,默认情况下iptables会调用 /etc/sysconfig/iptables这个配置文件,删除或重命名这个文件,iptables就会在下次启动时失效。或者使用命令 chkconfig iptables off也行。如果想让iptables立刻失效可以用命令 service iptables stop.
步骤1:使用PAM限制登陆的位置
场景/故事
您的系统中有高安全的内容。为了保证数据不被泄漏,你需要限制用户的访问,除了本地控制台,禁止任何其他方式访问系统。
任务:
1. 创建用户bill,他是user组的成员,再创建一个用户biff,他是finance组的成员
2. 编辑 /etc/security/access.conf 限定finance组的用户只能在第二个虚拟控制台登陆。为了达到这个目的,在这个文件的最后一行添加:
- : finance : ALL EXCEPT tty2
3. 通过编辑 /etc/pam.d/system-auth来限制所有服务,把以下这行添加到以auth开头的所有行后:
account required /lib/security/$ISA/pam_access.so
4. 如果你的限定起了作用,bill和root可以登陆到任何控制台,而biff只能在第二个虚拟控制台登陆
5. 清理:你如果运行authconfig工具,以上的操作将会被删除,你怎样确认你的设置有没有变化呢?
步骤2:使用NIS做身份验证
任务:
你应该与你旁边的人合作,然后决定谁做NIS的服务器端,谁做NIS的客户端,通过这个实验,你和你的同伴一起配置NIS的服务器端和客户端。你们要确定NIS的域名,还要注意每一个工作站的名字和IP地址,在开始以下的步骤之前,请确认以上内容。
1. 配置NIS服务器
a) 从ftp://server1/pub/RedHat/RPMS 、光盘安装ypserv,ypbind,和yptools的RPM包或者将server1的NFS共享mount到/mnt/server1上,从那里安装也可以。
b) 编辑 /etc/sysconfig/network ,添加这样一行:
NISDOMAIN = <你们的NIS域名>
下次启动时才会起作用,设置了NIS域名之后不要重新启动,运行命令:
domainname <你们的NIS域名>
c) 先将 /var/yp/Makefile 文件copy一份作为备份,编辑all部分只包含passwd和group:
all: passwd group
d) 打开portmap服务和ypserv服务
service portmap start
service ypserv start
e) 确保make包在你的系统中安装,(以下的命令是在 server1:/var/ftp/pub 已经被mount到/mnt/server1后才能使用)
rpm –Uvh /mnt/server1/RedHat/RPMS/make*
f) 使用ypinit产生NIS数据库(maps),注意可能出现的错误信息
/usr/lib/yp/ypinit -m
(注意:你不用在列表中添加任何主机,只要按 < CTRL - D > )
g) 启动NIS password升级进程
service yppasswdd start
h) 如果ypinit在第六步时没有错误,重新启动ypserv服务:
service ypserv restart
i) 使用ps auxf | grep yp确定ypserv服务运行,如果有错误的话查看日志 /var/log/messages
完成:正在正常工作的NIS服务器
2. 配置NIS客户端
到现在,任务只完成一半,你和你的同伴需要再配置这个NIS服务器的客户端。
a) 在客户端,确认已经安装以下几个包:portmap,ypbind,yp-tools和authconfig
b) 确认客户端可以看到服务器上的portmap服务
rpcinfo –p 你们的NIS服务器
c) 使用authconfig工具配置你的客户端使用NIS进行身份验证,选定“Use NIS”,在“Domain:”后指定你的NIS域,在“Server:”后指定你的NIS服务器。
d) 确认authconfig正确工作,当authconfig完成后,它会自动开启ypbind服务,是否有出错信息出现在控制台上或者 /var/log/messages中?
e) 测试你的NIS客户端,使用root用户登陆你的客户端,root用户是客户端上的root还是NIS服务器上的?测试 客户端----服务器的连接,使用:
ypcat passwd
这样会显示出NIS服务器上的password数据,(请记住,只有在服务器上/etc/passwd文件中UID大于等于500的用户才会被放进数据库中)
f) 使用useradd在客户端创建一个新的用户,然后在服务器端创建一个不同的用户,然后使用passwd设置他们的密码。
(在客户端): useradd -u 1024 localguy
passwd localguy
(在服务器): useradd -u 1025 nisuser
passwd nisuser
g) 确认使用localguy能在本地登陆,nisuser能在服务器上登陆。然后使用nisuser帐号在客户端上登陆,应该是不可以的。
h) 在服务器上的 /var/yp 目录,执行make命令,当命令完成,再使用nisuser从客户端上登陆,这回应该成功了,为什么?
i) 使用passwd改变nisuser的密码,是否改变了服务器上的 /etc/passwd 和 /etc/shadow 文件?NIS服务器中的文件是否改变了呢?你可以使用如下命令测试:
ypcat passwd | grep nisuser
j) 使用localguy登陆到客户端,是不是即时ypbind在运行仍然可以登陆?
k) 当你使用nisuser登陆到客户端时,你的主目录是什么?NIS仅仅提供验证信息,不提供客户端和服务器端的文件共享机制
完成:一个从NIS服务器上获得得验证信息的客户机
步骤3:限制NIS用户
任务:
我们的客户端现在是公司NIS体系的一部分,因为他储存了秘密数据,不是所有的用户都可以访问这台机器,只有特定的远程用户才能访问。
1. 这个测试需要添加一个NIS用户,使用useradd命令添加一个名叫baduser的用户。
useradd –u 1026 baduser
passwd baduser
2. 一个解决方案是使用pam_listfile,只允许nisuser访问我们的系统。打开 /etc/pam.d/system-auth ,紧接着auth开头的之后添加以下一行:
account required /lib/security/pam_listfile.so item=user sense=allow
file=/etc/nisusers onerr=fail
3. 假如测试目前的设置,你将会发现连root也不能登陆,所以千万不要关掉root的shell!你要创建 /etc/nisusers 然后把所有允许访问的用户添加到文件中,一行一个用户名,我们只想允许nisuser用户,所以我们的文件会非常短。
4. 现在如果你想登录到文本控制台,只有nisuser可以进入,因为其他人不在文件中,把root添加到 /etc/nisusers 中。
5. 我们的任务还是允许所有本地用户登陆的,我们可以把 passwd文件中的用户都添加到我们的列表中,但这不是最好的方法,我们可以使用PAM库中的pam_localuser来达到目的。添加以下这行到pam_localuser.so之后。
account required /lib/security/pam_localuser.so
6. 测试这样的配置,你会发现仍然只有root可以登陆,为什么呢?
7. 是因为required字段的关系,把上面添加的两行的required都改成sufficient,现在好了吧?如果改成requisite会怎么样?
8. 清理:再次运行authconfig工具,删除所有设置,并且禁用NIS。
试验9
系统监视
估计时间: 1小时15分钟
目标: 使用查找文件的方法来保护系统
试验的起点: 标准的Red Hat Linux安装
步骤1:定位易被攻击的文件或目录
场景/故事
查找文件系统中易被攻击的文件或目录
任务:
6. 查找有SUID和SGID的文件,并且把他们的名字存在 /root/stickyfiles中:
find / -type f -perm +6000 2> /dev/null > /root/stickyfiles
7. 查找任何人都可以写入的文件,把它们的名字储存在 /root/worls.writalbe.files:
find / -type f -perm -2 > /root/world.writalbe.files
8. 看一下 /root/stickyfiles 和 /root/world.writable.files 有哪些文件
步骤2:使用tripwire监视文件系统的完整性
场景/故事
你决定使用tripwire来确认数据的完整性
任务:
9. 使用root登陆并且安装tripwire 的RPM包(运行下面的这个命令之前需要把server1上的共享mount到 /mnt/server1目录上):
rpm –Uvh /mnt/server1/RedHat/RPMS/tripwire*
10. 看一下tripwire包中提供哪些文件和文档:
rpm –ql tripwire
11. 编辑 /etc/tripwire/twpol.txt 来定义你的主机策略文件。默认的策略文件是基于Red Hat linux的everything安装,这样它就会试图监视你没有安装的文件。结果是会产生一些出错消息,这些消息可以忽略。最好的方法是删除所有你没有安装的文件。
你应该定义自己的策略,仔细看一下策略文件,删除其中你机器上没有的文件。即使是只删除一两个你没有的文件就要花很长时间。现在来添加目前没有被监视的文件,添加 /etc/samba 目录到“Critical Configuration”部分。
12. 现在你定义完了你的策略,运行 /etc/tripwire/twinstall.sh ,这个脚本将建立加密的策略、配置和密钥文件。你需要输入一些密码,一旦这些步骤完成,在 /etc/tripwire中就会有一些新的文件产生。
13. 现在来用 tripwire –init 命令来初始化tripwire的数据库
tripwire会报告很多警告,这是因为它找不到在策略文件中包含的文件,你可以忽略它们。
14. 我们来测试tripwire,需要按照以下步骤完成
a) mv /sbin/ifconfig /sbin/ifconfig.bak
b) tripwire --check
15. 使用twprint生成一份报告,命令是这样的:
twprint -m r --twrfile \
/var/lib/tripwire/report/somehost.somedomain-200009-12134.twr
是否tripwire侦测到文件变化了?tripwire 会正确侦测到 /sbin/ifconfig丢失了。
把ifconfig还原回去,再次运行tripwire –check,这回还能侦测到改变吗?
mv /sbin/ifconfig.bak /sbin/ifconfig
tripwire –check
即使你把ifconfig还原了,但是修改的时间已经变化了,所以tripwire将会报告错误,升级tripwire的数据库
tripwire --update --twrfile \
/var/lib/tripwire/report/your_lastest_report_file
这将会启动默认的编辑器,这样你可以同意目前的变化。完成后退出编辑器,tripwire会升级你的数据库。
16. 你可能会注意到top程序没有被监视,这个文件经常被“root kits”所替换调,所以它应该被tripwire监视,编辑 /etc/tripwire/twpol.txt,在“System Administration Programs”项中添加 /usr/bin/top 这项规则。
/user/bin/top -> $(SEC_CRIT);
升级你的策略:
Tripwire --update-policy /etc/tripwire/twpol.txt
完成:
数据完整性的工具应该每天根据数据库来运行。
步骤3:使用tmpwatch来清理临时文件目录
场景/故事
你需要确定或者确定并删除已经有一定时间没有人访问的文件。
任务:
1. 运行tmpwatch的test选项,这样可以看一下哪些文件7天没有人访问了:
tmpwatch –v –test 168 /tmp
步骤4:文件的访问控制
场景/故事
你想创建一些用户可以使用的文件,然而你想控制用户对这些文件的访问类型。
任务:
1. 创建一个名为supervisor的用户
2. 在supervisor的主目录下创建两个文件:
touch /home/supervisor/{payroll,old.employees}
3. 防止payroll文件被删除
chattr +i /home/supervisor/payroll
4. 只允许数据附加在old.employees文件上
chattr +a /home/supervisor/old.employees
5. 确认文件的属性被更改:
lsattr /home/supervisor/*
6. 试着删除payroll文件:
rm /home/supervisor/payroll
你收到什么错误的信息?
7. 试着编辑old.employees文件,在保存文件时有没有错误消息?为什么会/不会这样?出错的消息是什么意思?输入以下命令:
echo “foobar” >> /home/supervisor/old.employees
为什么这个命令可以工作?
完成:
1. 不能被删除的payroll文件
2. /home/supervisor/old.employee文件只能把数据添加到其中,不能删除任何文件中的内容。
步骤5:将日志集中写入一个专门的日志主机中
场景/故事
你的老板认为将所有日志写到一个专用的日志主机中是个非常好的主意
任务:
与你的旁边的人一起做实验
1. 首先配置syslogd可以接收远程的消息,编辑 /etc/sysconfig/syslog :
SYSLOGD_OPTIONS=”-r –m 0”
2. 重启syslogd:
service syslog restart
现在你的主机可以接收其他机器的消息了
3. 配置syslogd发消息给别的机器,在/etc/syslog.conf添加下面这行:
user.* @stationX
在这里stationX是旁边的机器
4. 重启syslogd:
service syslog restart
现在你的机器就会把用户运行的程序发给旁边的机器了
5. 使用logger创建一个syslog的消息
logger –i –t yourname ”this is a test”
这则消息是否显示在你旁边机器的 /var/log/messages中了呢?
问题:
为什么这个消息会显示在 /var/log/messages?
你怎么避免这种情况?
试验10
使网络安全
估计时间: 1小时
目标: 学习使用iptables构建一个防火墙
试验的起点: 标准的Red Hat Linux安装,kernel要支持防火墙,iptables
要安装
步骤1:创建一个简单的防火墙
场景/故事
你要建立一个防火墙保护你的主机不受可疑主机192.168.0.254的骚扰,可疑的主机不只这一个,你还要创建一个规则防止你的一个邻近的主机使用ping-flooding(洪水ping)攻击你的计算机。
任务:
9. 删除所有已经存在的用户定义的chains,重置所有chains上的默认规则,刷新所有规则:
iptables –F; iptables –X
for chain in INPUT FORWARD OUTPUT; do
iptables –p $chain ACCEPT
done
或者
service iptables stop
10. 阻止所有从邻近的主机(192.168.0.Y)的进来的连接:
iptables –A INPUT –s 192.168.0.Y –m state --state NEW –j DROP
这样还是允许你打开到他们系统的连接,但不是所有的
11. 限制从你的邻居(192.168.0.X)进来的ICMP echo request(回应请求)包
iptables -A INPUT -s 192.168.0.X -p icmp --icmp-type echo-request \
-m limit --limit 6/minute --limit-burst 2 -j ACCEPT
iptables -A INPUT -s 192.168.0.X -p icmp --icmp-type echo-request \
-j DROP
12. 显示你的防火墙策略
iptables -nl
13. 测试你的防火墙配置
a) 你的邻居(192.168.0.Y)能连接到你的系统吗?你能ping通他吗?
b) 确认你的邻居(192.168.0.X)使用的不是你在上面第2步时设置的地址。
c) 你的邻居(192.168.0.X)能ping通你的系统吗?你能ping通他吗?
14. 保存你的防火墙设置:
iptables-save > /etc/sysconfig/iptables
或者
service iptables save
15. 配置你的系统重启后仍保留新的防火墙规则:
chkconfig --level 2345 iptables on
现在确认一下
chkconfig --list iptables
16. 重新启动确认你的策略仍在。
完成:
1. 你可以主动连接你的邻居(192.168.0.Y)
2. 所有的主机都可以主动连接你,除了你的邻居(192.168.0.Y)
3. 你的另一个邻居(192.168.0.X)不能用ping-flood攻击你的系统。
清理:
当你确信成功完成了实验,让你刚才创建的策略实效:
service iptables stop
chkconfig iptables off
试验11
使服务安全
估计时间: 1小时
目标: 使用tcp_wrappers和xinetd限制用户对系统的访问
试验的起点: 标准的Red Hat Linux安装
步骤1:限制特定主机对服务的访问
场景/故事
某些特定主机和特定网段比较危险,为了保护你的主机,你决定阻止它们访问你的一些敏感的服务
任务:
把你的主机配置成以下的描述的样子(你需要跟其他两个人合作,让他们来测试),注意:如果没有安装telnet-server和openssh-server,要把它们的rpm包装上。
17. ssh可以被本地子网访问,但是不能让其他网段的用户访问。
18. telnet可以被你的三个邻居访问,但是不允许其他人来访问。
19. 任何服务都不接受从cracker.org来访问(你能找出特定的IP地址范围吗?)
你可以找出不同的解决方案,下一页是其中一种解决方法。
一种解决方法:
假定你使用旁边的三台计算机stationX.example.com、stationY.example.com、stationZ.example.com来测试你的配置。
1. 安装telnet-server:
rpm –Uvh /mnt/server1/RedHat/RPMS/telnet-server*
chkconfig telnet on
安装openssh-server:
rpm –Uvh /mnt/server1/RedHat/RPMS/openssh-server*
chkconfig sshd --add
2. /etc/hosts.deny
sshd :ALL EXCEPT 192.168.0.
3. /etc/xinetd.d/telnet:
only_from = 192.168.0.X 192.168.0.Y 192.168.0.Z
4. /etc/xinetd.conf
no_access = 192.168.1.0/24
如果想侦测出cracker.org的IP地址,你可以使用host命令:
host –l cracker.org server1.example.com
以上的命令查询名称服务器server1.example.com中的cracker.org区域信息,从返回的IP来看所有的记录都是192.168.1.0这个子网的。呵呵世界上的事情不可能如此简单,通常名称服务器(DNS服务器)只允许它的从服务器进行区域传递,而不会允许其他计算机这样的。所以为了保护你的安全,想知道整个区域的信息非常不容易实现。
步骤2
场景/故事
你已经通过配置/etc/hosts.deny限制FTP和telnet访问,现在要审核你正在运行的服务了,你需要一个搭档扫描你主机的端口。
如果你在一个可以连通到Internet的教室中,不要用nmap扫描外面的example.com域或192.168.0/24之外其他的网段,谢谢您的配合!
任务:
1. 找一台别人的主机用以下命令进行端口扫描:
nmap –sSUR –P0 –vO <stationX> &> scan_of_stationX.txt
2. 在你的主机上使用root帐户登陆,运行以下命令查看你的哪些进程正在监听着哪些端口:
netstat –tulpe
主机上列出的端口与用nmap扫描的端口是否一致?如果你使用GNOME桌面环境,几个GNOME的连接端口可能会打开,退出X-window,进入运行级别3,netstat会报告相同的端口吗?
3. 现在使用chkconfig来验证你的系统,输入:
chkconfig --list |grep on
你的还配置了其他你不太了解的服务了吗,使用chkconfig和ntsysv命令来关闭你不用的服务,之后从新启动,重复第二步以上的步骤,netstat还会报告你关掉的服务的端口吗?
完成:系统审核显示只有需要的服务被运行。
试验12
数据安全
估计时间: 1个半小时
目标: 熟悉基于加密的工具
需要的RPM软件包: openssl,openssh,eopssh-clients,openssh-server
步骤1:使用gpg来交换加密的电子邮件
用户alice和bob希望能够安全的交换信息,使用GNU的Privacy Guard(gpg)来提供加密服务。您将建立两个用户,为他们的每个建立公钥和私钥。下一步,alice将获得bob的公钥,并且使用该公钥来加密给他的信息,bob将解密信息。
1. 建立用户
[root@localhost]# useradd alice; useradd bob
[root@localhost]# passwd alice
[root@localhost]# passwd bob
2.为每个用户建立公钥和密钥。注意到gpg第一次运行的时候,会建立缺省的初始化用户文件:当提示“…your message”,按下CTRL-C。
[alice@localhost]# gpg
[alice@localhost]# gpg –help
[alice@localhost]# gpg –gen-key
您将被提示多种的密钥参数。选择缺省的选项。当询问您的细节的时候,设定真实的名称为Alice。其他的信息您随便填写。您同时将被会问及您的密码。您可以使用任何密码(但是您必须自己记得住!);或者简单的敲两下<回车>不使用密码。
对于用户bob采用相同的步骤,设定其“真实的名称”为Bobby(gpg抱怨bob太短了)
3. 检查alice的公钥和密钥,该公钥和密钥存储在pubring.gpg和secring.gpg中。
[alice@localhost]$ ls ~/.gnupg
[alice@localhost]$ echo no-secmem-warning >> ~/.gnupg/gpg.conf
[alice@localhost]$ gpg --list-keys
/home/alice/.gnupg/pubring.gpg
------------------------------
pub 1024D/168F25D7 2003-09-18 Alice (demo key) <alice@station1.com>
sub 1024g/CE26F831 2003-09-18
[alice@localhost]$ gpg --list-secret-keys
/home/alice/.gnupg/secring.gpg
------------------------------
sec 1024D/168F25D7 2003-09-18 Alice (demo key) <alice@station1.com>
ssb 1024g/CE26F831 2003-09-18
4.让bob把他的公钥放在ASCII文件中以便方便的传递给alice。接下来,让alice导入bob的公钥到她的公钥环中去。
[bob@localhost]$ gpg --export --armor Bobby > /tmp/bob.key
[bob@localhost]$ cat /tmp/bob.key
[alice@localhost]$ gpg --import /tmp/bob.key
[alice@localhost]$ gpg --list-keys
/home/alice/.gnupg/pubring.gpg
------------------------------
pub 1024D/168F25D7 2003-09-18 Alice <alice@station1.com>
sub 1024g/CE26F831 2003-09-18
pub 1024D/67C0F0AD 2003-09-18 Bobby <bob@ station1.com >
sub 1024g/FDD05A7A 2003-09-18
5.现在alice获得了bob公钥的副本,并且把它加入到她的公钥环中去。她可以给bob发送加密的消息。使用下面的命令步骤来使得alice发送给bob一个加密的/var/log/dmesg的副本。
[alice@localhost]$ cp /var/log/dmesg message.txt
[alice@localhost]$ gpg --encrypt --armor --recipient Bobby message.txt
[alice@ station1]$ head message.txt.asc
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org
hQEOAzUJ6BL90Fp6EAP+J1gPH9RHQ1C+CaJGWSzUD2A603nspW2Ab+fQy7rmJbSA
5lwIPe5IzdmgSwMy80aefARQokI/cgdiWpb20Wzy2bltP413j/mrOiworKCOKguH
IJDQPqYxeticJSbwdZoTozsnLmWKp4uxappv3IaSI91w7REgN0KcwVetIn6UsYsE
AIKOqs1oXdYfU3Kzmt3DficQsZDgCuU1mVESCprb7Iyo/TvjjNuc9imqskrSveZZ
vFU8Loc7uI+gQ4HGUpFNryErMbaR2+KQnJCIz9GZJG/Lr7tFND4wCkFsu3jXvN6e
hUl5KRmRV3MWAkdOT4E3ZYF3dOhrdScxnpeIZdL5IDPo0usB9t2ZgIPHp9jKIIAc
[alice@localhost]$ mail -s "here it is" bob <message.txt.asc
6.现在让bob检查他的邮件,保存alice的邮件到文件。如果您不熟悉邮件客户端,您可以使用一个简单的基于命令行的mail工具
[bob@localhost]$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/bob": 1 message 1 new
>N 1 alice@stationa Thu Sep 18 22:02 84/4746 "here it is"
& w message_from_alice
"message_from_alice" [New file]
& q
[bob@localhost]$ less message_from_alice
[bob@localhost]$ gpg message_from_alice
您将被提示作为纯文本文件的文件名。使用缺省的message.txt。注意gpg自动的执行期望的动作,即,使用恰当的私钥进行解密。缺省的行为可以通过命令行的参数进行改变。
附加的步骤1的练习
1.使用gpg,使得alice能够向bob发送使用对成密钥加密的消息。
2.使得alice签署和加密消息给bob,bob需要什么其他的附加信息来验证签名
3.使得alice为她的消息建立一个拆离的签名,发送给bob消息和签名。让bob来验证拆离的签名
4.让bob签署alice的公钥,由此使得别人相信alice就是公钥的主人。
步骤2:使用ssh来进行加密的传输
场景A
alice和bob可能是不同工作站上的用户,他们希望建立等同的帐号。也就是说,alice希望访问bob的帐号而不需要输入密码,反之亦然。您将使用ssh提供如此的等同性。
在此步骤中提到的stationa指的是用户alice,然而stationb指的是用户bob。在执行此试验的时候您只需调正西医的步骤以适应您的主机名称。如果您的伙伴一起做这个试验,那么stationa和stationb指的就是您的机器的名称和他的机器的名称。如果您使用单一的机器,那么所有的机器名称将设定为localhost。
1. 确保适当的RPM软件包被安装
[alice@stationa]$ rpm -q openssh
[alice@stationa]$ rpm -q openssh-clients
[alice@stationa]$ rpm -q openssh-server
2.使得root帐户来确定bob机器上的sshd守护进程在运行
[root@stationb]# service sshd start
[root@stationb]# service sshd status
3.如果alice知道bob的密码,那么她可以通过ssh来访问其帐户。注意所有的和bob帐户的交互过程都是加密的,包括密码的传递。作为alice,运行如下的命令,在合适的时候提供bob的密码。
[alice@stationa]$ ssh bob@stationb ls /tmp
[alice@stationa]$ ssh bob@stationb
[alice@stationa]$ scp bob@stationb:/etc/services .
[alice@stationa]$ scp –r bob@stationb:/etc/xinetd.d .
4. 假设alice和bob希望采用更加安全的模式,让alice建立ssh的公钥和密钥对。注意到ssh-keygen应该被-t命令行开关启动,以至于密钥是通过DSA算法生成的。让alice检视其密钥(id_dsa)和公钥(id_dsa.pub)。
[alice@stationa]$ ssh-keygen –t dsa
[alice@stationa]$ ls ~/.ssh
[alice@stationa]$ less ~/.ssh/id_dsa
[alice@stationa]$ less ~/.ssh/id_dsa.pub
选择缺省的密钥位置的选项。同时,在提示的时候,通过按下<ENTER>选择一个空密码 。
5.让alice寄给bob她的公钥的副本。让bob把这个副本保存到文件~/.ssh/authorized_keys中去。
[alice@stationa]$ mail -s "my key" bob < ~/.ssh/id_dsa.pub
[bob@stationb]$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/bob": 1 message 1 new
>N 1 alice@stationa Fri Sep 19 15:56 13/982 "my key"
& w alice_key
"alice.key" [New file]
& q
[bob@stationb]$ mkdir ~/.ssh; chmod 700 ~/.ssh
[bob@stationb]$ cat alice_key >> ~/.ssh/autorized_keys
[bob@stationb]$ chmod 600 ~/.ssh/autorized_keys
6. 假设所有的东西都在其正确的地方(即,bob在他的授权的密钥中拥有alice的公钥的副本),alice现在可以访问bob的帐号,而不用提供密码。
[alice@stationa] ssh bob@stationb id
uid=508(bob) gid=508(bob) groups=508(bob)
[alice@stationa] ssh bob@stationb cvzf - /home/bob/ > \
> /tmp/bob.stationb.tgz
如果没有正确的配置的话,那么ssh仍然将会采用密码认证,并且提示alice输入密码。有几个步骤帮助您调试这种情况。首先,检查在服务器上的/var/log/messages和/var/log/secure文件以帮助您获得有用的信息。第二步,在ssh的客户端上采用-v命令行开关。这将会产生有用的调试信息。
7.对于bob也采用相同的配置,以至于其能够进入alice的帐户。
场景B
alice建立了公钥认证的Shell可以访问bob的帐户。她现在要求安全的访问(基于文本的)在bob机器上的Web服务。
1. 确保在bob机器上的Web服务运行正常。如果不是,那么通过root帐号登陆bob的机器,安装并且启动apache web服务。
[alice@stationa]$ lynx http://stationb/
2.使用ssh,使得alice连接到bob的帐户,为了达到另外一种效果,在alice的端口12345(或者其他未使用的端口)到bob的机器的Web服务器(端口80)建立一个加密的管道。
[alice@stationa]$ ssh bob@stationb –L 12345:stationb:80
(并且在另外一个终端)
[alice@stationa]$ lynx http://localhost:12345
alice将能够在步骤1和步骤2看到相同的Web页面。然而在第一步骤中,数据从Web服务器到alice的Lynx客户端是通过明文的方式发送的,这样很容易被嗅探到。在第二步中,数据包从Web服务器通过bob的ssh守护进程,通过密文的形式越过网络到达alice的ssh的客户端,并且解密和传送到alice的lynx客户端。
同时感谢Iknownothing参与翻译工作所付出的辛勤!感谢Mandy在0点后还要忍受那无节奏的打字声!
RHCE133实验(系统管理)
奉献Red Hat Linux 133 实验翻译(KevinZ)
--------------------------------------------------------------------------------
###请转贴时保留以下内容######
Red Hat Linux 133 实验部分
应广大RH爱好者的要求,奉献Red Hat Linux 133 实验翻译
请提出宝贵意见Mail:kissingwolf@hotmail.com
KevinZ(kissingwolf)
2004.1.4
#############################
Lab1 硬件和安装
步骤一:准备计算机
任务: 使用Red Hat Linux光盘启动系统
在启动时进入BIOS界面
设置系统启动顺序为A,CDROM,C
修改其他任何推荐的设置
保存并退出BIOS设置
步骤二:使用Anaconda(图形模式)安装Red Hat Linux
任务: 按照以下要求从光盘安装Red Hat Linux。注意,要初始化图形安装界面可能需要等待一两分钟。
l 使用检测到的鼠标配置(除非老师另有指定)
l 选择全新安装
l 使用定制安装选项
l 选择使用Disk Druid手动分区,删除所有原有的分区
l 使用以下分区方案:
n /boot 100M
n / 256M
n /usr 1000M
n swap 512M
n /var 400M
l 格式化所有分区,但是不选择检查坏块
l 使用默认的启动加载器设置(除非老师另有指定),不创建启动加载器密码
l 为网络设置选择DHCP,选择启动时激活
l 使用默认防火墙配置
l 选择适当的语言支持
l 设置对应的时区,根据老师的指示设置UTC
l 设置根密码为redhat
l 启用MD5和shaow密码模式(默认验证设置)
l 选择安装X window,不选任何其他组件
l 切换到tty5查看文件系统格式化的过程(使用Ctrl-Alt-5,用Alt-7切换回安装向导)
l 创建启动软盘可选
l 使用检测到的显示器和图形卡设置(除非老师另有指定)
l 配置使用图形界面登录
l 在安装结束后重启,完成初始化设置,不注册Red Hat Network
安装结束后启动系统,以root帐号登录,并检查以下文件:
l /var/log/messages
l /var/log/dmesg
以上安装的系统使用twm视窗管理器。通过后续的实验,我们将安装更多的软件包,实现功能的扩展和界面的美观
步骤三:使用NFS,FTP或HTTP安装Red Hat Linux
任务: 破坏现有的系统,重新安装Red Hat Linux。事先准备安装光盘1或从老师那里得到启动的介质。
破坏现有系统:
cat /var/log/messages > /dev/hda; reboot
cat /var/log/messages > /dev/sda; reboot
重启后使用启动介质启动,按照以下要求安装(由于已经覆盖了分区表,系统将警告没有找到分区表,必须重新初始化)
1. 使用CD启动
2. 在boot提示下回车
3. 选择对应的语言(English)
4. 在OK提示下回车
5. 选择对应的键盘(US)
6. 在OK提示下回车
7. 选择对应的安装方式(NFS镜像,FTP,HTTP)
8. 配置TCP/IP,选择“使用动态IP配置(BOOTP/DHCP)”
9. 在OK提示下回车
10. 根据选择的安装方式输入对应的信息:
FTP方式
FTP站点名称:192.168.0.254
Red Hat目录:pub/
HTTP方式
Web站点名称:192.168.0.254
Red Hat目录:pub/
NFS方式
NFS服务器名:192.168.0.254
NFS加载点:/var/ftp/pub
11. 这时Anaconda会读取安装镜像并检测显示器和鼠标的类型,显示欢迎界面
12. 选择定制安装
13. 使用diskdruid分区。使用以下分区方案:
/boot 100M
/ 2000M
swap 512M
/home 3 × 256M RAID0
14. 启动加载器,时区,图形,防火墙和验证方式都是用默认设置,除非教师指定
15. 设置适当的语言
16. 设置root密码为redhat
17. 安装默认的软件包
*指南中的分区方案非常重要,否则可能出现意料外的结果。
Lab2 Linux文件系统
目标:熟悉文件系统相关知识和技能
步骤一:创建和加载文件系统
任务:
1. 使用fdisk –l 得到ev/hda的分区尺寸信息。计算硬盘上没有分区的空间尺寸
2. 使用fdisk新增一个512M的逻辑分区(使用w命令将改动写入磁盘)。这个新分区的设备名是/dev/had_ ?为什么?
3. 重启以确定改动后的分区表被读入
4. 使用mke2fs,在新建的分区上创建一个新的ext2文件系统。创建时使用2k的块,每4k一个inode的设置。可能需要查看mke2fs的man page
5. 创建目录/data,作为该文件系统的加载点
6. 使用mount命令把新文件系统加载到/data。把/etc/passwd复制到/data,检查确认复制成功
7. Umount /data
8. 使用e2label为新分区指定卷标:
e2label /dev/hdax /data x是新创建分区的序号
9. 在/etc/fstab文件中为加载/data加入以下行:
LABEL=/data /data ext2 defaults 1 2
或者
/dev/hdax /data ext2 defaults 1 2
以上两行的实际效果相同。但是,如果更换了硬盘的总线或者是更改了主从的顺序,在fstab中使用卷标仍然可以定位这个设备
10. 加载新的分区
mount /data
11. 复制文件或使用touch 创建文件
步骤二:把ext2转换为ext3
1. 键入sync。这个命令把磁盘缓存信息写入磁盘。通常这个命令是定期执行的,但是以下步骤可能会先占自动同步。
2. 使用reset键重启动,或者使用电源开关关闭再打开(正常情况下不要这样)
3. 如果出现“Repair filesystem”的提示,尝试使用e2fsck /dev/hdx 修复文件系统
4. 成功启动后,通过创建journaling inode日志把ext2文件系统转换为ext3。因为ext3 的数据完整性和文件系统完整性大大增强了,所以可以 把自动预加载(pre-mount)基于时间的定期文件系统检查。
Tune2fs –j –c 0 –i 0 /dev/<partition>
5. 检查文件系统的characteristics
tune2fs –l /dev/<partition>
6. 编辑/etc/fstab /data的相关行,把文件系统由etx2更改为ext3
7. 卸载并用ext3重新加载文件系统,确认使用了ext3:
umount /data ; mount /data
df –T /data
8. 确认/boot下初始的虚拟盘镜像中包含了必要的ext3模块和jbd日志模块。如果/data是你的机器上的第一个ext3文件系统,很可能initrd中并不包含这些模块。这种情况只当我们需要ext3的支持而在initrd中又不包括相关的模块时非常重要。假设出现了这种情况,我们可以制作一个/boot/initrd-<version>.img文件:
mkinitrd –f –v /boot/initrd-$(uname –r).img $(uname –r)
9. 键入sync,然后手动重启动系统。
10. 观察启动过程。系统检查了哪个文件系统?在/data文件系统,是否看到了“recovering journal”提示信息?当不正常重启时,使用ext3的日志恢复是否比ext2的fsck快了?
步骤三:使用autofs自动加载系统
1. 确认iptables已经关闭
2. 编辑/etc/auto.master文件,去掉对/misc一行的注释
3. 在/etc/auto.misc文件中增加一行,用于加载server1.example.com的/var/ftp/pub目录到本机的目的/server1. 可以参考ftp.example.com行的示例.
4. 重启autofs服务 service autofs restart
5. 测试/misc/server1目录
Lab 3 管理启动
目标: 定制系统服务的技巧
步骤一: 使用chkconfig禁用服务
1. 使用chkconfig检查系统服务的状态: chkconfig --list
2. 使用以下示例将isdn在所有runlevel关闭
chkconfig --del <service name>
3. 使用--help 查看chkconfig语法信息 chkconfig --help. 关闭runlevel3和runlevel5的kudzu服务
4. 观察 on 和 --add 的差异, off 和 --de 的差异
chkconfig isdn --list
chkconfig isdn on
chkconfig isdn --list
chkconfig isdn off
chkconfig isdn --list
chkconfig isdn --del
chkconfig isdn --list
chkconfig isdn --add
chkconfig isdn --list
5. 使用chkconfig查看系统服务的状态和改变状态
步骤二: 更改系统登录标题
1. 我们将设置rc.local脚本用于每次重启时出现登录标题. 打开/etc/rc.local文件找到以下行:
touch /var/lock/subsys/local
2. 在后面插入以下行:
echo “ Welcome to \n” > /etc/issue
echo “All access to this computer is monitored” >> /etc/issue
echo “Unauthorized access is prohibited” >> /etc/issue
echo >> /etc/issue
echo “Last reboot complete at $(/bin/date)” >> /etc/issue
3. 保存文件,把/etc/issue复制为/etc/issue.orig
4. 重启动系统
5. 当系统启动后,切换到虚拟控制台确认登录标题出现了. 打开/etc/issue, 注意mingetty把\n扩展为你的主机名
步骤三: 更改默认runlevel
1. 编辑/etc/inittab文件,将默认runlevel从5改为3,如下:
id:3:initdefault:
2. 重启动系统.发生了什么?
3. 把默认runlevel改为5,重启动系统
步骤四: 增加当天的消息
1. 编辑/etc/motd文件,默认应为空. 增加以下行:
##################################
# Welcome to station xx #
##################################
<date> The sysadmin is playing today.
Expect frequent system downtime.
2. 切换到虚拟控制台登录.
Lab 4 用户和组管理
目标: 用户和组管理的技巧
步骤一: 创建用户和组
1. 使用useradd命令,为以下用户创建帐号:Joshua, alex, dax, bryan, zak, ed, manager. 为每个用户设置一个密码.
2. 使用groupadd命令,增加以下组: 并使用 –g 选项设定对应的GID
group gid
sales 10000
hr 10001
web 10002
为什么不用系统默认的gid?
3. 使用usermod命令把joshua和alex增加到sales组, dax和bryan到hr组, zak和ed到web组. 把manager加入所有组. 使用 –G选项.
4. 用各帐户登录,使用id命令确认组成员身份. 还有什么方法可以确认?
步骤二: 设置共享文件夹
1. 创建/depts目录,在目录下创建sales, hr, web文件夹
mkdir –p /depts./{sales,hr,web}
2. 使用chgrp命令设置对应组拥有对应文件夹
chgrp sales /depts/sales
3. 设置/depts目录的权限为755, 子文件夹的权限为770
4. 设置各部门的子文件夹的sgid, 使得创建的文件所有权为对应的组
shmod g+s /depts/sales
5. 使用各个帐号登录,并在对应位置创建文件,检查效果.只有manager可以进入所有的目录.也可以使用su -命令,但是要加上-,并且su下一个帐户之前要退出前一个帐户.
步骤三: 设置磁盘配额
1. 创建名为filehog的帐户,并设置用户在/home目录有60个inode的软限制和100个inode的硬限制. 使用以下命令测试, 要使用su - 命令,否则会失败.
su – filehog
quota
for I in $(seq 1 100); do echo –n “file$(i)”; touch file$(i) 2 >&1; done | less
quota
quota命令会报告当前的限制和已经使用的inode. 使用循环的目的是创建100个文件. 因为当创建用户filehog的时候需要从/etc/skel复制一些文件,所以创建100个文件的命令将不会成功.
如果quota设置成功,你会看到一系列反馈的数字直到达到软限制的数目. 超过限制后,会看到一个警告,但是命令仍然能够执行.达到硬限制后,将得到出错信息,而且不能再创建任何文件. 可以用<shift><Page Up>回滚检查输出,并且用ls命令查看filehog的主目录.
2. 创建一个名为diskhog的用户, 设置用户在/home目录的软限制为4MB, 硬限制为5MB,使用以下命令测试
su – diskhog
quota
dd if=/dev/zero of=bigfile count=3 #将成功
dd if=/dev/zero of=bigfile count=4 #将成功
dd if=/dev/zero of=bigfile count=5 #将失败
观察quota命令的输出. 注意当超出inode软限制和block软限制的输出差别.达到inode软限制时用户得到警告,而达到block软限制时是不同的.
步骤四: 客户端NIS
1. 使用authconfig配置系统为NIS客户. 设置notexample为NIS域名, 服务器为192.168.0.254
2. 试用guest200x为帐号从虚拟控制台登录, x为座位编号.发生了什么? 如果登录失败,检查设置.如果还有问题,确认教师机的设置正确.当验证成功后,你将看到shell的目录为/. 因为没有在本地创建帐号,所以没有主目录. 当用户帐户使用目录服务的时候会出现这种情况,无论是NIS,LDAP还是SMB
3. 使用autofs解决主目录问题.用户主目录位于server1.example.com,我们可以加载基于NFS的共享来提供用户环境.首先编辑/etc/auto.master,增加以下行
/home/guests /etc/auto.guests --timeout=60
这条记录告诉自动加载器(内核模块之一)/home/guests由它控制.所有相关的加载设置保存在/etc/auto.guests文件中,而且如果60秒内没有活动就自动卸载.
4. 创建并编辑/etc/auto.guests文件.增加以下行:
* -rw, soft, intr 192.168.0.254:/home/guests/&
这条记录指明在目录下的所有子目录都配置为从192.168.0.254:/home/guests下的相应目录加载,并且设为:读写,如果加载不成功就返回超时,并且在加载不可用时仍允许进程访问文件.
5. 配置autofs在runlevel3,4,5时运行,并手动启动:
chkconfig autofs on
service autofs start
6. 登录并查看是否主目录自动加载.可以试验登录到附近的其他机器.你将可以在notexample域内的任何一台机器上获得自己的用户环境.
7. 在自己的机器上以root登录,,使用su –guest200x.是否提示输入密码? 这意味着本地root帐号和NIS域之间是什么关系?
配额方案:
1. 编辑/etc/fstab, 用usrquota代替defaults, 然后执行 mount –o remount /home
2. 创建一个用于保存用户配额的数据库(-c 可以在第一次运行quotacheck时隐藏警告)
touch /home/aquots.user
quotacheck –c /home
3. 打开内核强制配额
quotaon /home
4. 设置EDITOR变量为你希望的文本编辑器
5. edquota filehog 设置硬节点限制为100,软节点限制为60
6. edquota diskhog 设置软块限制为4096,硬块限制为5120
Lab 5 静态网络设置
目标: 手动配置网络设置的技巧
步骤一: 设置IP地址
1. 使用ifdown命令关闭网卡
ifdown eth0
2. 用文本编辑器打开/etc/sysconfig/network-scripts/ifcfg-eth0, 按以下内容更改(x为你的座位号)
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.0.x
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
3. 查看/etc/resolv.conf的内容.里面应该包含从DHCP服务器得到的设置.如果没有.改为以下设置:
search example.com
nameserver 192.168.0.254
4. 使用ifup启动配置好的网卡
ifup eth0
5. 使用ping server1 确认网络配置
6. 重启动系统,使用ping server1 确认网络配置
Lab 6 系统管理工具
目标: 掌握系统管理工具的使用以及对CUPS的管理
步骤一: 使用at和cron
1. 设置一个提示,提醒今天中午12:00去吃午餐. 在root提示符下.使用以下命令:
at noon; (回车)
echo “Time for lunch with Joe.” (回车)
2. 使用atq命令检查任务队列,确认
3. 使用at命令在5分钟后运行 df –k命令
4. 设置今天每10分钟检查一次系统状态用于检查性能问题.你怀疑时内存或者IO问题,所以要进行相关的监控. 使用root帐户,并使用crontab –e 命令编辑cron文件
5. 在文件种加入以下行:
*/10 8-17 * * * /usr/bin/free; /usr/bin/iostat
6. 如何把来自cron的输出到一个邮件地址?
7. 以root身份使用pine,mail或mutt检查使用受到了来自at和cron任务的邮件
8. 成功后删除cron任务
步骤二: 日志记录到一个集中的位置
这个实验需要和相邻计算机的配合.
1. 首先设置syslogd接受远程消息. 编辑/etc/sysconfig/syslog文件:
SYSLOGD_OPTIONS=”-R –M 0”
2. 重启动syslogd:
service syslog restart
3. 设置syslogd把消息发向远程机器: 在/etc/syslog.conf文件种增加以下行:
user.* @stationx
4. 重启动syslogd:
service syslog restart
5. 使用logger命令生成syslog消息,测试设置:
logger –i –t yourname “this is a test”
这条消息是否出现在相邻机器的/var/log/messages文件中?
步骤三: 使用dump/restore恢复单个文件
1. 准备用dump备份/boot目录下的文件. 使用df /boot查看/boot所在的设备(以下假设为/dev/hda1)
2. 首先确认备份需要的空间. 查看一个0级备份需要的字节数,使用 -S
# dump -oS /dev/hda1
3. 备份到文件而非磁带. 确认在/var/tmp目录是否有足够的空间,执行
# dump -0u –f /var/tmp/dumpfile /dev/hda1
4. 检查/etc/dumpdates,查看完全备份的时间戳.
5. 使用restore检查备份文件的内容
# restore –tf /var/tmp/dumpfile
6. 我们可以使用restore的互动模式恢复特定文件到一个临时目录.
# mkdir /tmp/restored; cd /tmp/restored
# restore –if /var/tmp/dumpfile
7. 这时会看到一个restore > 提示符. 键入help查看可用命令的列表. 使用ls和cd命令查看备份文件的列表.
8. 使用add,选中/grub.menu.1st和/grub/grub.conf文件.列出所在目录,恢复的文件应该带有星号.
9. 键入extract命令恢复选中的文件.设置下个卷名为1, 不为解压目录设置所有者模式. quit退出restore模式.
10. 在restore运行的目录中应该有一个grub目录,包含恢复的grub.conf和menu.1st文件.
步骤四: 设置打印机,使用CUPS管理打印机.
1. 使用root帐户运行redhat-config-printer
2. 选择新建,回车
3. 在队列名称位置输入lp0
4. 选择队列类型为本地打印设备
5. 选择下一步,回车
6. 选择/dev/lp0,选择下一步
7. 选择postscript printer, 选择下一步
8. 当出现创建新队列:名称和类型画面时,选择结束,回车
9. 选择退出,回车.将询问是否保存.选择是.
10. 键入命令: cd 并键入 lpr < install.log
11. 键入命令: lpq (将会看到一个由root激活的打印任务,任务号为1)
12. 键入命令: lprm 1 删除任务
13. 键入命令: lpq (将会看到任务已经删除)
Lab 7 RPM和Kickstart
步骤一: kickstart安装
安装前阅读排故的建议
1. 编辑 /root/anaconda-ks.cfg文件,在开头插入以下行
nfs --server server1.example.com --dir /var/ftp/pub
使用以下分区方案:
clearpart --all
part / --fstype ext3 –size=256
part /boot –fstype ext3 --size=100
part /tmp –fstype ext3 --size=128
part /usr –fstype ext3 --size=2800
part /var –fstype ext3 --size=400
part /home –fstype ext3 --size=128
part swap –size=512
在%post部分增加以下内容作为一行
perl –pi –e ‘s, Welcome to %n, My kickstart system %n,’ /etc/X11/gdm/gdm.conf
2. 保存anaconda-ks.cfg文件为ks.cfg.复制到软盘
3. 用光盘或其他启动介质重启动系统, 把kickstart软盘放在软驱中
4. 当出现boot提示符时 输入linux ks=floppy 如果软盘有错系统会提示修正.
使用这个系统进行后面的实验.
排故建议:
如果安装过程中提示配置语言或者键盘,是因为ks.cfg中缺少对应的行.
如果出现Disk Druid, 说明分区配置不对.确定有足够的硬盘空间,并且分区配置包括swap分区.
Phython编译器在出错时会大量溢出信息.使用<Shift><Page Up>和<Shift><Page Down>仔细检查,即使对Phython不熟悉也会找到出错原因.
在%post部分之外的错误往往会在覆盖现有系统之前出现.可以重启动系统并修改ks.cfg文件.启动时用linux 1进入单用户模式可以加快启动速度.
步骤二 安装
Lab10 系统恢复和排故
目标:掌握排故过程中的技巧
1. 使用RPM查询以下请求:
initscripts包中有那些文件?
Bash包由哪一台主机创建?
pam包在安装后是否更改过?
哪个包名称中包含gnome?
哪个包生成了/etc/inittab文件?
哪个包生成了/etc/fstab文件?为什么?
你的内核的版本更新记录的最后一条记录是什么?
以下命令有什么差异?
rpm –ivh <package file>
rpm –Uvh <package file>
rpm –F <package file>
2. 练习检查光盘或server1上的RPM包的签名和完整性
使用 rpm –import 把Red Hat 的GPG导入系统
gpg --import /usr/share/rhn/RPM-GPG-KEY
rpm --import /usr/share/rhn/RPM-GPG-KEY
下面的命令将把包中的私钥和安装的公钥比较,确定包在创建后是否改变过
rpm -K <RPM package file>
3. 验证.
从ftp://server1.example.com/pub 安装可用的更新.注意,如果要复制到本地安装则要有足够的空间,在对内核进行更新时要使用安装而非更新命令.
删除Red Hat的公钥(使用 man gpg查看方法), 用Red Hat,Inc(security@redhat.com)创建假公钥, 然后使用rpm -K查看当密钥不一致时的情况.
步骤三: 自动解析依存性
开始前, 确认以下包没有安装:
rpmdb-redhat
xsane
sane-backends
可用的文件包在加载NFS共享server1.example.com:/var/ftp/pub后找到,位于RedHat/RPMS
1. 观察没有自动解析的情况: 从共享位置安装xsane包.会出现类似提示:
error: Failed denpendencies:
libsane.so.1 is needed by xsane-0.89-3
不要试图完成安装.
2. 使用rpmdb-redhat. 安装rpmdb-redhat包,再次试图安装xsane包.这次仍然会失败,但是会给出有用的信息:
Suggested resolutions:
sane-backends-1.0.9-5.i386.rpm
3. aid. 在RPMS目录下使用rpm –ivh --aid xsane-0.*.rpm
sane-backends将被自动加载以满足依存性
注意,因为安装包和依存的包在同一目录,所以不需要指明rpm安装的方法
步骤四: GRUB
1. 重启动进入GRUB界面.如果在grub.conf文件中设置了timeout选项,可以看到画面下方的倒数.
2. 在倒数结束之前,按方向键停止计数
3. 注意显示下方的提示.使用上下键选择启动的内核,按e选择编辑grub.conf的内容.
4. 根据下方的提示,使用上下键选择有kernel字样的行并按e编辑
5. 现在进入了GRUB编辑模式.输入空格,s 然后回车.可以看到返回了前一画面,kernel行多出了文本s.如果不想保存更改,可以按ESC返回前一画面
6. 按b使用更改选项启动.在上例中将进入单用户模式(single user)
7. 重启后检查grub.conf文件.你将发现所作的更改没有保存在文件中
8. 重复以上步骤, 试验其他runlevel
Lab 8 逻辑卷和阵列
目标: 在安装后创建逻辑卷和阵列的技巧
步骤一: 使用LVM创建逻辑卷
1. 使用fdisk在未分区空间创建四个新分区,类型为Linux LVM (0x8e), 尺寸一样,为了加快速度,不要大于1G. 退出时使用w保存更改.不要重启动.
2. 编辑/etc/modules.conf中包含以下行(RHEL 可以不用做以下修改):
alias block-major-58 lvm-mod
alias char-major-109 lvm-mod
使用当前内核创建initrd
mkinintrd –f –v /boot/initrd-$(uname –r).img $(uname –r)
这个命令将使系统在启动时加载lvm-mod模块,启用LVM
3. 重启动系统
4. 用root登录, 运行vgscan初始化LVM配置文件
5. 使用pvcreate将LVM分区初始化为物理卷.假设分区为
/dev/hda9
/dev/hda10
/dev/hda11
/dev/hda12
命令为: pvcreate /dev/hda9 /dev/hda10 /dev/hda11 /dev/hda12
可以使用pddisplay查看分区信息
6. 然后创建卷组test0. 使用默认4MB的扩展尺寸,只包含一个物理卷
vgcreate test0 /dev/hda9
可以使用pddisplay查看信息
7. 创建一个小逻辑卷,不要占用所有空间. 使用vgdisplay的VG size和 PE/size信息,比如创建一个40M的逻辑卷:
lvcreate –L 40M –n data test0
可以使用 lvdisplay /dev/test0/data 确认命令执行了.
8. 在逻辑卷上创建ext3文件系统: mke2fs –j /dev/test0/data
9. 创建/data目录. mount /dev/test0/data /data
10. 复制文件到/data. 可以创建一个大文件: dd if=/dev/zero of=/data/bigfile bs=1024 count=20000
使用df检查/data的磁盘使用情况和剩余空间. 确认能够正常使用.可以编辑/etc/fstab来自动加载/data.重启动测试
步骤二: 使用逻辑卷
1. 首先, 卸载/data. 使用e2fsadm扩展分区尺寸: e2fsadm –L+50M /dev/test0/data
2. 重加载/dev/test0/data到/data, 确认文件. 运行df检查/data的磁盘使用情况和剩余空间.
3. 使用剩余扩展创建第二个逻辑分区. 运行vgdisplay查看PE /size,格式类似于166/644MB,这表示卷组包含166个扩展,664MB剩余空间. 创建一个占用166个扩展逻辑卷/dev/test0/scratch, 命令为:
lvcreate –l 166 –n scratch test0
4. 格式化新卷: mke2fs –j /dev/test0/scratch
5. 把未使用的物理卷加入卷组 vgextend test0 /dev/hda10
6. 如果再次运行vgdisplay, 可以看到增加的扩展.用20MB的扩展定义新逻辑卷.
e2fsadm –L+20M /dev/test0/scratch
使用lvdisplay和vgdisplay确认成功
7. 接下来用/data的只读快照创建新的逻辑卷. 首先用只读选项加载/data
mount –o remount,ro /data
8. 快照不需要和父卷尺寸一致,我们假设不需要保存太多数据,可以设置为5M
lvcreate –s –L 5M –n snap /dev/test0/data
9. 现在重加载/data为读写状态
mount –o remount,rw /data
10. 创建新加载点/snap, 使用 mount /dev/test0/snap /snap 比较/data和/snap,两者内容应该一致
11. 运行命令 for I in$(seq 1 10); do echo $1 > /data/$1; done 将在/data下创建十个文件,名称从1到10. 这个命令不影响/snap, 可以用lvdisplay /dev/test0/snap检查
12. 当快照逻辑卷不能容纳改变的块时,将被LVM自动删除,即使当前在加载状态.(避免这一情况的方法是尺寸和父卷一致,或者及时用lvextend扩展尺寸)可以通过以下方式看到这一现象:
rm /data/bigfile
for i in $(seq 1 10000); do echo $1 > /data/$1; done
13. 在/var/log/messages里可以看到类似信息:
Mar 19 16:30:02 station12 kernel: lvm --giving up to snapshot
/dev/test0/data on /dev/test0/snap: out of space
运行ls /snap. 快照已经不可用了,目录是空的.运行 lvdisplay /dev/test0/snap,和11步的结果比较.
14. 做完快照之后,如果数据已经备份,或者快照已被删除,都需要被卸载,否则会造成轻微的性能下降, 使用 umount /snap; lvremove /dev/test0/snap
在进行阵列试验以前清除LVM卷:
删除所有/etc/fstab中增加的记录
umount /dev/test0/data; umount /dev/test0/scratch
lvremove /dev/test0/data; lvremove /dev/test0/scratch
vgchange –an test0; vgremove test0
步骤三: 软件阵列
1. 在实验中我们将在同一磁盘创建多个分区来实现阵列,但是在实际工作中我们一般使用在不同磁盘上的分区来创建.使用fdisk将Linux LVM(0x8e)分区转换为Linux raid auto(0xfd)分区.保存更改.
2. 重启动系统.
3. 创建/etc/raidtab文件定义四个RAID-5阵列设备.根据以下示例,用实际的分区替换.chunk-size是一个重要的参数,决定了一次向阵列中每个磁盘写入数据的量.RAID-5需要一个校验算法行,一般设为left-symmetric来提高磁盘性能
raiddev /dev/md0
raid-level 5
nr-raid-disks 4
chunk-size 32
persistent-superblock 1
parity-algorithm left-symmetric
device /dev/hda9
raid-disk 0
device /dev/hda10
raid-disk 1
device /dev/hda11
raid-disk 2
device /dev/hda12
raid-disk 3
4. 初始化阵列: mkraid /dev/md0. 如果阵列没有启动,手动启动 raidstart /dev/md0. 此时阵列会立即开始建立,但是已经可用了.可以在另一个虚拟控制台用 watch cat /pro/mdstat 监控建立过程.
5. 使用4k的块的ext3文件系统格式化. Stride选项应设为chunk size和阵列磁盘数的乘积, 可以加快格式化的速度
mke2fs –j –b 4096 –R stride=32 /dev/md0
6. 查看是否能 mount /dev/md0 /data. 即使仍在建立过程也可以加载. 使用df命令查看文件系统尺寸. 如果是四个同尺寸的分区组成的阵列,文件系统尺寸应该为三个分区之和.(其他空间用于储存校验信息)
7. 使用lsraid显示阵列设备的相关信息. Lsraid –A –a /dev/md0
8. 试着在/data创建文件. 可以在/etc/fstab中加入记录用来自动加载.
9. 检查/proc/mdstat, 确认阵列已经建立. 可以看到类似输出:
md0: active raid5 hda12[3] hda11[2] hda10[1] hda9[0]
2328064 blocks level 5, 32k chunk, algorithm 2[4/4] [UUUU]
10. 测试卷的破坏.用以下命令模拟: raidsetfaulty /dev/md0 /dev/hda11
在/var/log/messages中寻找出错信息, 注意/proc/mdstat文件的改变
md0: active raid5 hda12[3] hda11[2] hda10[1] hda9[0]
2328064 blocks level 5, 32k chunk, algorithm 2[4/3] [UUUU]
重启动系统, 查看启动时dmesg和/var/log/messages的出错信息
11. 模拟在重启前更换了损坏的磁盘. 使用命令替换阵列分区:
raidhotadd /dev/md0 /dev/hda11
12. 这时将看到/proc/mdstat显示阵列的重建
进阶实验:在软件阵列上创建LVM
以下实验可选,需要创建一个在两个磁盘上的物理卷建立的RAID1镜像卷基础上的RAID10. 使用同一磁盘的两个分区模拟这一情况.
1. 撤销前面的软件阵列设置: umount /dev/md0, 删除/et/fstab中的对应行.运行 raidstop /dev/md0. 从/etc/raidtab中删除/dev/md0设备.
2. 编辑/etc/raidtab创建两个RAID1镜像/dev/md0和/dev/md1, 分别由两个分区组成.示例如下:
raiddev /dev/md0
raid-level 1
nr-raid-disks 2
chunk-size 32
persistent-superblock 1
device /dev/hda9
raid-disk 0
device /dev/hda10
raid-disk 1
3. 注意: 运行命令时可能需要-f和-R重运行.因为系统会检测到上次创建的相关superblock.
4. 格式化并启动阵列设备: mkraid /dev/md0; mkraid /dev/md1
5. 设置阵列设备为物理卷: pvcreate /dev/md0 /dev/md1
6. 创建卷组: vgcreate test0 /dev/md0 /dev/md1
7. 使用vgdisplay查看有多少扩展可用
8. 设置条带的逻辑卷. 使用-i 指定构成条带逻辑卷的卷组中物理卷的数目. –I 设置条带的尺寸. 当使用-i时作用等同于RAID0阵列的chunk-size.使用 –l指定vgdisplay报告的卷组中逻辑卷可用的扩展.假设有500可用.示例为:
lvcreate –i 2 –I 64 –l 500 –n data test0
9. 使用ext3格式化/dev/test0/data ,作为条带的RAID阵列设置stride选项,
mke2fs –j –b 4096 –R stride=8 /dev/test0/data
10. 在/data加载/dev/md0/data. 把文件复制到/data,使用e2fsadm重设置尺寸.使用raidsetfaulty模拟磁盘损坏.(条带的逻辑卷在创建后可以重定义尺寸,只要不在另一个物理卷上使用这些扩展.)这样将得到RAID的冗余,条带的性能和LVM的灵活性.
Lab 9 X window系统
步骤一: 了解X的启动顺序
1. 创建并编辑/etc/X11/xinit/xinitrc.d/xeyes,加入以下行并设为可执行
#!/bin/sh
xeyes &
2. 切换到runlevel5
3. 使用显示管理器登录系统 gdm,kdm,xdm等.发生了什么?切换到虚拟控制台,运行
startx --:1
发生了什么? 为什么需要指定 -- :1?
4. 在创建的用户主目录下创建并编辑.xsession文件,增加以下行并设为可执行:
#!/bin/sh
xterm &
exec metacity
5. 使用这个帐户登录,发生什么? 使用这个帐户在虚拟控制台登录,并运行startx,发生了什么?
其他问题:
1. 列出升级视频卡的过程,包括选择卡的过程.
2. 描述当视频卡配置错误时,如何修复一个启动到runlevel5的系统.
Lab 10 系统修复和排故
目标: 熟悉系统修复的技巧
步骤一: 在rescue模式修复MBR
rescue模式提供了修复一个不能正常启动的系统的最后手段. 即使启动加载器或者根文件系统配置错误或损坏.进入该模式需要RedHat Linux的第一张光盘或者是网络路径的boot.iso镜像
任务.破坏GRUB使之不能启动.使用rescue模式重安装GRUB.
1. 使用以下命令,将MBR中的GRUB的第一部分用0覆盖.小心设置块尺寸.如果写入太多0,会覆盖分区表,造成的问题会大的多.(以下命令假设使用IDE设备)
dd if=/dev/zero of=/dev/had bs=446 count=1; reboot
恭喜---你的启动扇区已经破坏.不过你的主分区表还可用.重启确定系统不能启动.使用以下步骤修复系统.
2. 从光盘/软盘启动进入rescue模式. 当启动时输入 linux rescue
3. 修复环境将询问是否加载硬盘文件系统.选择继续.用读写模式加载.检查mount的输出保证文件系统加载正确.可以使用fdisk检查分区
mount
fdisk –l /dev/hda
4. 注意硬盘加载在/mnt/sysimage. 检查grub.conf文件确认配置正确.
cat /mnt/sysimage/boot/grub/grub.conf
5. 安装GRUB需要切换上下文,使/mnt/sysimage成为grub-install认为的系统的根.加载chroot shell, 运行grub-install, 退出.
Chroot /mnt/sysimage
grub-install /dev/had
exit
6. 输入exit退出rescue模式. 注意这会卸载加载的分区.
步骤二: 在rescue模式安装软件.
使用以下命令覆盖mount命令:
cp /bin/date /bin/mount
恭喜---你已经破坏了一个重要的执行文件. 重启动后你会发现系统不能启动.使用rescue模式,安装合适的rpm包.
1. 使用启动介质启动系统到rescue模式.
2. 系统会提示加载硬盘文件系统.使用mount检查是否正确加载.
3. 注意硬盘的文件系统加载在/mnt/sysimage. 查看哪个rpm包包含这个命令
rpm –qf --root /mnt/sysimage/bin/mount
4. 确认mount的rpm包,使用chroot安装rpm
chroot /mnt/sysimage
rpm –V mount
exit
5. rpm会报告/bin/mount被修改了.从网络重新安装mount包,要使用chroot
rpm –ivh --force --root /mnt/sysimage /mnt/source/RedHat/RPMS/mount*
6. 输入exit退出rescue模式. 注意这会卸载加载的分区.
感谢Sherrie和Donald ! 还有我的Mandy!
RHCE033实验(用户基础)
奉献Red Hat Linux 033 实验翻译(KevinZ)
--------------------------------------------------------------------------------
###请转贴时保留以下内容######
Red Hat Linux 033 实验部分
应广大RH爱好者的要求,奉献Red Hat Linux 033 实验翻译
请提出宝贵意见Mail:kissingwolf@hotmail.com
KevinZ(kissingwolf)
2004.3.4
#############################
Red Hat Linux 033 实验部分
试验3
文件和目录操作
估计时间: 1小时30分钟
目标: 熟悉函数、语法和一些基本的文件和目录的控制操作。
练习有效地组合这些命令完成一般的用户任务
试验的起点: 安装了Red Hat Linux可运行系统 ,有一个无特权用户student,密码:student
第一步:目录和文件组织
场景/情节
在您的home目录下有一系列的文件,您决定到时间整理一下了.您计划生成一些新的子目录,然后根据您的计划拷贝和移动这些文件到适当的目录;另外,这些文件不是都有用的,有一些是要删除掉的。
任务:
1. 以用户名student密码student在tty1上登陆。
2. 在您登陆系统以后,你将进入您的home目录.你可以使用"打印工作目录"检查这一情况
$ pwd
/home/student
3.使用如下每条命令检查您是否还有文件在您的home目录下:
$ ls
$ ls -a
$ ls –al
为什么第一和第二条命令返回不同的文件数?
第三条命令返回的在您当前的home目录下最大的文件是多少?
您的home目录下有子目录吗?
4. 您现在使用touch为以后的步骤建立文件。这种扩展在接下来的命令中是如何工作
的在以后的章节中进行讨论。现在,仅仅按照下面的行键入就行了(在集合与集合之间使用包括花括号{}和下划线的字符)
$ touch {report,memo,graph}_{sep,oct,nov,dec}_{a,b,c}{1,2,3}
5. 使用命令ls检查最后一条命令的结果,你会发现它在您的home目录下生成了108个
新的空文件(您不必数)。这些文件代表了您将使用的在这个步骤中的代表的数据文件。如果您看不到这些文件,向教师寻找帮助,没有这些文件,该试验后面的步骤就无法进行。
6. 为了组织您的文件,您必须先建立一些新目录,使用mkdir在您的home目录中直接
建立一些子目录:
$ mkdir a_reports
$ mkdir september october november december
再使用ls 检查您的工作。
7. 使用如下命令在您的一个新的目录中生成一些附加子目录
$ cd a_reports
为了切换到目录,接下来:
$ mkdir 1 2 3
使用ls检查你的子目录a_reports下的名为1,2,3的三个新的子目录。
8. 首先把所有带”b”的报告从home目录中移出并且按月份分组,先验证要使用的复杂的通配符模式,是个好方法。这样做以确保它对于正确的文件进行操作。如果你打算使用这种通配符模式,您可以使用一个无害的命令来替换您的命令。
$ cd
$ ls -l *dec?b?
你将看到列出了9个”december”,”b”文件,把其中的一个移到december目录中:
$ mv graph_dec_b1 december
用下面的语句移动其余的:
$ mv *dec?b? december
列出december目录的内容验证移动操作是否成功:
$ ls -l december
total 0
-rw-rw-r-- 1 student student 0 Sep 18 17:45 graph_dec_b1
-rw-rw-r-- 1 student student 0 Sep 18 17:45 graph_dec_b2
-rw-rw-r-- 1 student student 0 Sep 18 17:45 graph_dec_b3
-rw-rw-r-- 1 student student 0 Sep 18 17:45 memo_dec_b1
-rw-rw-r-- 1 student student 0 Sep 18 17:45 memo_dec_b2
-rw-rw-r-- 1 student student 0 Sep 18 17:45 memo_dec_b3
-rw-rw-r-- 1 student student 0 Sep 18 17:45 report_dec_b1
-rw-rw-r-- 1 student student 0 Sep 18 17:45 report_dec_b2
-rw-rw-r-- 1 student student 0 Sep 18 17:45 report_dec_b3
9.把其余所有带”b”的报告分别移动到各自对应的目录中:
$ mv *oct?b? october
$ mv *sep?b? september
10. 现在你将把”a”报告收集到它们各自对应的目录中。注意使用~代替 “你的home
目录”。通配符和模式的组合指定了您的home目录下所有以_a1结尾的文件。
$ cd a_reports
$ mv ~/*_a1 1/
“september””a1”文件陈旧并且不再需要,使用echo确定您已经建立了一个只匹配该类文件的模式,然后删除它们,并且检查剩下的”a1”文件是否正确移动:
$ cd 1
$ echo *sep*
$ rm *sep*
$ ls
graph_dec_a1 graph_oct_a1 memo_nov_a1 report_dec_a1 report_oct_a1 graph_nov_a1 memo_dec_a1 memo_oct_a1 report_nov_a1
11.最后移动”a2”和”a3”报告到各自对应的目录中。为了使过程变得有趣,我们将把
它们移出当前目录,使用相对和绝对的的路径名。第一步,使用pwd确定当前目录:
$ pwd
/home/student/a_reports/1
用echo检查涉及到”a2”文件的模式,然后使用绝对路径名:
$ echo /home/student/*a2*
$ mv /home/student/*a2* /home/student/a_reports/2
即使您当前在/home/student/a_reports/1目录下,也能把文件从/home/student移动到/home/student/a_reports/2目录中,因为您指定了文件的路径名称(在本例中为绝对路径名称)
现在使用相对路径移动“a3”文件。再一次的,首先确信模式指定的是正确的文件名称。
$ echo ../../*a3*
$ mv ../../*a3* ../3
12.返回您的home目录,并且使用ls 来校验仅存在该目录中的文件都是“c”文件(例如:graph_dec_c1,graph_dec_c2,…)
13.“c1”和“c2”报告文件对于每个月来说都非常重要,并且您打算把它们备份到另外一个目录:
$ mkdir /tmp/archive
$ cp report*[12] /tmp/archive/
另外的,所有的对于十二月份的报告文件应该备份到/tmp/archice目录下面。注意,-i选项使得cp程序在覆盖任何文件之前进行提示:
$ cp -i report_dec* /tmp/archive/
cp: overwrite `/tmp/archive/report_dec_c1'? n
cp: overwrite `/tmp/archive/report_dec_c2'? n
14.现在您备份了一些对您重要的“c”文件,您现在要删除位于您的home目录下面所有的文件。使用通配符“*c*”检查剩下的含有c的文件。您为什么不想执行命令rm *c* ?
(作为提示:尝试:ls *c*)
15.删除您的home目录下的剩余*c*文件。在发出一个破坏性的命令之前我们再次使用echo命令。
$ echo *c[1-3]
$ rm *c[1-3]
$ ls
a_reports december november october september
试验的结果
一个组织良好的home目录,文件放置在合理的位置,一些文件备份到了/tmp/archive目录中
第二步:决定磁盘的使用率
场景/情节
您想记录您的系统中的每一个文件系统总共有多少剩余空间。
另外,您想有一个关于哪些目录消耗了系统的多数的空间的列表。
任务
1. 使用df获取文件系统总的剩余空间,您的输出应该是类似于下面的例子(尽管输出
依赖于您的特定的安装,输出可能不同)
$ df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hdc2 14129568 1809728 11602096 14% /
/dev/hdc1 49743 8847 38328 19% /boot
none 63312 0 63312 0% /dev/shm
2.注意缺省的命令df操作是以块为单位报告信息,试用-h,-H选项,则是用 “用户可读的“形式报告
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 13G 1.8G 11G 14% /
/dev/hdc1 49M 8.7M 37M 19% /boot
none 62M 0 61M 0% /dev/shm
$ df -H
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 14G 1.9G 11G 14% /
/dev/hdc1 51M 9.1M 39M 19% /boot
none 65M 0 64M 0% /dev/shm
这两个开关有什么不同(使用man df)?
2. 在您的home目录使用du(磁盘使用率)命令来决定您所有的文件消耗的空间。确保尝试-h选项获得更可读的输出。
第三步:检视文本文件
任务
1.我们需要一个可供我们工作的文本文件:
$ cd
$ cp /usr/share/dict/words
.
2.使用cat显示文件:
$ cat words
Aarhus
Aaron
Ababa
…输出省略….
Zulu
Zulus
Zurich
3.在这种情况下cat是一个坏的选择,因为很多输出快速的滚屏,试用less:
$ less words
Aarhus
Aaron
Ababa
…输出省略…
abiding
Abidjan
Abigail
…输出省略…
使用less的时候,您可以向前翻页(使用b),向后翻页(使用空格键)在整个输出中,每次一屏.
4.如果你只需要快速的看看某个文件的最前几行和最后几行,你要使用head或者tail:
$ head words
Aarhus
Aaron
Ababa
aback
abaft
abandon
abandoned
abandoning
abandonment
abandons
$ tail words
zoologically
zoom
zooms
zoos
Zorn
Zoroaster
Zoroastrian
Zulu
Zulus
Zurich
您可以使用man帮助页面发现能使用head和tail中的哪个开关修改行号或是显示的行的相关的位置.
哪个命令你能使用显示文本的前50行?
哪个命令您能使用显示文件从第25,000行到结束的内容?
试验4
用户信息
估计时间: 30分钟
目标: 熟悉一些用户标识和帐户转换基本的控制操作。
试验的起点: 安装了Red Hat Linux可运行系统,并且是成功完成试验系统。有另外一个无特权用户visitor,密码:visitor帐户的存在。请教师检查您的系统中是否已经建立这个帐户。如果这个visitor用户帐户没有建立,按照以下步骤进行
1. 用root帐户登陆虚拟控制台。
2. 在提示符下键入以下命令
# useradd visitor
3. 现在键入
# passwd visitor
Changing password for user visitor.
New password: {输入visitor}
BAD PASSWORD: it is based on a dictionary word
Retype new password: {输入visitor}
passwd: all authentication tokens updated successfully.
第一步:本地用户登陆
任务:
1. 完全从工作站中退出。确定您已经推出所有虚拟终端和X Windows系统
2. 转换到虚拟终端1(tty1)通过按:
3. 使用密码redhat进入root帐号登陆您的工作站
4. 确定指定的登陆信息,使用下列命令:
# whoami
# groups
# id
检查这些命令的输出。
5.获取工作站当前所有登陆者信息,当前,应该只有一个用户登陆系统,按如下顺序键入的命令的输出是很有趣的。
# users
# who
# w
检查这些命令的输出。
6. 转换到虚拟终端2(tty2)通过按
7.以用户student,密码:student登陆你的工作站。
8.获取指定登陆者的信息,运行下列命令:
$ whoami
$ groups
$ id
检查这些命令的输出。
9.获取工作站上当前所有登陆者的信息:
$ users
$ who
$ w
检查这些命令的输出。
10. 转换到虚拟终端3(tty3)通过按
11. 以用户visitor,密码:visitor登陆你的工作站
12. 获取指定登陆者的信息,运行下列命令:
$ whoami
$ groups
$ id
检查这些命令的输出。
13. 获取工作站上当前所有登陆者的信息:
$ users
$ who
$ w
检查这些命令的输出。
步骤2:切换帐户
任务:
1. 按下如下的键切换到虚拟终端3(tty3)
2. 运行id命令来决定您的用户信息,pwd来喜爱能使您目前的工作目录
$ id
$ pwd
记录结果:
id=__________________________________________
pwd=_________________________________________
3. 使用su – 来切换到root用户,运行id和pwd来获取您的当前的目录
$ su –
# id
# pwd
记录结果:
id=__________________________________________
pwd=_________________________________________
4. 从root帐户退出,返回到visitor帐户
# exit
5. 使用不含 - 的su切换到root用户,运行pwd和id。
$ su
# id
# pwd
记录结果:
id=__________________________________________
pwd=_________________________________________
为什么和第3步骤的结果不同呢?
6.登出所有您在这个步骤中本地的和远程的shell。
试验6
Linux文件系统的要点
估计时间: 90分钟
目标: 深入了解linux文件系统知识,包括:创建和使用links,使用slocate和find,归档压缩文件。
试验的起点: 一个Red Hat Linux系统。
第一步:创建和使用links
任务:
1.在早些时候的试验,你已经拷贝了一个文件/usr/share/dict/words到你使用的用户student的主目录 ~/words.在这个案例里,你不需要编辑文件-拷贝一个文件到你的主目录就可以在试验的期间使用了。
2.为了要避免原始文件和副本之间的混乱。在student’s主目录中删除words的副本
$ cd
$ rm words
3.虽然你可能没有在那时了解它, 这个文件/usr/share/dict/words 的副本实际上是一个软link。列出内容下面目录 /usr/share/dict的内容查看link和它的参数。
$ ls –l /usr/share/dict
total 404
-rw-r—r-- 1 root root 409305 Apr 3 10:29 linux.words
lrwxrwxrwx 1 root root 11 Apr 20 17:33 words ->linux.words
a.你能告诉我words是一个软链接吗?
b.为什么words的文件大小是11?
c.words允许所有人访问。这和linux.words文件用什么冲突?除了root用户,其他用户能够能在linux.words上面写数据吗?
4.再一次列出文件,这次显示相应的indeds号。为什么两个文件会有相同或不同的inodes号?
$ ls –I /usr/share/dict
5. 现在在你的主目录中产生两个的代号和硬链接到/usr/share/dict/linux.words:
$ ln –s /usr/share/dict/linux.words soft
$ ln /usr/share/dict/linux.words hard
6. 测试一下,你新建的链接两者都指到 linux.words 文件:
$ head hard soft
7. 检查你所有文件的link , 然后在下面回答问题:
$ ls –il hard soft
$ stat had soft
报告文件大小,hard_______和soft_______.
被占用的真实的空间,hard_______和soft_______.
你怎样解释这两个link占用空间的差别。
列出链接的记数,hard_______和soft_______.
所有权,hard_______和soft_______.
文件硬链接的所有者和root用户可以完全访问,其他用户是只读权限。学生将会可以删除这个新的文件吗?为什么?
8. 更多的挑战:如果时间许可,探究一下下面的问题:
a.你能创建一个目标文件并不存在的软连接吗?看看ls命令的输出能否给你一些提示。
b.你能创建一个目标文件并不存在的软连接吗? 为什么?
c.你能创建一个软连接的硬连接吗? 当你尝试的时候有什么问题吗?
d.在创建了几个硬连接后,你能说出哪个是更加真实的文件吗?
步骤2:使用find命令
任务:
作为student登录。设计完成find命令提出结果
查看你当前的umask。设计并且运行find命令在每下列各项被描述的结果指令里。然后写下提供的空格里。
你可能需要在在find的man page里查许找。记得你能用/stringz man page里查找。
第一个答案已经为你列出。
1.在/var/lib目录下查找所有文件其所有者是games用户的文件
$ find /var/lib –user games 2> /dev/null
2.在/var目录下查找所有文件其所有者是root用户的文件。_________________________________________________________
3.查找所有文件其所有者不是root,bin和student用户并用长格式显示(如ls –l 的显示结果)。
_________________________________________________________
4.查找/usr/bin目录下所有大小超过一百万byte的文件并用长格式显示(如ls –l 的显示结果)。
_________________________________________________________
5.对/etc/mail目录下的所有文件使用file命令.
_________________________________________________________
6.查找/tmp目录下属于student的所有普通文件,这些文件的修改时间为120分钟以前,查询结果用长格式显示(如ls –l 的显示结果)。
_________________________________________________________
7. 对于查到的上述文件,用-ok选项删除。
_________________________________________________________
步骤3:归档和压缩
情景/故事:
你的系统上的主硬盘在你使用它的时候有可怕的噪音,但是它上面有有价值的数据。自从系统在两年半以前备份过,你有决定手动备份少数几个你最紧要的文件。那 / tmp 目录里储存在不同的硬盘的分区上快怀的分区,这样你想临时的把文件备份到那里。
任务:
1. 在/home目录里,用find命令定位文件所有者是student的文件。然后将其压缩。
$ find /home –user student –exec tar rvf /tmp/backup.tar {} \;
2. 保存/etc目录下的文件到/tmp目录下:
$ tar cvf /tmp/confbackup.tar /etc
3. 列出两个文件的大小
$ ls –lh /tmp/*.tar
-rw-rw-r-- 1 student student 1.9M Oct 17 23:06 /tmp/backup.tar
-rw-rw-r-- 1 student student 5.4M Oct 18 00:27 /tmp/confbackup.tar
backup.tar文件的大小________
confbackup.tar文件的大小________
4. 使用gzip压缩你的文档。然后报告文件的大小:
$ cd /tmp
$ gzip –v *.tar
$ ls –lh *tar*
-rw-rw-r-- 1 student student 580K Oct 17 23:06 backup.tar.gz
-rw-rw-r-- 1 student student 913K Oct 18 0:27 confbackup.tar.gz
backup.tar.gz文件大小为____________
backup.tar.gz文件的压缩百分比________
confbackup.tar.gz文件大小为____________
confbackup.tar.gz文件的压缩百分比________
5. 先解压缩bzip2文件然后在压缩,然后比较新文件的大小:
$ gunzip *.gz
$ ls –lh *tar
-rw-rw-r—1 1 student student 1.9M Oct 17 23:06 backup.tar
-rw-rw-r—1 1 student student 5.4M Oct 18 00:27 confbackup.tar
$ bzip2 –v *tar
$ ls –lh *tar
-rw-rw-r—1 1 student student 510K Oct 17 23:06 backup.tar.bz2
-rw-rw-r—1 1 student student 791K Oct 18 00:27 confbackup.tar.bz2
backup.tar.bz2文件大小为____________
backup.tar.bz2文件的压缩百分比________
confbackup.tar.bz2文件大小为____________
confbackup.tar.bz2文件的压缩百分比________
6. 在传统UNIX系统,
$ rm confbackup.tar.bz2
$ tar czf test1.tgz /etc
$ tar cjf test2.tbz /etc
$ file test*
test1.tgz:gzip compressed data,deflated,last modified:Wed Oct 18 01:52:11 2000,os:Unix
test2.tbz:bzip2 compressed data,block size = 900K
结果:
你的“重要数据”被压缩备份到/tmp目录里了。
问题答案2
2. find /var –user root –group mail 2>/dev/mull
3. find / -not –user root –not –user bin –not –user student –ls 2> /dev/null
or
find / ! –user root ! –user bin ! –user student –exec ls –ld {} \; 2> /dev/null
4. find /usr/bin –size +1000000c –ls 2> /dev/null
5. find /etc/maill –exec file {} \; 2 > /dev/null
6. find /tmp –user student –and –mmin +120 –and –type f –ls 2> /dev/null
7. find /tmp –user student –and –mmin +120 –and –type f –ok rm {} \;
(end)
试验7
bash Shell
估计时间: 45分钟
目标: 深入了解bash shell,包括创建定制。
试验的起点: 一个Red Hat Linux系统。
第一步:使用Aliases
任务:
1.你决定创建一个alias,当你使用cls的时候,系统能够运行clear命令清除你的屏幕。使用student身份在tty1登录,然后输入下列命令.
$ alias cls=‘clear’
$ alias
$ cls
2.当你重新登录的时候这个别名就丢失了。确信新的别名在用户student每次登录的时候都能够使用,可以执行一下几步。
$ cd
$ vi .bashrc
查找包含下列的文字:#User specific aliases and functions 添加到你的别名命令行:
alias cls=’clear’
保存并推出。
3.测试你的改变当你注销的时候,重新登录到tty1上的时候,试下面的命令:
$ alias
$ cls
4.现在使用ls 的man page 去创建一个叫lr的别名,利用ls的五个开关。测试并添加你的别名到.bashrc中.这个别名能够:
a)用长格式显示文件
b)显示隐含文件
c)给文件分类
d)用相反的顺序显示文件
e)按文件修改时间显示文件。
目标:
一条新的清屏命令和一条新的列文件命令。(都是别名)
步骤2:改变你的bash提示
情景/故事:
你决定定制你的bash提示以能够显示完全的路径和命令的序列号。
任务:
5. 在终端窗口,显示当前主要提示符的值。
$ echo $PS1
6. 改变你的提示符为一个字符串。
$ PS1=’Red Hat Linux ->’
7. 这个不常使用,因此恢复到有$提示符的情况下,同时加上主机名。
$ PS1=’\h $’
8. 在主机名和$符号之间插入bash表示历史纪录提示符的特殊字符 \!。
9. 查找bash 的man 手册,把当前的工作目录放入提示符中。
10. 你定制的提示符显示实例,如不同请继续修改。
station1:~ 21 $ cd /tmp
station1:/tmp 22 $
11. 编辑你重新定义的PS1 到你的.bashrc,然后打开新的终端窗口看看结果如何.
步骤3:配置shell选项
情景/故事:
使用set和shopt你定制几个bash shell 。
任务:
12.以student身份登录tty1界面上.查看许多普遍的配置shell选项:
$ set –o
allexport off
braceexpand on
emacs on
errexit off
hashall on
… output truncated …
13.察看目前ignoreeof的属性,用ctrl+d 键看是否能logout.
14.用student身份在tty1上登录,执行下面的改变,然后测试ignoreeof选项:
$ set –o ignoreeof
$
$ 用 “logout” 退出shell
$ set +o ignoreeof
$
15.当试图执行命令的时候可以看到提示信息.使用type的命令:
$ type cat
cat is hashed (/bin/cat)
$ type cls
cls is aliased to ‘clear’
$ type set
shopt is a shell builtin
$ type while
while is a shell keyword
结果:
现在你有一个更好的shell options.
问题答案4:命令替代
1. 确定完全路径名
$ which metacity
$ which
$ ^message^window-demo
2. 重复执行上一个包含字符串ig的命令:
$
3. 当一个命令在另一个命令的后面用(‘ ‘)起来的时候,bash会先执行后面的命令并把执行的结果作为第一个命令的输入. 使用这个技术,看看下面命令的执行结果.
$ ls –l ‘which nautilus‘
(end)
试验8
定制图形化界面
估计时间: 15分钟
目标: 探索Red hat liunx多种多样的图形化桌面环境..
试验的起点: 一个Red Hat Linux系统。
第一步:定制窗口管理
任务:
1.在你的桌面的左边点击Red Hat图标,选择”属性”然后点击”控制中心”.Nautilus 将打开显示的可以定制你的桌面环境的窗口.
2.双击”背景”图标.点击”选择图片”按钮,可用的图片在/usr/share/backgrounds 下,有一些图片作为墙纸很漂亮;你可以在”图片选项”中选择居中拉伸.
选择一个你喜欢的,或者选”没有图片”然后你可以使用”背景风格”颜色和属性.当你完成的后,关闭”背景属性”对话框.
3. 双击”鼠标”的图标, 这个参数面板你能够调整双击的时间延迟,速度和灵敏度 .
假如你伸左撇子,你也可以在这里选择左收习惯
当完成后选择关闭”鼠标属性”对话框.
4. 打开”桌面主题”面板.你可以选择一个主题,默认的主题是”Bluecurve”.选一个你喜欢的,然后关闭这个面板.
5. 最后,打开”工具栏”,你能够选择你可以选择下列特性中的一个:显示工具条,或小的图标.然后关闭面板.
目标:
Red Hat Linux的桌面环境已经按你的要求定制好了。
试验9
标准输入输出和管道
估计时间: 30分钟
目标: 熟悉Red Hat Linux中的标准输入输出和管道
试验的起点: 标准的Red Hat Linux安装
步骤1:标准输入和输出
任务:
1. 使用你熟悉的编辑器创建两个文件:
packages1.txt 应该包含以下八行:
amanda
galleon
metacity
mozilla
postgresql
procinfo
rpmfind
squid
packages2.txt应该包含以下6行
anaconda
openssh
gnome-core
samba
sendmail
xscreensaver
2. cat工具是最简单的linux过滤器,它会默认把跟在后面的参数当作文件名,并把这个文件作为输入,如果没有文件名则把标准的输入作为自己的输入,然后将它们发送到标准的输出上去。现在我们来实验一下:
$cat packages1.txt
3. 如果cat后没有参数,则它会等待标准的输入,所以当你输入cat命令后,再回车,然后什么也没有显示。输入cat后,cat命令会监视标准输入,等待输入的到达。如果这个时候输入一些文本,再按回车,cat就会把输入的内容当作自己的输入,然后输出到标准的输出——显示器上,结束cat的命令为按下ctrl-d,这是结束输入的标志。
$ cat
输入一些文字,然后按回车。
^d (就是按ctrl-d)
4. 大多数的文本处理命令是执行过滤操作,他们可以读标准输入,对输入做一些动作,然后把结果发送到标准输出去。这些命令就向cat一样,只是对输入的处理不太一样。
tr命令,也是过滤器命令,如果给tr后加两个字符串做为参数,它会读取标准输入,然后把输入中包含着前一个字符串的字符变成第二个字符串,然后输出到标准输出去。
把刚才的命令换成tr,tr将把字符串中有的字符变成大写的。
$ tr 'aeiou' 'AEIOU'
输入一些文字,然后按回车。
^d
5. 定义shell不要把命令的输出发到标准输出上,而是重定向到一个文件中,我们使用 > 来重定向
重复cat的例子重定向标准的输出到packages1.catfile,这样把输出到屏幕的东西输出到了文件中,效果就和重新copy了一份文件是一样的,cat这个输出文件,然后用diff和ls确认原文件与package1.catfile内容一样。
$ cat packages1.txt > packages1.catfile
$ cat packages1.catfile
$ diff packages1.txt packages1.catfile
$ ls –l packages1*
6. 使用>>来重定向会把输出附加到已存在的文件的末尾。
把packages2.txt文件中的内容附加到packages1.catfile之后,然后检验结果。
$ cat packages2.txt >> packages1.catfile
$ cat packages1.catfile
7. 如果输出重定向时cat没有直接跟文件名的参数,那么cat就会等待标准的输入,直到按下ctrl-d作为结束,然后把所有输入的东西重定向到这个文件中去。这样可以很容易的创建一个文本文件,
$ cat > typedin.txt
This time, when text is typed at the keyboard,
It is not echoed back to the screen.
Instead, it is redirected to the file typedin.txt.
^d
$ ls –l typedin.txt
$ cat typedin.txt
8. 使用tr取代cat,重复刚才的命令
$ tr 'aeiou' 'AEIOU' > trfile.txt
This time, when text is typed at the keyboard,
It is not echoed back to the screen.
Instead, it is redirected to the file typedin.txt.
^d
$ ls –l trfile.txt
$ cat trfile.txt
9. 使用set –o命令,确认显示出目前bash的noclobber选项是关闭状态,确认当输出重定时向你可以重写文件
$ set –o
$ ls –l /tmp > trifle.txt
$ ls –l trfile.txt
$ cat trifle.txt
10. 使用set命令更改noclobber选项,如下操作:
$ set –o noclobber
$ echo “new contents” > trfile.txt
bash: trfile.txt:cannot overwrite existing file
11. cat可以接受一个文件名或者是一个输入重定向的文件,测试以下两个命令:
$ cat packages1.txt
$ cat < packages1.txt
12. 但是tr不能接受文件名作为参数,它只希望输入是标准输入。
$ tr 'aeiou' 'AEIOU' < packages1.txt
13. 下面的例子中标准输入和输出都被重定向,输入还是packages1.txt文件,这回改为输出到文件packages1.trfile.txt中去了。
$ tr 'aeiou' 'AEIOU' < packages1.txt >packages1.trfile.txt
$ ls –l packages1.txt packages1.trfile.txt
$ cat packages1.trfile.txt
步骤2:管道
1. 把一个命令的标准输出直接传输给另一个命令作为它的标准输入,这样特殊的机制叫做管道。
如果没有管道,你要想打印你的目录中文件的列表至少要两步,还需要把没用的文件删除,(lpr命令可以把文件的内容发给默认的打印机,它的用法会在第12章讲)(注意只有当你没有打印机时可以使用以下的例子)
$ ls –l > /tmp/ls.txt
$ lpr /tmp/ls.txt
$ rm /tmp/ls.txt
使用管道,这些命令可以仅仅用以下短短的一条命令,将ls –l的输出直接发送给lpr作为输入,lpr也不需要别的参数。
$ ls –l | lpr
2. 管道经常的用法是一个命令产生了很多页的输出,可以把这些输出直接给less,管道左边是你的命令,右边是less,less不需要参数。(空格键是翻页,q键是退出less)
$ ls –l /usr/bin | less
步骤3:练习
答案在下面,可以使用man page来帮助你解决问题
1. 拷贝一份cal命令的man page,放在你的主目录下,取名叫cal.man。
2. 只在一行上输入什么样的命令,可以使你从键盘上输入的文本输出到打印机上
3. 怎样把/usr/bin下以c或d开头的文件列表发送到打印机上?
步骤3:练习-答案
1. man cal > cal.man
2. lpr
lpr打印出以后面的参数命名的文件中的内容,如果没有参数,lpr就会从标准输入中读取,标准的输入是键盘,直到你按下ctrl-d表示键盘输入结束。
3.ls –l /usr/bin/[cd]* | lpr
试验10
字符串处理
估计时间: 60分钟
目标: 熟悉字符串处理
试验的起点: 一个Red Hat Linux系统,把/etc/passwd拷贝到你的主目录下。
第一步:字符串处理基本知识
任务:
1..拷贝/etc/passwd到你的主目录下:
$ cd
$ cp /etc/passwd
2. 在/etc/passwd里面有系统里的每一个帐户.使用wc,在passwd文件里计算有多少行。
$ wc –l passwd
在你的系统里有多少个帐户____________
3. 找出本机中所有用户使用的各种shell并把其放置在一个文件内:
$ cut –d: -f7 passwd > shells
4. 使用cat命令查看你新的shells文件的内容,为了使输出结果更为友好.用sort命令输出这些数据在一个新的文件里:
$ sort shells > sorted.shells
5. 你的文件包含许多同样的内容.使用uniq命令可以计算出有多少个相同的行:
$ uniq –c sorted.shells > uniq.sorted.shells
为什么在使用uniq之前要使用sort命令
6. 按照数字由大到小的顺序列出在你的机器上使用的各种shell:
$ sort –nr uniq.sorted.shells
i. /sbin/nologin
6 /bin/bash
1 /sbin/shutdown
1 /sbin/halt
1 /bin/sync
结果:
按照数字由大到小的顺序列出你机器上所有用户使用的各种shell:
步骤2:更多的练习
为每一个练习写下解决办法.记住,答案是一个你想出办法的命令,不是输出.答案在实验的最后被列出来了,但是在对答案之前,你可以试着完成每个任务.每个答案将显示单独的一行.这个命令aspell没有man page;你将怎样获得帮助呢?
7. 有多少文件在/usr/bin目录下?输出是一个单一的整数.提示:设计一个命令列出文件名到每一行,然后计算一共有多少行.
__________________________________________________________
8. 列出下列文件/usr/share/doc/nautilus-*/NEWS中拼错的单词.
__________________________________________________________
12. 多少唯一的单词从上述练习中输出?
__________________________________________________________
步骤2答案:
1 ls –1 /usr/bin | wc -l (注意ls 的参数是数字1)
2 aspell –l < /usr/shar/doc/nautilus-*/NEWS
3 aspell –l < /usr/share/doc/nautilus-*/NEWS | sort | uniq | wc -l
试验11
使用正则表达式进行字符处理
估计时间: 60分钟
目标: 熟悉Red Hat Linux中进行字符处理的几个工具
试验的起点: 安装Red Hat Linux,并且能正常工作,拷贝 /etc/passwd到
你的主目录中
步骤1:使用grep进行字符处理
任务:
1. 在copy到你主目录中的/etc/passwd文件的副本中,使用grep显示出所有以“g”开头的帐户:
2. 显示出所有使用bash shell的帐户:
$ grep ‘bash$’ passwd
3. 显示出没有使用bash作为shell的帐户:
$ grep –v ‘bash$’ passwd
4. 为了做一个使用diff的例子,我们要更改这个passwd文件的拷贝,先用grep把原文件中所有含有“N”和“P”的行删除:
$ grep –v ‘[NP]’ passwd > modified.passwd
5. 最后再用tr将含有的所有大写字母变成小写:
$ tr “A-Z” “a-z” < modified.passwd > modified2.passwd
6. 这时使用cat命令看原来的passwd文件和改过的modified2.passwd文件,不仔细看看不出其中的区别,这只是小文件,如果文件大一些,想象一下拥有几千个用户的文件。使用diff可以产生两个文件中不同之处的列表。
$ diff modified2.passwd passwd
14a15,16
> ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
> nobody:x:99:99:Nobody:/:/sbin/nologin
… …
步骤2:正则表达式及字符处理
在任务下面的横线上写下你的解决方案,你要写出你的命令而不是命令的输出,答案在实验最后,但是要先试着自己解决,可以使用man page来帮助你解决问题。
任务:
1. 使用grep显示出/usr/share/dict/words文件中还有某参数的行,例如显示出所有含有fish的行:
$ grep fish /usr/share/dict/words
blowfish
bluefish
codfish
… output truncated …
unselfish
unselfishly
unselfishness
2. 使用grep的man page作为帮助,输出任何包含fish的所有行,还要输出紧接着这行的上下各两行的内容:
—————————————————————————————————————
3. 使用grep的man page作为帮助,找出相应的命令,来显示出在words文件中有多少行含有fish。
—————————————————————————————————————
4. 使用grep的帮助文件,找出相应的命令,显示出那些行含有fish,并将行号一块输出,看一看starfish在哪行?
—————————————————————————————————————
5. 想列出/usr/share/dict/words中包含先有字母t然后有一个元音字母,之后是sh的单词,命令为:
—————————————————————————————————————
6. 在/usr/share/dict/words文件中,创建可以符合abominable,abominate,anomie和atomize的正则表达式,但是不要选到别的单词。
—————————————————————————————————————
7. 在/usr/share/dict/words文件中包含多少先有字母t然后有一个元音字母,之后是sh的单词,只输出数量。
—————————————————————————————————————
8. 列出/usr/share/dict/words中刚好包含16个字母的单词:
—————————————————————————————————————
9. 我们将要使用/usr/share/doc文件夹来完成我们的下几个任务。
列出/usr/share/doc/bash-2.05b文件夹中,所有包含单词expansion的文件,
—————————————————————————————————————
10. 显示出“Linux”在/usr/share/doc/bash-2.05b文件夹的文件中出现的次数,但是不要显示没有这个单词的文件。提示:先列出所有的文件,然后想如何使输出符合要求:
—————————————————————————————————————
11. 列出所有包含Havoc的文件名:
—————————————————————————————————————
步骤3:使用正则表达进行文本流编辑
任务:
想象你创建一个了名叫“cats”的文件包含以下单词:
cat
catalog
concatenate
polecat
Cat
猜想执行以下每个sed命令之后,把cats文件的每一行的执行后的结果写在后面:
1. sed 's/cat/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
2. sed 's/[Cc]at/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
3. sed 's/\<[Cc]cat/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
4. sed 's/[Cc]at\>/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
5. sed 's/\<[Cc]at\>/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
6. sed 's/\<[Cc]at\>/& and dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
7. 创建一个'cats'文件,运行sed命令,测试你的答案。
步骤2的答案:
2.grep –B2 –A2 "fish" /usr/share/dict/words
3.grep –c "fish" /usr/share/dict/words
4.grep –n "fish" /usr/share/dict/words
5.grep "t[aeiou]sh" /usr/share/dict/words
6. "^a.omi.*e$"
或
"\
诀窍是判断哪些字母是变化的哪些是不变的,注意想代替任意个任意字符要使用 “.*”。
7.grep –c "t[aeiou]sh$" /usr/share/dict/words
8.grep "^…………….$" /usr/share/dict/words
或者:
grep –c "^.\{16\}$" /usr/share/dict/words
9.grep –l expansion /usr/share/doc/bash-2.05b/*
10.grep –c "Linux" /usr/share/doc/bash-2.05b/* |grep –v ":0"
11.grep –R –l "Havoc" /usr/share/doc
试验12
进程控制
估计时间: 30分钟
目标: 练习与进程控制有关的不同命令
试验的起点: 安装Red Hat Linux,并且能正常工作,有一个用户名和密
码都为student的用户
步骤1:进程控制
场景描述:
在这个任务中,大家会启用几个进程,然后使用bash的进程控制方法来控制它们。你将会在几个控制台间切换,注意你在哪个控制台上运行命令。
任务:
1. 开始使用student用户在第一、二个控制台(tty1、tty2)上登陆
2. 到tty1上,然后运行以下命令:
$ (while true; do echo –n A >> log; sleep 1;done)
3. 注意这个控制台现在因为在运行你的进程,所以处于忙的状态(进程在前台运行),这个进程不断把字母“A”添加进~/log文件中去,到tty2上运行以下命令:
$ tail –f log
你会看到“A”不断增长
4. 切换回控制台tty1,按下
5. 回到tty1,再次启动进程,运行jobs会显示job[1]在运行了,到tty2上看到文件继续增长了:
$ bg
$ jobs
6. 到tty1上,按向上的箭头,重新找回第二步时的命令,把A换成B,在最后加上&,然后在把B换成C:
$ (while true; do echo –n B >> log; sleep 1;done)
$ ^B^C
7. 输入jobs确认三个进程都在运行,到tty2上看到每秒钟会有三个字母增长。
8. 在第4步你按ctrl-z时,实际上是给进程发一个信号,使用kill命令也可以给它们发信号,使用kill来显示信号列表和标号,然后发一个SIGSTOP(19)的信号给job[1],到tty1上执行:
$ kill –l
$ kill -19 %1
9. 输入jobs,确认job[1]停止,到tty2上看结果是否停止。
10. 用kill重新启动进程,使用SIGCONT(18)信号,你会看到进程又重新启动了。(参考第8步的实现方法)
11. 使用kill命令的SIGTERM(15)信号,也是kill的默认信号,来结束三个进程,先结束job[2]和job[3]时,用jobs来看一下它们的状态是不是terminated的:
$ kill %2 %3
$ jobs
12. 结束最后的进程:
$ fg
$
13. 在tty1上使用jobs命令来看一下,然后在tty2上看是否进程真的结束了,然后按
14. 在tty1上删除 ~/log文件
试验13
用户信息
估计时间: 1小时
目标: 熟练掌握vi的控制操作。
试验的起点: 安装了Red Hat Linux可运行系统,安装vim-common、
vim-minimal、vim-enhanced 的rpm 包
在提示符下键入: vimtutor
你会看到英文的试验教程
第一讲第一节∶移动光标
※※ 要移动光标,请依照说明分别按下 h、j、k、l 键。 ※※
^
k 提示∶ h 的键位于左边,每次按下就会向左移动。
< h l > l 的键位于右边,每次按下就会向右移动。
j j 键看起来很象一支尖端方向朝下的箭头。
v
1. 请随意在屏幕内移动光标,直至您觉得舒服为止。
2. 按下下行键(j),直到出现光标重复下行。
---> 现在您应该已经学会如何移动到下一讲吧。
3. 现在请使用下行键,将光标移动到第二讲。
提示∶如果您不敢确定您所按下的字母,请按下
然后再次从键盘输入您想要的命令。
提示∶光标键应当也能正常工作的。但是使用hjkl键,在习惯之后您就能够快速
地在屏幕内四处移动光标了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第二节∶VIM的进入和退出
!! 特别提示∶敬请阅读完整本一节的内容,然后才能执行以下所讲解的命令。
1. 请按
2. 然后输入∶ :q! <回车>
---> 这种方式的退出编辑器绝不会保存您进入编辑器以来所做的改动。
如果您想保存更改再退出,请输入∶
:wq <回车>
3. 如果您看到了命令行提示符,请输入能够带您回到本教程的命令,那就是∶
vimtutor <回车>
通常情况下您也可以用这种方式∶
vim tutor <回车>
---> 这里的 'vim' 表示进入vim编辑器,而 'tutor'则是您准备要编辑的文件。
4. 如果您自信已经牢牢记住了这些步骤的话,请从步骤1执行到步骤3退出,然
后再次进入编辑器。接著将光标移动到第一讲第三节来继续我们的教程讲解。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第三节∶文本编辑之删除
** 在正常(Normal)模式下,可以按下 x 键来删除光标所在位置的字符。**
1. 请将光标移动到本节中下面标记有 ---> 的那一行。
2. 为了修正输入错误,请将光标移至准备删除的字符的位置处。
3. 然后按下 x 键将错误字符删除掉。
4. 重复步骤2到步骤4,直到句子修正为止。
---> The ccow jumpedd ovverr thhe mooon.
5. 好了,该行已经修正了,下一节内容是第一讲第四节。
特别提示∶在您浏览本教程时,不要强行记忆。记住一点∶在使用中学习。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第四节∶文本编辑之插入
** 在正常模式下,可以按下 i 键来插入文本。**
1. 请将光标移动到本节中下面标记有 ---> 的第一行。
2. 为了使得第一行内容雷同于第二行,请将光标移至文本第一个字符准备插入
的位置。
3. 然后按下 i 键,接著输入必要的文本字符。
4. 所有文本都修正完毕,请按下
重复步骤2至步骤4以便修正句子。
---> There is text misng this .
---> There is some text missing from this line.
5. 如果您对文本插入操作已经很满意,请接著阅读下面的小结。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲小结
1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键。
h (左移) j (下行) k (上行) l (右移)
2. 欲进入vim编辑器(从命令行提示符),请输入∶vim 文件名 <回车>
3. 欲退出vim编辑器,请输入以下命令放弃所有修改∶
或者输入以下命令保存所有修改∶
4. 在正常模式下删除光标所在位置的字符,请按∶ x
5. 在正常模式下要在光标所在位置开始插入文本,请按∶
i 输入必要文本
特别提示∶按下
的命令。
好了,第一讲到此结束。下面接下来继续第二讲的内容。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第一节∶删除类命令
** 输入 dw 可以从光标处删除至一个单字/单词的末尾。**
1. 请按下
2. 请将光标移动到本节中下面标记有 ---> 的那一行。
3. 请将光标移至准备要删除的单词的开始。
4. 接著输入 dw 删除掉该单词。
特别提示∶您所输入的 dw 会在您输入的同时出现在屏幕的最后一行。如果您输
入有误,请按下
---> There are a some words fun that don't belong paper in this sentence.
5. 重复步骤3至步骤4,直至句子修正完毕。接著继续第二讲第二节内容。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第二节∶其他删除类命令
** 输入 d$ 从当前光标删除到行末。**
1. 请按下
2. 请将光标移动到本节中下面标记有 ---> 的那一行。
3. 请将光标移动到该行的尾部(也就是在第一个点号‘.’后面)。
4. 然后输入 d$ 从光标处删至当前行尾部。
---> Somebody typed the end of this line twice. end of this line twice.
5. 请继续学习第二讲第三节就知道是怎么回事了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第三节∶关于命令和对象
删除命令 d 的格式如下∶
[number] d object 或者 d [number] object
其意如下∶
number - 代表执行命令的次数(可选项,缺省设置为 1 )。
d - 代表删除。
object - 代表命令所要操作的对象(下面有相关介绍)。
一个简短的对象列表∶
w - 从当前光标当前位置直到单字/单词末尾,包括空格。
e - 从当前光标当前位置直到单字/单词末尾,但是 *不* 包括空格。
$ - 从当前光标当前位置直到当前行末。
特别提示∶
对于勇于探索者,请在正常模式下面仅按代表相应对象的键而不使用命令,则
将看到光标的移动正如上面的对象列表所代表的一样。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第四节∶对象命令的特殊情况
** 输入 dd 可以删除整一个当前行。 **
鉴于整行删除的高频度,VIM 的设计者决定要简化整行删除,仅需要在同一行上
击打两次 d 就可以删除掉光标所在的整行了。
1. 请将光标移动到本节中下面的短句段落中的第二行。
2. 输入 dd 删除该行。
3. 然后移动到第四行。
4. 接著输入 2dd (还记得前面讲过的 number-command-object 吗?) 删除两行。
1) Roses are red,
2) Mud is fun,
3) Violets are blue,
4) I have a car,
5) Clocks tell time,
6) Sugar is sweet
7) And so are you.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第五节∶撤消类命令
** 输入 u 来撤消最后执行的命令,输入 U 来修正整行。**
1. 请将光标移动到本节中下面标记有 ---> 的那一行,并将其置于第一个错误
处。
2. 输入 x 删除第一个不想保留的字母。
3. 然后输入 u 撤消最后执行的(一次)命令。
4. 这次要使用 x 修正本行的所有错误。
5. 现在输入一个大写的 U ,恢复到该行的原始状态。
6. 接著多次输入 u 以撤消 U 以及更前的命令。
7. 然后多次输入 CTRL-R (先按下 CTRL 键不放开,接著输入 R 键) ,这样就
可以执行恢复命令,也就是撤消掉撤消命令。
---> Fiix the errors oon thhis line and reeplace them witth undo.
8. 这些都是非常有用的命令。下面是第二讲的小结了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲小结
1. 欲从当前光标删除至单字/单词末尾,请输入∶dw
2. 欲从当前光标删除至当前行末尾,请输入∶d$
3. 欲删除整行,请输入∶dd
4. 在正常模式下一个命令的格式是∶
[number] command object 或者 command [number] object
其意是∶
number - 代表的是命令执行的次数
command - 代表要做的事情,比如 d 代表删除
object - 代表要操作的对象,比如 w 代表单字/单词,$ 代表到行末等等。
$ (to the end of line), etc.
5. 欲撤消以前的操作,请输入∶u (小写的u)
欲撤消在一行中所做的改动,请输入∶U (大写的U)
欲撤消以前的撤消命令,恢复以前的操作结果,请输入∶CTRL-R
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第一节∶置入类命令
** 输入 p 将最后一次删除的内容置入光标之后 **
1. 请将光标移动到本节中下面示范段落的首行。
2. 输入 dd 将该行删除,这样会将该行保存到vim的缓冲区中。
3. 接著将光标移动到准备置入的位置的上方。记住∶是上方哦。
4. 然后在正常模式下(
5. 重复步骤2至步骤4,将所有的行依序放置到正确的位置上。
d) Can you learn too?
b) Violets are blue,
c) Intelligence is learned,
a) Roses are red,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第二节∶替换类命令
** 输入 r 和一个字符替换光标所在位置的字符。**
1. 请将光标移动到本节中下面标记有 ---> 的第一行。
2. 请移动光标到第一个错误的适当位置。
3. 接著输入 r ,这样就能将错误替换掉了。
4. 重复步骤2和步骤3,知道第一行是已经修改完毕。
---> Whan this lime was tuoed in, someone presswd some wrojg keys!
---> When this line was typed in, someone pressed some wrong keys!
5. 然后我们继续学校第三讲第三节。
特别提示∶切记您要在使用中学习,而不是在记忆中学习。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第三节∶更改类命令
** 要改变一个单字/单词的部分或者全部,请输入 cw **
1. 请将光标移动到本节中下面标记有 ---> 的第一行。
2. 接著把光标放在单词 lubw 的字母 u 的位置那里。
3. 然后输入 cw 就可以修正该单词了(在本例这里是输入 ine 。)
4. 最后按
5. 重复步骤3和步骤4,知道第一个句子完全雷同第二个句子。
---> This lubw has a few wptfd that mrrf changing usf the change command.
---> This line has a few words that need changing using the change command.
提示∶请注意 cw 命令不仅仅是替换了一个单词,也让您进入文本插入状态了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第四节∶使用c指令的其他更改类命令
** 更改类指令可以使用同删除类命令所使用的对象参数。**
1. 更改类指令的工作方式跟删除类命令是一致的。操作格式是∶
[number] c object 或者 c [number] object
2. 对象参数也是一样的,比如 w 代表单字/单词,$代表行末等等。
3. 请将光标移动到本节中下面标记有 ---> 的第一行。
4. 接著将光标移动到第一个错误处。
5. 然后输入 c$ 使得该行剩下的部分更正得同第二行一样。最后按
---> The end of this line needs some help to make it like the second.
---> The end of this line needs to be corrected using the c$ command.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲小结
1. 要重新置入已经删除的文本内容,请输入小写字母 p。该操作可以将已删除
的文本内容置于光标之后。如果最后一次删除的是一个整行,那么该行将置
于当前光标所在行的下一行。
2. 要替换光标所在位置的字符,请输入小写的 r 和要替换掉原位置字符的新字
符即可。
3. 更改类命令允许您改变指定的对象,从当前光标所在位置直到对象的末尾。
比如输入 cw 可以替换当前光标到单词的末尾的内容;输入 c$ 可以替换当
前光标到行末的内容。
4. 更改类命令的格式是∶
[number] c object 或者 c [number] object
下面我们继续学习下一讲。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第一节∶定位及文件状态
** 输入 CTRL-g 显示当前编辑文件中当前光标所在行位置以及文件状态信息。
输入 SHIFT-G 则直接跳转到文件中的某一指定行。**
提示∶切记要先通读本节内容,之后才可以执行以下步骤!!!
1. 按下 CTRL 键不放开然后按 g 键。然后就会看到页面最底部出现一个状态信
息行,显示的内容是当前编辑的文件名和文件的总行数。请记住步骤3的行号。
2. 按下 SHIFT-G 键可以使得当前光标直接跳转到文件最后一行。
3. 输入您曾停留的行号,然后按下 SHIFT-G。这样就可以返回到您第一次按下
CTRL-g 时所在的行好了。注意∶输入行号时,行号是不会在屏幕上显示出来
的。
4. 如果愿意,您可以继续执行步骤1至步骤三。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第二节∶搜索类命令
** 输入 / 以及尾随的字符串可以用以在当前文件中查找该字符串。**
1. 在正常模式下输入 / 字符。您此时会注意到该字符和光标都会出现在屏幕底
部,这跟 : 命令是一样的。
2. 接著输入 errroor <回车>。那个errroor就是您要查找的字符串。
3. 要查找同上一次的字符串,只需要按 n 键。要向相反方向查找同上一次的字
符串,请输入 Shift-N 即可。
4. 如果您想逆向查找字符串,请使用 ? 代替 / 进行。
---> When the search reaches the end of the file it will continue at the start.
"errroor" is not the way to spell error; errroor is an error.
提示∶如果查找已经到达文件末尾,查找会自动从文件头部继续查找。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第三节∶配对括号的查找
** 按 % 可以查找配对的括号 )、]、}。**
1. 把光标放在本节下面标记有 --> 那一行中的任何一个 (、[ 或 { 处。
2. 接著按 % 字符。
3. 此时光标的位置应当是在配对的括号处。
4. 再次按 % 就可以跳回配对的第一个括号处。
---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
提示∶在程序调试时,这个功能用来查找不配对的括号是很有用的。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第四节∶修正错误的方法之一
** 输入 :s/old/new/g 可以替换 old 为 new。**
1. 请将光标移动到本节中下面标记有 ---> 的那一行。
2. 输入 :s/thee/the <回车> 。请注意该命令只改变光标所在行的第一个匹配
串。
3. 输入 :s/thee/the/g 则是替换全行的匹配串。
---> the best time to see thee flowers is in thee spring.
4. 要替换两行之间出现的每个匹配串,请输入 :#,#s/old/new/g (#,#代表的是
两行的行号)。输入 :%s/old/new/g 则是替换整个文件中的每个匹配串。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲小结
1. Ctrl-g 用于显示当前光标所在位置和文件状态信息。Shift-G 用于将光标跳
转至文件最后一行。先敲入一个行号然后按 Shift-G 则是将光标移动至该行
号代表的行。
2. 输入 / 然后紧随一个字符串是则是在当前所编辑的文档中向后查找该字符串。
输入问号 ? 然后紧随一个字符串是则是在当前所编辑的文档中向前查找该字
符串。完成一次查找之后按 n 键则是重复上一次的命令,可在同一方向上查
找下一个字符串所在;或者按 Shift-N 向相反方向查找下该字符串所在。
3. 如果光标当前位置是括号(、)、[、]、{、},按 % 可以将光标移动到配对的
括号上。
4. 在一行内替换头一个字符串 old 为新的字符串 new,请输入 :s/old/new
在一行内替换所有的字符串 old 为新的字符串 new,请输入 :s/old/new/g
在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g
在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g
进行全文替换时询问用户确认每个替换需添加 c 选项,请输入 :%s/old/new/gc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第一节∶在 VIM 内执行外部命令的方法
** 输入 :! 然后紧随著输入一个外部命令可以执行该外部命令。**
1. 按下我们所熟悉的 : 命令设置光标到屏幕底部。这样就可以让您输入命令了。
2. 接著输入感叹号 ! 这个字符,这样就允许您执行外部的 shell 命令了。
3. 我们以 ls 命令为例。输入 !ls <回车> 。该命令就会列举出您当前目录的
内容,就如同您在命令行提示符下输入 ls 命令的结果一样。如果 !ls 没起
作用,您可以试试 :!dir 看看。
---> 提示∶ 所有的外部命令都可以以这种方式执行。
---> 提示∶ 所有的 : 命令都必须以 <回车> 告终。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第二节∶关于保存文件的更多信息
** 要将对文件的改动保存到文件中,请输入 :w FILENAME 。**
1. 输入 :!dir 或者 :!ls 获知当前目录的内容。您应当已知道最后还得敲
<回车> 吧。
2. 选择一个尚未存在文件名,比如 TEST 。
3. 接著输入 :w TEST (此处 TEST 是您所选择的文件名。)
4. 该命令会以 TEST 为文件名保存整个文件 (VIM 教程)。为了确保正确保存,
请再次输入 :!dir 查看您的目录列表内容。
---> 请注意∶如果您退出 VIM 然后在以文件名 TEST 为参数进入,那么该文件内
容应该同您保存时的文件内容是完全一样的。
5. 现在您可以通过输入 :!rm TEST 来删除 TEST 文件了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第三节∶一个具有选择性的保存命令
** 要保存文件的部分内容,请输入 :#,# w FILENAME **
1. 再来执行一次 :!dir 或者 :!ls 获知当前目录的内容,然后选择一个合适的
不重名的文件名,比如 TEST 。
2. 接著将光标移动至本页的最顶端,然后按 CTRL-g 找到该行的行号。别忘了
行号哦。
3. 接著把光标移动至本页的最底端,再按一次 CTRL-g 。也别忘了这个行好哦。
4. 为了只保存文章的某个部分,请输入 :#,# w TEST 。这里的 #,# 就是上面
要求您记住的行号(顶端行号,底端行号),而 TEST 就是选定的文件名。
5. 最后,用 :!dir 确认文件是否正确保存。但是这次先别删除掉。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第四节∶提取和合并文件
** 要向当前文件中插入另外的文件的内容,请输入 :r FILENAME **
1. 请键入 :!dir 确认您前面创建的 TEST 文件还在。
2. 然后将光标移动至当前页面的顶端。
特别提示∶ 执行步骤3之后您将看到第五讲第三节,请届时再往下移动回到这里来。
3. 接著通过 :r TEST 将前面创建的名为 TEST 的文件提取进来。
特别提示∶您所提取进来的文件将从光标所在位置处开始置入。
4. 为了确认文件已经提取成功,移动光标回到原来的位置就可以注意有两份第
五讲第三节,一份是原本,另外一份是来自文件的副本。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲小结
1. :!command 用于执行一个外部命令 command。
请看一些实际例子∶
:!dir - 用于显示当前目录的内容。
:!rm FILENAME - 用于删除名为 FILENAME 的文件。
2. :w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文
件中。
3. :#,#w FILENAME 可将当前编辑文件第 # 行至第 # 行的内容保存到文件
FILENAME 中。
4. :r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置
后面。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第一节∶打开类命令
** 输入 o 将在光标的下方打开新的一行并进入插入模式。**
1. 请将光标移动到本节中下面标记有 ---> 的那一行。
2. 接著输入小写的 o 在光标 *下方* 打开新的一行并进入插入模式。
3. 然后复制标记有 ---> 的行并按
---> After typing o the cursor is placed on the open line in Insert mode.
4. 为了在光标 *上方* 打开新的一行,只需要输入大写的 O 而不是小写的 o
就可以了。请在下行测试一下吧。当光标处在在该行上时,按 Shift-O可以
在该行上方新开一行。
Open up a line above this by typing Shift-O while the cursor is on this line.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第二节∶光标后插入类命令
** 输入 a 将可在光标之后插入文本。 **
1. 请在正常模式下通过输入 $ 将光标移动到本节中下面标记有 ---> 的第一行
的末尾。
2. 接著输入小写的 a 则可在光标之后插入文本了。大写的 A 则可以直接在行
末插入文本。
提示∶输入大写 A 的操作方法可以在行末插入文本,避免了输入 i,光标定位到
最后一个字符,输入的文本,
x 删除当前光标所在位置字符等等诸多繁杂的操作。
3. 操作之后第一行就可以补充完整了。请注意光标后插入文本与插入模式是基
本完全一致的,只是文本插入的位置定位稍有不同罢了。
---> This line will allow you to practice
---> This line will allow you to practice appending text to the end of a line.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第三节∶另外一个置换类命令的版本
** 输入大写的 R 可连续替换多个字符。**
1. 请将光标移动到本节中下面标记有 ---> 的第一行。
2. 移动光标到第一行中不同于标有 ---> 的第二行的第一个单词的开始,即单
词 last 处。
3. 然后输入大写的 R 开始把第一行中的不同于第二行的剩余字符逐一输入,就
可以全部替换掉原有的字符而使得第一行完全雷同第二行了。
---> To make the first line the same as the last on this page use the keys.
---> To make the first line the same as the second, type R and the new text.
4. 请注意∶如果您按
然保持原状。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第四节∶设置类命令的选项
** 设置可使查找或者替换可忽略大小写的选项 **
1. 要查找单词 ignore 可在正常模式下输入 /ignore 。要重复查找该词,可以
重复按 n 键。
2. 然后设置 ic 选项(ic就是英文忽略大小写Ignore Case的首字母缩写词),即
输入∶
:set ic
3. 现在可以通过键入 n 键再次查找单词 ignore。重复查找可以重复键入 n 键。
4. 然后设置 hlsearch 和 incsearch 这两个选项,输入以下内容∶
:set hls is
5. 现在可以再次输入查找命令,看看会有什么效果∶
/ignore
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲小结
1. 输入小写的 o 可以在光标下方打开新的一行并将光标置于新开的行首,进入
插入模式。
输入大写的 O 可以在光标上方打开新的一行并将光标置于新开的行首,进入
插入模式。
2. 输入小写的 a 可以在光标所在位置之后插入文本。
输入大写的 A 可以在光标所在行的行末之后插入文本。
3. 输入大写的 R 将进入替换模式,直至按
模式。
4. 输入 :set xxx 可以设置 xxx 选项。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第七讲∶在线帮助命令
** 使用在线帮助系统 **
Vim 拥有一个细致全面的在线帮助系统。要启动该帮助系统,请选择如下三种方
法之一∶
- 按下
- 按下
- 输入 :help <回车>
输入 :q <回车> 可以关闭帮助窗口。
提供一个正确的参数给":help"命令,您可以找到关于该主题的帮助。请试验以
下参数(可别忘了按回车键哦。:)∶
:help w <回车>
:help c_
:help insert-index <回车>
:help user-manual <回车>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第八讲∶创建一个启动脚本
** 启用vim的功能 **
Vim的功能特性要比vi多得多,但大部分功能都没有缺省激活。为了启动更多的
功能,您得创建一个vimrc文件。
1. 开始编辑vimrc文件,这取决于您所使用的操作系统∶
:edit ~/.vimrc 这是Unix系统所使用的命令
:edit $VIM/_vimrc 这是Windows系统所使用的命令
2. 接着导入vimrc范例文件∶
:read $VIMRUNTIME/vimrc_example.vim
3. 保存文件,命令为∶
:write
在下次您启动vim的时候,编辑器就会有了语法高亮的功能。
UNIT 16 Lab
基本网络客户
目标:使用工具在本地和远程计算机传输文件。
实验1 使用lftp
1. 使用ping测试连通性: ping –c 3 stationxx
2. 使用lftp连接到远程计算机
cd
lftp stationxx
cd pub
ls
get getme
exit
3. 检查并修改得到的软件
cat getme
pico getme 存为 getme.xy
cat getme.xy
4. 使用lftp把文件传到用户目录
lftp –u student stationxx
put getme.xy
exit
实验2: 加密通讯 ssh套件
1. 复制getme.xy。
cd
cp getme.bd getme.bd.secure
2. scp getme.bd.secure student@stationxx
3. ssh student@stationxx
实验3: 和远程计算机同步文件
1. cd
rsync – – rsh=ssh student@stationxx:get* .
ls getme*
UNIT 17 Lab
系统工具
实验1:at
1. 使用以下命令在5分钟后执行任务
at now + 5 min
2. 输入以下命令
echo “ This message was automtically sent via the at facility.”
3. 使用ctrl-d 结束命令输入。at将显示任务执行的时间
4. 确认任务已经排序
5. 检查邮件。确认工作完成了
实验2 使用rpm检查包和文件的情况
1. 使用rpm列出安装的包
rpm –qa | less
2. 检查安装了多少个包
rpm –qa | wc –l
3. 检查哪个包提供了vimtutor文件
rpm –qf `which vimtutor`
4. 列出coreutils 提供的文件和相关信息
rpm –qil coreutils
最后,感谢Iknownothing和Sherrie! 还有我的Mandy!