【资料】Linux基础教程

12楼
4.5 打印机和其他设备

4.5.1 配置打印机

配置打印机是一件比较讨厌的事情,原因之一在于UNIX传统上不是象windows那样直接
处理原生的打印资料,而是试图使用PostScript打印机。

第一个问题是所谓的“打印过滤器”,如果你的打印软件输出的是能够被你的打印机
直接理解的数据,那么UNIX只要简单地把它发送到打印端口就行了,Windows 95就是这
么干的,驱动程序会自动将被打印的内容翻译成打印机的点阵信息,然后送出。问题是
UNIX是直接将打印机端口当成文件处理,而UNIX下的软件通常不了解打印机的具体语言
,而是经常输出TeX之类的带格式文档,因此必须先通过一个过滤程序,将格式文档转化
成为打印机能够理解的信息。

在配置打印机之前,首先必须正确配置并行端口和标准打印机驱动程序。在2.2的内核
中,打印机被作为一个并行端口设备处理,因此编译内核时必须设置并行口和并行口打
印机支持,一般我们将它们编译成模块,即"General Setup"中“Parallel port suppo
rt”以及紧跟着的“PC-style hardware”,还有“Character devices”中的“Parall
el printer support”都被编译成模块(M)。

正确地编译内核之后,可以使用insmod命令将相关的驱动程序加入内核,对于我们推
荐的编译成模块的情况,需要加入下面几个模块:

insmod parport

insmod parport_pc

insmod lp

然后你可以看一看打印机设备是否被正确驱动了:

root@mail /]# cat /proc/devices | more

Character devices:

1 mem

2 pty

3 ttyp

4 ttyS

5 cua

6 lp

7 vcs

当然也可以用dmesg命令看一看核心信息。

上面是用模块的方式驱动,也可以将驱动程序直接编译进入内核,需要的支持选项仍
然是前面那几个,但是要注意编译好的内核映像需要明确地说明支持方式,这可以在/e
tc/lilo.conf的有关段落中加入

append="parport=0x378,lp=parport0"

再运行lilo。

装入了并行端口驱动之后,可以开始配置打印机了。我们首先使用图形界面下的prin
ttool来解释一下打印机的配置,这个程序包含在RedHat的发行光盘中,在图形界面下执
行printtool &,出现下面的界面:



图4.8 printtool

按下Add按钮添加打印机:



图4.8 选择打印机

选择local printer并单击ok,printtool将试图去查询端口并且确定是否有打印机存
在,然后出现下面的选单:



图4.1 配置打印机型号

其中,Input Filter用来选择过滤器的型号,你可以按下select按钮来选择自己使用
的打印机类型,Print Device则是打印机连接的端口,如第一个并口就是/dev/lp0。

设置完毕后,printtool将建立一个/etc/printcap文件,这个文件就是打印机的配置
文件,例如,我们现在得到的/etc/printcap文件是:

[openlab]# cat printcap

# /etc/printcap

#

# Please don't edit this file directly unless you know what you are doing!

# Be warned that the control-panel printtool requires a very strict format
!

# Look at the printcap(5) man page for more info.

#

# This file can be edited with the printtool in the control-panel.


##PRINTTOOL3## LOCAL epson 60x60 letter {} Epson24 Default {}

lp:
:sd=/var/spool/lpd/lp:
:mx#0:
:lp=/dev/lp0:
:if=/var/spool/lpd/lp/filter:

前面的都是提示行,\是续行标志,各个定义项之间用冒号分开,两个冒号之间如果为
空的话可以合并,也就是这个文件实际只有一行,即:

lp:sd=/var/spool/lpd/lp:mx#0:sh:lp=/dev/lp0:if=/var/spool/lpd/lp/filter:

开始处的lp定义了这个打印机的名字,即lp,然后sd定义spooling directory,这个
含义对于了解假脱机打印的用户是熟知的,UNIX将打印作业排队放到后台,存储成文件
的形式,然后按顺序在空闲时间打印,这个文件序列称为“打印队列”,而sd定义打印
队列存放的目录。由于系统中可能有不止一台打印机,这个选项是必须的。

mx是“最大打印文件的长度”,你可以将它设置成为一个合理的数值,这样可以避免
一些新手做出愚蠢的打印二进制文件之类的事情,数值要以类似于mx#10000之类的办法
给出,如果你给出的是mx#0,那就意味着关闭这个检测功能(一个傻瓜也许会在一次作
业中用光你的打印纸!)。

lp=给出的是打印机的设备名,如/dev/lp0,/dev/lp1等等。

最后,if=/var/spool/lpd/filter定义了一个过滤器,过滤器必须是可执行的文件,
当UNIX打印时,文件首先被过滤器转换,然后再传送到打印机。显然,如果你打印的是
纯文本,那么根本没有必要使用过滤器。在一般的情况下,由于我们用Linux打印机系统
是为局域网上的Windows 9x系统提供打印服务,而Windows输出的已经是打印机能够直接
接受的字节流,所以你可以不使用过滤器(将这一栏删除)。

如果你需要在Linux系统下打印文档,那么你就要关心过滤器问题了。通常的Linux下
的软件产生的是PostScript文档,但是许多打印机并不能直接解释PostScript文档,所
以必须用某种过滤器程序来处理,例如GhostScript,这个程序能够将PostScript文件转
换为打印机能够接受的原生数据。

要使用GhostScript,需要首先确认GhostScript能够支持你的打印机,使用gs –hel
p命令可以显示当前的GhostScript能够支持的打印机型号,例如,HP LaserJet III系列
的驱动程序是ljet3,然后你可以写一个这样的打印过滤器:

[openlab]$cat /var/spool/lpd/lp/filter

SENDEOF=

PAPERSIZE=a4

DEVICE=ljet3

RESOLUTION=360x360

nenscript | gs –q –sDEVICE=$DEVICE
-r$RESOLUTION
-PAPERSIZE=$PAPERSIZE
-sOutputFile=-

这个文件的内容一目了然,由于ghostscript程序只能处理PS文件,所以纯文本必须先
转换为PS。其中nenscript能够将文本文件转换成为PS文件,再通过GhostScript打印出
来,中间使用了管道操作,-OutputFile=-是说直接将gs的输出送到标准输出,而过滤器
的输出缺省已经指向打印机。然后,设置过滤器为if=/var/spool/lpd/lp/filter。

过滤器可以使用if或者of来定义,但我们主张全部使用if,如果你对if和of的具体概
念感兴趣,请参考有关文档。

printtool程序通常对于一般系统的配置已经足够好,但是我们发现在最新的RedHat
6.1中,printtool经常发生找不到打印机的情况(可能是内核配置的问题),在这种情况
下,你手工建立一个/etc/printcap文件就可以了。

在建立了printcap文件并且打印机工作无误之后,就可以使用打印机了,Linux使用的
是BSD打印系统,为了启用打印机,需要启动/usr/sbin/lpd程序,这是一个守护程序,
用来在后台打印文档。接下来,你可以使用lpr程序打印一个测试文档,例如一个小的文
本文件:

lpr –P[打印机名] [文件名]

打印机名就是在/etc/printcap中定义的打印机名字。如果不使用-P选项,lpr首先看
是否存在$PRINTER环境变量,如果有就使用,否则使用缺省打印机lp。

另外的经常使用在/etc/printcap里面的表达式是af和lf,af对用户进行记账,如:af
=/var/log/printacct:将在/var/log/printacct中记录每个用户打印了多少东西,而lf
则是出错记录,如:lf=/var/err/print_err:。

4.5.2 其他可能的设备

前面我大量使用了X Window,笔者希望不要给大家一种错误的印象,即Linux的配置需
要使用X Window,相反,大部分配置工具是不需要图形的,(printtool是个例外)。而
且,你总是可以手工编写配置文件。所以,我们一直没有将图形卡作为重要的设备。另
外,X Window的实现使得你可以在远程使用X,所以图形卡通常并不是很重要。

另外的设备之一是接在串行口上的终端,笔者从未在Linux系统上安装过这类产品,所
以也无法对你说什么,而且我怀疑是不是真的有人用Linux当主机,这在价格上未免说不
过去了。

调制解调器应该是最重要的外接设备了,通常我们使用调制解调器是用来拨号上网或
者作为拨号服务器,这两种功能的设置我们将在后面介绍。

4.6 安装应用程序

下面我们来解释如何在Linux系统中安装软件,例如如何安装现成的应用程序,或者编
译公开源代码的应用程序。事实上,由于Linux应用程序可以以源代码或者目标程序的方
式提供,所以有多种提供软件包的方法,最常用的两种方法是rpm和tgz。

4.6.1 rpm程序

rpm是一种将软件打包发行并且实现自动安装的程序,目前,大部分Linux发行版本都
使用rpm程序来管理软件的安装和拆除,例如RedHat,Turbo Linux,Corel Linux等等。
对于个别没有提供rpm程序的发行版本,你可以自己下载rpm程序并且进行编译。

需要用rpm安装的软件包通常是一些打包文件,后缀名是.rpm。rpm程序可以对这种程
序包进行安装,卸载,升级和维护。

Rpm程序的第一个功能是安装应用软件,例如,在当前目录下有一个apache-1.3.6-4.
rpm软件包,那么安装它的命令是

rpm –i apache-1.3.6-4.rpm

-i开关用来安装应用软件,如果你想看到更完整的安装信息,可以同时使用-v和-h选
项:

rpm –ivh apache-1.3.6-4.rpm

这两个选项将在安装的同时显示软件的名称和安装进度。

rpm程序能够在安装程序的同时检查软件包的相互依赖关系,并且检验软件之间的文件
冲突,如果发现冲突或者需要的软件包没有安装,或者已经安装了其他版本的软件包,
就会报错并退出。

对于需要升级旧版本软件的情况,使用-U选项,例如,已经安装了Apache 1.2.1的系
统上再安装1.3.6,那么需要执行

rpm –U apache-1.3.6-4.rpm

同样可以使用-v和-h选项。

偶尔你可能会碰到想要不顾文件冲突或者版本冲突而想强行安装应用程序的情况,这
种情况下可以使--force选项,如:

rpm –i --force apache-1.3.6-4.rpm

类似的还有两个选项--nodeps 和--replacefiles。-nodeps是不检查相互依赖关系,
--replacefiles是自动强制替换文件。

另外一个有趣的用法是可以用rpm从ftp server上安装应用程序,例如

rpm –i ftp://myserver.com/apache/apache-1.3.6-4.rpm

rpm程序的第二个标准用法是卸载软件包,这可以用-e选项,例如,删除apache-1.3.
6的命令是

rpm –e apache

注意删除软件包的时候使用的软件包的名字不包含版本号。

同样,删除软件包也会引起rpm的软件包依赖性验证,如果你想删除的软件包被别的软
件包使用就会出错。--nodeps选项仍然用于禁止依赖性检查。

下一个常用的功能是对软件包进行查询,这是通过-q选项来完成的,例如,要查阅当
前是否安装了apache软件包,版本是什么,可以使用命令(注意没有版本后缀)

rpm –q apache

会显示当前安装的apache rpm的文件名。如果要查询当前安装的所有软件包,使用-a
选项:

rpm –a

有时你想知道某个文件是什么软件包安装上去的,这时可以使用-f选项,例如,要查
出/etc/httpd/httpd.conf属于那个软件包,执行

rpm –qf /etc/httpd/httpd.conf

另外的工作是查询某个软件包所包含的文件,这可以使用-qpl选项,如

rpm –qpl apache-1.3.6-4.rpm

其中,l选项的含义是建立类似于ls –l的文件列表输出,类似的还有-i,-d和-c,例


rpm –qpi apache-1.3.6-4.rpm

显示这个软件包的版本和开发人员信息。

rpm –qpc apache-1.3.6-4.rpm

显示软件包中的配置文件清单

rpm –qpd apache-1.3.6-4.rpm

显示软件包中的文档列表。

最后一个常用的功能是校验软件包的完整性,命令是-V。例如,检验某个软件包的文
件是否正确,使用

rpm –V apache

想检查某个安装好的文件和包中的文件是否一致,使用-Vf,例如

rpm –Vf /usr/sbin/httpd

想检查某个包安装到系统上的文件是否完全正确(和包比较),使用-Vp,如

rpm –Vp apache-1.3.6-4.rpm

4.6.2 编译应用程序

尽管rpm程序带来了很多好处,但是由于各种原因,仍然难免发生在某个系统上编译出
的应用程序在其他系统上不能运行的情况。最常见的情况是运行库的不同,例如,现在
大部分Linux上的应用程序基于GLIBC(GNU GCC编译器使用的运行库),结果是没有包含
正确的GLIBC版本的Linux就无法使用这些目标代码,这种互相不兼容是UNIX传统的一大
体现。幸运的是,所有Linux都基于共同的操作系统内核(内核版本不同引起的冲突除外
)和相同的编译器(GNU GCC)。而且Linux下的应用程序是基于GNU协议的,因此你通常
总是可以重新编译源程序,得到一个可以使用的版本。

要编译应用程序,首先必须拿到应用程序的源代码。一般来说,各个Linux厂商都会提
供它的发行版本中各种应用程序的源代码,实在不行的话你也可到网上去下载。

下载下来的源代码有各种形式,最常见的是rpm,其后缀名是.src.rpm,可以象普通的
rpm文件一样安装,安装时,rpm程序一般会把源代码拷贝到/usr/src/redhat/SOURCE下
(也可能有其他的目录名,你自己到/usr/src下看一下),通常这些源代码安装时并没
有解压,是一些在/usr/src/redhat/SOURCE下后缀名为.tgz或.tar的文件。另外,也可
能你下载的源代码本身就是.tgz或者.tar.gz形式,那么就可以直接进行下一步,不需要
安装了。

.tgz或者.tar.gz就是.tar的压缩格式,可以用gzip程序进行展开:

gzip –d apache-1.3.6.tgz

或者

gzip –d apache-1.3.6.tar.gz

将会将其还原为apache-1.3.6.tar文件,然后

tar xvf apache-1.3.6.tar

将这个程序完全展开成为源代码。关于tar和gzip程序的详细说明见后面“日常维护”
部分。

进入到展开的目录apache-1.3.6,然后执行

./configure

几乎所有的源程序都会包含这个程序,通常,在发行源代码时,开发者会写这个名为
configure的脚本,以便自动确定诸如操作系统类型,编译器的版本等等重要的信息。这
个脚本将生成关键性的Makefile文件。(然而,也有个别开发者会把这个工作留给你自
己,这样的话,他一般会给你一个范例性的Makefile文件,并且给出足够的说明,你可
以在这个文件上修改使之适合你的系统)另外,大部分程序的configure程序包含一些参
数,可以设置程序安装运行的路径,程序的运行库等等信息。一般你可以使用-help参数
来察看这些参数的用法。

然后执行

make

GNU的make程序将自动编译所有源代码。

最后,在编译完毕之后,通常开发者会设计自动安装程序,这可以执行

make install

完成。

为了兼容性的原因,大部分源代码在编译后,目标程序的缺省安装路径是/usr/local
,相应地,配置文件的位置也变到了/usr/local/etc,/usr/local/etc或者/usr/local
/xxxx/etc等(xxxx是被编译的应用程序的名字),通常你可以用configue的选项设定这
些目录,或者干脆按照新的路径进行配置。

个别比较简单的软件只有一个运行文件,例如joe程序,那么就不提供安装命令,你只
要自己把编译出的可执行程序拷贝到/usr/bin就万事大吉了。

上面的操作是编译90%Linux程序的基本步骤,不过,必须记住,这只是一种习惯而已
,如果这样的动作不起作用,那也没有什么奇怪的,那你就的研究软件的文档了。还有
个别的程序只有一个.c文件,那就直接用gcc编译程序编译他就可以了。

gcc编译程序的用法是

gcc –o [目标文件名] [源文件名]

例如,有一个somesoft.c,你想编译这个程序,编译出的执行程序的名字叫soft,那
么执行

gcc –o soft somesoft.c

就可以了。

由于Linux的特性,软件开发者会不断地推出新的patch,通常,这些patch会用在源代
码上修改的方式推出,表现就是一些.patch文件,可以用patch程序来使用这些patch,
例如,我得到了一个关于apache的patch程序,名字叫tok.patch,进入apache的源代码
展开的目录,执行

patch –p0 < tok.patch

就可以了。关于patch命令的情况,参考日常管理的部分。

4.6.3 其他

还有一些其他的软件包安装程序,例如pkgtool和deb安装程序,说实话这些程序都很
蠢,而且现在大部分Linux厂商都在走向rpm,甚至许多其他的UNIX厂商也在考虑使用rp
m,当然,像sun那样的坚持使用愚蠢的pkgtool的公司也是有的。但是我们不打算介绍这
种东西了。唯一必须指出的是.tgz或是.tar.gz这种直接压缩的软件包还是经常有人使用
的,如同我们刚才说的,这样的压缩包可以先用gzip解压再用tar展开,另外,也可以使
用tar的z选项直接展开:

tar zxvf apache-1.3.6.tgz

13楼
【资料】Linux基础教程 第5章 局域网服务器
第5章 局域网服务器

本章要点:

本章介绍如何将Linux机器配置称为局域网上的文件/打印服务器或者计算服务器,同
时也介绍可能出现的问题以及解决方法。

本章具体包括以下内容。

NFS文件服务

BSD打印服务器

Samba文件/打印服务

WINS、DHCP和NIS

图形/计算服务器

5.1 NFS和文件/打印服务

NFS是Sun发明的用来在UNIX系统之间共享文件的一种服务协议,事实上,如果你的系
统中不是有很多的UNIX机器,我们并不建议使用NFS。因为在windows 95上访问NFS相当
困难。但是,如果你的系统中包含Sun或者SCO这样的UNIX系统,也许你除了使用NFS以外
别无选择。

5.1.1 共享文件系统

NFS实际就是将某个UNIX机器的一个目录共享出来,由其他机器直接使用。共享的动作
称为“输出”(export)。例如,host1机器的mydoc目录可以被输出,然后host2机器的管
理员将它连接到/host1/mydoc目录下,以后host2对这个目录的操作自动转化为对host1
上相应目录的操作。技术上,通常用UDP协议来实现NFS的数据传输。

首先我们需要来制作一个NFS服务器,由于NFS要依赖于远程过程调用(RPC),所以服
务器上必须启动SUNRPC服务,这个服务的另一个名字是port mapper,在目前版本中的L
inux里面,用portmap程序来启动SUNRPC服务:

$ /sbin/portmap

尽管不通过tcpd程序,但是port mapper是基于一个类似的程序tcp wrapper的运行库
,所以也可以使用host.deny和host.allow程序来限制访问。另外,通常portmap使用的端
口在/etc/services里面定义。

为了使用NFS服务,需要启动mountd和nfsd程序,这两个程序在Linux中被称为rpc.mo
untd和rpc.nfsd:

$/usr/sbin/rpc.mountd

$/usr/sbin/rpc.nfsd

其中,rpc.nfsd程序支持一个数字参数,用来表示启动nfsd程序的个数,例如:

$rpc.nfsd 7

$ps ax|grep nfsd

606 pts/0 SW 0:00 [nfsd]

607 pts/0 SW 0:00 [nfsd]

608 pts/0 SW 0:00 [nfsd]

609 pts/0 SW 0:00 [nfsd]

610 pts/0 SW 0:00 [nfsd]

611 pts/0 SW 0:00 [nfsd]

612 pts/0 SW 0:00 [nfsd]

由于NFS是基于无连接的UDP服务,所以nfsd程序不得不在端口上等待并且处理,当nf
s访问比较多的时候,增加nfsd程序的个数会有助于提高NFS的工作效率(因为避免了线
程阻塞),但是太多的nfsd程序又可能会影响CPU的处理速度。正确的数值只有自己实验
得到,不过,对于一般的系统,10-20个nfsd程序应该可以工作的很好。

另外一个需要注意的是,按照Sun的定义,NFS是无状态的,有时这一点很讨厌,特别
是有可能发生文件访问的冲突,为此,Linux提供nfs lock功能,对NFS访问进行监控,
可以用rpc.lockd和rpc.statd程序来执行这个功能:

$/sbin/rpc.lockd

$/sbin/rpc.statd

要想在启动的时候自动使用NFS服务,可以按照我们以前介绍的那样,编辑相应的启动
脚本,不过,有些Linux系统提供了设置程序,最常用的是NTSYSV程序,如redhat和TLC
都提供了这个程序:

$/usr/sbin/ntsysv

出现类似下面的界面:



将这个选单中的nfs,nfslock和portmap选中并且ok退出,系统脚本就被自动改变了。
(ntsysv程序只是建立/etc/rc.d/rc3.d下的连接而已,你也可以手工作这个连接工作,
注意我们以前讲的启动脚本)

在启动了上面说的那些服务后,现在可以输出文件目录了。在Linux中有两种输出方式
,一种使用exportfs命令,另一种是使用/etc/exports文件:

exportfs命令的用法是

/usr/sbin/exportfs –o [选项] [客户机器名]:[目录名]

客户机器名是可以使用你输出的文件系统的机器的域名或者IP,例如,你想让你的机
器上的/ftp目录能够被host.mydomain.com使用,可以使用命令

/usr/sbin/exportfs host.mydomain.com:/ftp

机器名字可以使用通配符,例如,*.mydomain.com表示一切mydomain.com域内的主机
,而202.112.58.0/255.255.255.0表示从202.112.58.0到202.112.58.255。

不带参数的exportfs命令将显示当前的输出文件系统。要取消某一个输出,使用-u参
数,格式是exportfs –u [机器名]:[目录名],例如:

exportfs –u host.mydomain.com:/ftp

-o是一些选项,首先,在这里可以设置文件系统的输出方式,是只读(ro)还是可以读
写(rw)。另外,还有几个选项,我们下面再解释。

在输出了目录之后,就可以在客户机器上使用NFS了,NFS客户的用法非常简单,只要
你的客户机内核编译时选定了NFS支持,那么,可以直接将输出的目录连接到客户机上:

mount [服务器名]:[目录名] [连接点]

例如,在上面的例子中,假设输出文件目录的机器名字是nfs.mydomain.com,在host
.mydomain.com中可以使用

mount nfs.mydomain.com:/ftp /mnt/nfs

这个目录就被连接到/mnt/nfs下面了,以后可以象使用本地文件系统那样使用它。

关于使用这个文件系统有一个问题,如同我们所知道那样,Linux用用户权限来处理文
件访问的问题,那么,当某个目录被输出之后,对方如何设定对这个文件系统的操作权
限呢?答案是通过uid,例如,/ftp的属主是ftp,属性是644,而在服务器上的ftp的ui
d是14,于是客户机器将寻找uid为14的用户,并且将/ftp解释为由这个用户所有。

显然,这可能引起混乱,为了避免出现困难,也许必须要求所有机器的用户uid一致。
更严重的是root用户,如果你把一个目录以rw的形式输出,对方机器的root用户就可能
完全破坏这个目录。

解决的办法之一是-o 选项的squash参数,它有几个选择,root_squash将使用正常的
uid映射关系(我们刚才讲的),除了客户机器的root用户,root用户被映射成nobody用
户,这样就避免了root操作导致系统破坏,这是缺省值。all_squash把客户机的所有用
户都映射成nobody用户。squash_uids可以映射一组用户uid为nobody,例如squash_uid
s=0-40,45,50-100等等。还有一个选项,no_root_squash将完全按照我们在上一段中讲
的方式执行,包括root具有全部权限,这绝对应该避免的。

例如,使用root_squash的rw方式输出可以使用类似这样的命令:

exportfs –o root_squash,ro host.mydomain.com:/ftp

-o的各个选项之间用逗号分开。

输出文件系统的另外一种方式是使用/etc/exports文件,实际上,这是个描述文件,
每一行给出一个输出目录,在rpc.nfsd启动的时候会自动去读这个文件,对每一行执行
一个exportfs命令。另外,也可以使用exportfs -r 命令自动输出其中的所有文件目录


/etc/exports文件每行的格式大概是这样:

[目录]:[客户机器]([选项])

例如,刚才的命令用/etc/exports文件相当于这样的行:

/ftp host.mydomian.com(rw,root_squash)

每次重新启动rpc.nfsd都会重新输出/etc/exports 文件的内容,重起nfsd可以用这样
的命令完成:

$killall -HUP /usr/sbin/rpc.mountd

$killall -HUP /usr/sbin/rpc.nfsd

在Linux的NFS实现中,建议使用auto mount daemon(amd)程序来实现自动安装网络文
件系统,但是根据我们的实验,这种做法的唯一优点是让系统管理员忙得不可开交,我
们建议你简单地在setup中禁止amd系统服务,并且写一个启动脚本在启动时自动连接所
有nfs目录。

要检测nfs服务的工作,使用nfsstat程序。

关于Linux的NFS我们要说明一点,由于某些原因,Linux的NFS server通常只能支持到N
FS Ver 2,而且还是一个测试中的功能,如果你重新编译了内核,记住如果一定要使用NFS
,需要把核心的“使用测试中的功能”的选项打开。

在用Linux作为NFS Server的时候有一个特殊问题,Sun Solaris支持NFS版本3,这个
是个缺省值,当用Sun去mount Linux输出的目录时会出现Linux无法正确理解Sun的NFS版
本的问题,解决的办法是在Linux启动rpc.mountd的时候明确声明不使用Version 3:

rpc.mountd –N 3

5.1.2 通过网络进行打印

网络打印并不是NFS的功能,它是由BSD打印程序提供的,如同我们以前说的那样,打
印是通过/etc/printcap程序配置的。

首先我们要配置一台允许其他机器通过它打印的服务器,实际上,这完全不需要更改
/etc/printcap(如果你已经按照我们说的那样设置系统使你可以在本地打印)。相反,
你只要设置允许哪一台机器打印到你的打印机上就行了,这可以通过/etc/hosts.lpd实
现。例如,打印服务器的名字是openlab.asnc.edu.cn,其/etc/printcap文件是

net_lp:
:sd=/var/spool/lpd/lp:
:mx#0:
:sh:
:af=/var/log/lpc:
:lp=/dev/lp0:

其中定义了某一台打印机的名字是net_lp,net_lp直接连接到openlab.asnc.edu.cn上
,想允许myhost.asnc.edu.cn打印到net_lp,那么可以直接在/etc/hosts.lpd中写上:

myhost.asnc.edu.cn

然后重新启动lpd程序,就可以允许myhost上的用户打印了。

必须注意的一个问题是,实际存在两个文件,都可以用来允许远程打印,一个是我们
刚才说的/etc/hosts.lpd,另一个比较微妙,它是/etc/hosts.equiv。关于后者的详细
情况,我们在研究远程X的时候讨论。

为了使myhost能够自动将打印作业发向openlab,需要设置myhost上的/etc/printcap
文件,主要是提供rp和rm变量,它们分别代表远程打印机和远程机器,例如,可以将my
host的/etc/printcap设置成

lp:
:sd=/var/spool/lpd/lp:
:mx#0:
:sh:
:lp=:
:rm=openlab.asnc.edu.cn:rp=net_lp:
:if=/var/spool/lpd/lp/filter:

这里将本地打印机设置为空,远地服务器设置为openlab,远程打印机设置为openlab
上的打印机名字,于是就可以使用openlab上的net_lp进行打印了。

通常打印用lpr命令实现,在前面我们已经介绍了这个命令的用法。在打印服务器的情
况下,经常会有大量的打印事务需要处理,为此,BSD打印系统使用一些命令进行打印队
列的管理,主要的是lpq,lprm和lpc。

lpq命令可以显示当前的打印队列:

[root@mail /etc]# lpq

Rank Owner Job Files Total Size

1st root 21 mail.rc 112 bytes

2nd root 22 ftphosts 104 bytes

注意job一栏的数值,这个值是打印作业号,你可以用lprm命令将某个作业删除:

[root@mail /etc]# lprm 21

dfA021A7xsgvf dequeued

cfA021linux.asnc.edu.cn dequeued

lprm后面跟作业号,注意lprm命令非常奇怪,它正常完成是要输出信息的。

可以使用lpc程序对打印队列进行更精细的管理,输入lpc之后会出现lpc>,这是lpc的
提示符,可以输入各种命令,用help命令可以获得帮助,quit命令退出。

$lpc

lpc> help

Commands may be abbreviated. Commands are:


abort enable disable help restart status topq ?

clean exit down quit start stop up

lpc>

注意lpc是一个很恶心的程序,个人看来一般还是使用lpq和lprm,killall lpd的办法
比较好,如果你一定要使用lpc,那就慢慢研究吧,:PP。

5.2 Samba服务器

实际上,NFS的用处并不多,一般,当我们要建立一个庞大的服务器集群来对付email
或者www服务时,我们用NFS来实现目录的共享。在一般情况下,我们的客户机器总是wi
ndows,这种情况下,可以用samba来实现集成。

samba是一个免费的UNIX应用程序,用来使一台UNIX机器可以象Windows NT一样为win
dows 9x机器提供文件和打印服务。不过,确实它还不能完全提供NT的功能,然而它非常
小巧而高效。

要使用samba,你必须安装跟samba相关的软件包,软件包通常包括几个,即samba、s
amba-common和samba-client,后者用于从Linux访问windows 9x的共享文件。你可以到
自己的发行版本里去查找对应的文件并且安装。当然,如果你按照我们的建议那样安装
了所有的程序,那么就无需再手工安装了。

5.2.1 在windows环境中集成Linux

现在我们来解释如何将Samba做成一个可以被windows 9x访问的文件服务器。这是通过
/usr/sbin/smbd守护进程实现的。smbd可以直接从命令行启动,但是在这之前必须先设
置一些内容。

smbd的控制文件是/etc/smb.conf,这个文件的内容很长,是一个文本文件,与普通的
配置文件不同的是它使用分号为注释行,通常在/etc下已经有了一个smb.conf的例子,
如果你不小心把它删除了,那么在/usr/doc/samba-2.0.3/examples下还有一个名叫smb
.conf.default的例子(2.0.3是版本号)。

现在我们自己来构做一个最简单的smb.conf,你可以先备份缺省的/etc/smb.conf,然
后按照下面的例子构做一个/etc/smb.conf文件,也可以按照我们下面解释的那样对缺省
的smb.conf进行编辑:

下面是这个文件的内容:

# cat smb.conf

[global]

workgroup=ASNC

load printers = no

encrypt passwords=no

security=share

[public]

comment = public files

public = yes

path = /ftp

browseable = yes

writable = no

然后你需要启动smbd和nmbd,后者用来在网络上广播机器的名字,首先察看/etc/ser
vices文件,看看是否有类似这样的内容:

netbios-ns137/tcp# NETBIOS Name Service

netbios-ns137/udp

netbios-dgm138/tcp# NETBIOS Datagram Service

netbios-dgm138/udp

netbios-ssn139/tcp # NETBIOS session service

netbios-ssn139/udp

如果没有就加上去,然后,启动smbd和nmbd:

smbd –D

nmbd –D

-D选项用于将这两个程序设置成daemon服务进程。

现在,就可以从windows 9x客户机访问Linux的共享目录了,由于netbios广播机器名
字需要一定的时间,可能不能马上在网络邻居看到,这时你可以用windows 9x的“查找
计算机”功能查询一下Linux机器的IP,就可以找到了。例如:



图5.1 查找到的samba机器

以后的操作就象操作一台windows机器的共享目录一样。要注意的是,由于smbd程序按
照客户连接的身份将请求提交给服务器,所以除了在[public]段落中设置的共享属性之
外,要使得这个共享真正生效,还要把对应目录(/ftp)的属性设置成755,只有同时满
足smb的共享权限和UNIX用户权限的目录和文件才能真正被网络邻居访问。

下面我们来解释一下smb.conf中设置的这些内容,smb.conf文件被分成了若干段落,
用方括号扩住的一行标志着一个段落的开始,段落有两种,一种是[global]段落,用来
设置一些基本参数,另一种就是用来共享某个路径的段落,例如刚才的[public]。

[global]段落中可以设置许多信息,详细的内容可以参考samba的文档,对我们来说,
最重要的是这样一些设置:

workgroup =

这个选项用来设置你的windows系统的工作组名字或者NT域的名字。

netbios name =

设置在网上邻居里面看到的机器名,如果没有,将使用机器的DNS名字。

security和身份验证

security =

这个选项设置身份验证机制,即如何对用户验证身份,目前版本支持四个选项,即sh
are,user,server和domain选项。

share选项就是我们刚才使用的,windows 9x客户可以直接访问共享目录,不需要给出
密码。另外几种选项都需要提供用户名和密码。

如果security = user方式,那么系统将使用类似UNIX的账号管理机制来处理这个问题
,你需要同时定义一个口令文件,用来存放samba的用户。

例如,与上面的配置相同,但是需要验证用户身份的smb.conf中的golobal段落是(注
意加粗部分):

[global]

workgroup = ASNC

load printers = no

encrypt passwords=yes

smb passwd file = /etc/smbpasswd

security=user

username map = /etc/smbusers


这里需要注意的是encrypt passwords选项,这个选项表示登录过程中以加密方式传递
口令,对于windows 98和windows NT 4.0,这个选项必须置成yes,对于windows95正好
相反,要设置成no,因为windows 95直接传递明文的口令。如果你的系统中同时有wind
ows 95和windows 98,需要将windows 98设置成传递明文,例子可以参考/usr/doc/sam
ba-2.0.3/docs下的几个reg文件(其实只要双击正确的reg文件就OK了)。

username map提供一个用户名字映像的功能,即将客户机提供的名字映象成UNIX账号
,例如,这里给出的文件是:

# Unix_name = SMB_name1 SMB_name2 ...

root = administrator admin

nobody = guest pcguest smbguest

root = adm

也就是由客户提供的administrator登录名将自动由Linux解释为root账号。

smb passwd files提供了检验用户口令的文件。

smbusers和smbpasswd文件都可以通过smbadduser命令来设置,smbadduser的格式是:

smbadduser [UNIX账号]:[windows 账号]

例如,要建立一个名叫test的windows登录账号,对应的UNIX账号是guest,执行

smbadduser guest:test

然后会让你输入windows登录口令,确认后,这个账号就可以使用了。如果需要更改s
amba口令,使用smbpasswd [UNIX账号]就可以了。

另一个常用的security选项是security =server,这个选项告诉系统应该到另外一台
NT server上做身份验证,例如,类似于刚才的形式,但是使用ASNT_1服务器进行口令验
证的配置应该是:

[global]

workgroup = ASNC

load printers = no

security=server

password server = ASNT_1

最后的password server选项给出了口令服务器的名字,注意这里用的是netbios名字
,也就是网络邻居中的名字,如果netbios名字和DNS名字不一致,你需要修改/etc/lmh
osts文件,加入正确的netbios名字。(lmhosts文件的格式参考联机手册)。

最后一个可能的方式是security=domain选项,实际上,在用户看来,它和security=
user几乎是一样的。区别在于,现在在本地建立的samba用户可以被加入到由NT的域控制
器里面去。即使这样,仍然要求samba用户的本地映射(由NT用户到UNIX用户的对照)存
在,因此,我们将不多讨论这个问题了。

其他重要的全局设置

在global段落里还有其他一些重要的参数,主要的有下面一些:

printing =

这个选项设置打印系统类型,由于Linux使用BSD打印系统,所以应该设置成printing
=bsd。

printcap name =

设置本地打印控制文件,例如printcap name = /etc/printcap。

load printers =

这个选项设置是否提供打印服务,如果你希望windows客户可以使用你的打印机,设置
为load printers = yes,否则为no。

guest account =

guest用户的映射用户名字,通常总是设置为nobody。

lock directory=

设置文件共享锁定使用的目录,例如lock directory = /var/lock/samba,这个目录
在启动samba之前应该存在,而且属性要设置为755。

share mode=

是否使用文件的共享锁定机制,应该设定为share mode = yes以避免文件完整性遭到
破坏。

password level=

username level =

设置有意义的用户名和口令的长度,通常应该设置为8。

unix password sync =

除非你非常熟悉samba和windows,否则将它设置为no(缺省值),这个选项允许你通
过修改windows口令来更改UNIX口令。与它相关的还有两个选项,你可以自己看一下缺省
的smb.conf范例。

interfaces =

告诉samba使用正确的广播方式,例如,你的samba服务器在一个C类网202.111.1.0中
工作,将它设置为intefaces = 202.111.1.0 /24,通常只有当你有多片网卡时才需要使
用这个选项。

remote annouce =

这个选项告诉samba在什么范围内广播它的信息,例如remote annouce = 202.111.1.
0/24。

host allow =

这个选项告诉samba允许那些机器使用你的共享服务,例如host allow = 202.111.1.
表示202.111.1.0-202.111.1.255。

log file =

将它设置为你想要记录samba工作信息的目录加上一个.%m。这样可以使samba区分出不
同客户机器来的请求,例如log file = /var/log/samba/log.%m。

local master =

如果想要你的samba服务器成为局域网的主浏览器,设置为yes。

domain master =

如果你想要samba系统作为主域控制器,设置为yes。不过你要注意,samba的主域控制
器不能接受NT的请求,实际上,只有当你的系统中全是windows 95时,这个选项才有意
义。如果你要让windows 95客户机器把samba当成NT域来登录,将它设置成yes,并且设
置security =domain以及domain logons =yes。否则,简单地将它设置成no。

domain logons =

见domain master选项。

wins support =

如果你想要你的samba成为一个wins server(见后),将它设置成yes,否则设置成n
o。

wins server =

如果你的系统中有一个NT被配置成了wins server,给出它的IP。例如,wins server
=202.111.1.48。

max disk size =

这个选项给出samba可以使用的最大磁盘空间,单位是MB。例如max disk size = 100
0。如果设置为0则不进行任何限制。

max log size =

设置最大的记录文件大小,单位是kb。

max open files =

最多可以同时打开的文件数,例如max open files = 1000

preserve case =

short preserve case =

default case =

case sensitive =

这几个选项用来设置samba的大小写设置,preserve case和short preserve case 两
个选项设置samba在处理文件是是否保留大小写,缺省是no。default case是建立文件时
的缺省大小写,缺省情况下是lower(小写)。最后一个case sensive最为重要,它表示s
amba在处理文件的时候是否区分大小写,缺省是no,表示不区分,如果你修改这个定义
,一定要小心,因为许多DOS软件不认识小写文件名字!

建立共享目录

上面已经建立了一个可以由所有人共享使用的目录,在windows 9x下它被显示成publ
ic,也可以设置其他的共享目录。

我们首先看一看[public]的格式:

[public]

comment = public files

public = yes

path = /ftp

browseable = yes

writable = no

comment是注释,就是在网络邻居里看到的说明,public = yes 说明这个目录可以被
一切用户共享,browsable是一个bool变量,当前它等于yes,表示这个目录将在网上邻
居里显示出来并且被所有人看到。

writable设定这个目录是否可写,另外一个用法是read only,上面的这一行也可以写
成read only = yes。

path=/ftp设定了这个目录在服务器上的位置。不要忘记把这个目录设置成大家都可以
读的属性。

在security=share的时候,我们只能使用共享目录。而在security = user的情况下,
我们通常可以设置从网络上使用宿主目录,这方面,Linux用一个专门的[homes]段落来
设置它:

[homes]

comment = Home Directories

browseable = no

public = no

writable = yes

create mask =0740

设置browsable = no使得别人无法看到这个共享项的存在,但是你用网络邻居功能打
开这个机器时却会根据你的用户名自动把宿主目录显示出来,其他选项的意思和上面完
全一样。注意[homes]段落不需要path语句,而且显示的时候也不显示成home,而是直接
显示宿主目录名字。这个[homes]是不能改变的。

注意create mask选项,它表示通过网络邻居建立的文件的缺省属性。

还可以设置私有的目录,例如,想建立一个共享目录,共享名字为somewhere,映射到
/somewhere,但是只能由wanghy,root和someone三个用户使用,那么可以这样设置:

[somewhere]

comment = some where only for wanghy root someone

path = /somewhere

valid users = wanghy root someone

public = no

writable = yes

printable = no

create mask = 0765

valid users选项设置合法的用户,同样还可以使用+或者&,@选项来设置一个完整的
组为合法用户,例如@test表示test组的成员,三者的主要区别是+从本地得到组信息,
&从NIS服务得出组信息,而@则两个都用。当然,不要忘记将/somewhere设置成wanghy,
root和someone可以访问的属性。

当使用share认证方式共享一个大家都可以写的目录时必须小心,因为通常share模式
当客户连接的时候实际使用的是guest用户,所以可能需要设置对应目录的guest ok =y
es。另外,对应目录必须是全局可写的。

共享打印机

最后的内容是共享打印机,这可以通过使用[printers]段落完成,例如,下面的段落
启用了网络打印机,它只能由wanghy用户使用:

# specifically define each individual printer

[printers]

comment = All Printers

path = /var/spool/samba

browseable = no

# Set public = yes to allow user 'guest account' to print

guest ok = no

writable = no

printable = yes

print command=lpr –r %s

valid users = wanghy

注意如果要使用samba的打印服务,必须确定global中的load printers = yes并且pr
inting应该设置为BSD。而且,由于windows 95的工作方式,你必须考虑远端打印机是如
何配置的。如果samba打印机不使用过滤,那么你需要在windows 95客户机器上安装打印
机的驱动程序,然后直接发送过去就可以了。print command是打印时调用的打印命令,
注意许多配置工具(例如swat)会把它写成一个print command = lpr –r –P %p %s,
但是很多情况下smbd都不会提交正确的打印机设备名字,你需要手工改成上面的形式或
者用打印机的名字代替%p参数。

在更多的情况下,Linux的samba打印机使用一个PostScript过滤器,比如使用我们在
第四章介绍的GhostScript程序,那么,在客户看来,这个打印机将是一个PostScript打
印机,所以这时无论实际的打印机是什么,你都需要在Windows 95客户上将这个打印机
设置成为PostScript打印机(非常有趣,哪一种PostScript打印机无所谓,只要是Post
Script而且幅面大小一样就行了)。

总之,你可以任意设置samba的各种服务,提供任意多的共享文件和目录。基本方式就
是按照上面的段落格式,每一段给出一个共享目录。

编辑完毕后,用testparm程序验证是否有错误的行:

[root@openlab bin]# testparm

Load smb config files from /etc/smb.conf

Processing section "[public]"

Processing section "[homes]"

Loaded services file OK.

Press enter to see a dump of your service definitions

testparm程序自动校验/etc/smb.conf的各个共享段落,然后按下回车键将把这个文件
显示一遍。

如同刚才说的那样,可以用smbd –D和nmbd –D启动samba,也可以使用ntsysv程序,
使用方法和nfs类似,这里不再详细叙述了。

如果要察看samba的运行状态,使用smbstatus:

# smbstatus


Samba version pre-2.0.7

Service uid gid pid machine

----------------------------------------------


No locked files


Share mode memory usage (bytes):

1048464(99%) free + 56(0%) used + 56(0%) overhead = 1048576(100%) total

14楼
5.2.2 swat程序

想了解samba,可以看smb.conf的手册页面,如man smb.conf。但是这确实不太方便。
而且samba的语法也在不断改变以便跟上Windows NT的发展。为了简化samba的配置,Sa
mba在其中包含了一个可以通过浏览器进行smb配置的工具,这个程序的名字叫swat。

要使用swat,首先必须将它配置成一个服务器进程,这可以更改/etc/services和/et
c/inetd.conf来实现。首先要为swat分配一个端口,例如在/etc/services中加入这样一
行:

swat 901/tcp

901是我们通常给swat分配的端口。

接下来,在/etc/inetd.conf中启动swat,可以加入这样一行:

swat stream tcp nowait.400 root /usr/sbin/swat swat

重新启动inetd:

kill –HUP inetd

然后,在浏览器中输入你的Linux机器的地址,比如Linux机器的IP是166.111.111.11
1,那么可以输入http://166.111.111.111:901/,注意901和http://都是不可省略的。

然后将出现登录窗口:



图5.2 swat登录

用户名为root,口令输入超级用户口令,输入后,将出现swat的配置屏幕:



图5.3 swat

每一个标题都代表一组设置,可以用这个界面直接配置samba。特别是,可以在这个界
面里看到smb的手册页面。

需要注意的是,由于swat程序生成smb.conf的时候会自动删除原来的smb.conf,因此
你应该先备份原来的smb.conf文件。另外,swat使用明文传送用户名和口令,意味着你
的系统口令可能被监听到,所以一定要注意安全。

5.2.3 重新编译samba

samba总是在不断地更新中,你应该尽量获得samba的最新版本。然而,由于samba是一
个通用的UNIX程序,你能得到的通常都是源代码,下面我们解释一下如何重新编译samb
a。

其实编译samba和编译 任何Linux源代码的方法都是一样的,问题在于,为了保证sam
ba在System V和BSD上都能够使用,缺省的samba安装目录是/usr/local/samba,相应的
配置文件也不是在/etc,而是/usr/local/samba/lib。为此,你首先应该执行配置程序
。在配置程序中,你可以设定各种目标目录,设定的命令可以用help参数得到:

./configure –help |less

这可以显示用什么命令更改缺省目录,例如-bindir=/usr/bin,--sbindir=/usr/sbi
n等等。

不过,就我个人来说,我更喜欢直接手工编辑产生的Makefile文件,改变里面的目录
名字,例如,下面是我改动的方法:(注意加粗的部分)首先执行./configure,然后编
辑Makefile:

........

prefix=/usr/local/samba

exec_prefix=${prefix}

mandir=${prefix}/man

.........

srcdir=.

builddir=/root/samba-pre2.0.7/source

SHELL=/bin/sh


BASEDIR= /usr/local/samba

BINDIR = /usr/bin

# we don't use sbindir because we want full compatibility with

# the previous releases of Samba

SBINDIR = /usr/sbin

LIBDIR = ${exec_prefix}/lib

VARDIR = /var/log/samba

MANDIR = /usr/man

CONFIGDIR = /etc

SMBLOGFILE = $(VARDIR)/log.smb

NMBLOGFILE = $(VARDIR)/log.nmb

CONFIGFILE = $(CONFIGDIR)/smb.conf

LMHOSTSFILE = $(CONFIGDIR)/lmhosts

DRIVERFILE = $(CONFIGDIR)/printers.def

PASSWD_PROGRAM = /bin/passwd

最后再make,make install就可以了。

5.2.4 从Linux使用windows 文件服务

通常我们总是从windows 9x来访问Samba共享文件,但是,在个别的情况下,偶尔也需
要使用Linux访问Windows 9x/NT的共享目录,这是通过smbclient和smbmount实现的。要
使用这些工具,确定你已经安装了smb-client软件包。

smbclient是一个基本的访问Windows 共享目录的软件,例如,假设你的Windows共享
机器是WINWS,共享目录是PUBLIC,那么可以这样执行smbclient:

smbclient //WINWS/PUBLIC

然后出现提示:

added interface ip=202.199.248.6 bcast=202.199.248.255 nmask=255.255.255.0

Got a positive name query response from 202.199.248.5 ( 202.199.248.5 )

Password:

如果是不需要口令的系统,直接回车,否则,按照你当前的Linux用户名输入对应的口
令,然后出现smbclient的提示符:

smb: \>

在这个提示符下面可以输入命令,help显示所有可用的命令,用法颇类似于ftp,使用完
毕之后,输入quit退出。

smbclient的常用命令有:

cd [目录名] 改变目录

del [文件名] 删除文件

dir 显示目录

get [文件名] 从服务器下载文件并且存放到本地目录

lcd [目录名] 改变本地目录

mget [一组文件] 取得成组文件

put [文件名] 上载文件

recurse 激活递归模式,在这个模式下可以连子目录一起操作

mput [一组文件] 成组上载文件

rmdir 删除目录

mkdir 建立目录

上面是smbclient的一般用法。如果你想明确地给出用户名和口令,使用-U参数,例如
,用户名test,口令passwd应该给出为

smbclient //WINWS/PUBLIC –U test%passwd

另外几个常用的smbclient命令行参数是这样:

-I [ip地址]显式给出目标服务器的IP地址,由于在smbclient中使用的是netbios名字
,所以有时可能出现无法查询到计算机的情况,在这种情况下,可以通过-I选项给出IP


-L [host] 这个选项显示指定机器上的共享资源列表,例如,smbclient –L //WINW
S

-W [工作组名] 在登录时指定工作组名字或者域名

-N 不使用口令

另外一种使用Windows 9x文件服务的方法是使用smbmount,它的基本语法是

smbmount //机器名/共享目录名 –c 'mount 连接点'

这是目前的smbmount的语法,例如,要将前面说的//WINWS/PUBLIC连接到本地的/net
目录,命令是

smbmount //WINWS/PUBLIC –c 'mount /net'

以后/net下的内容就是//WINWI/PUBLIC的内容。

这个命令支持-U,-P(给出口令),-n(禁止口令),-D(给出NT域)等选项。

要使用共享打印机,需要使用smbprint。可以将smbprint作为一个输入过滤器,例如
,可以将/etc/printcap配置成这样:

smblp:
:sd=/var/spool/samba:
:af=/var/spool/samba/smbprintacc:
:if=/usr/bin/smbprint:
:lp=:

然后需要建立smbprint配置文件,例如在现在的情况下,smbprint位于/usr/bin下,
需要建立/usr/bin/.config文件,内容如下:

$ cat .config

server=ASNC

#服务器的名字

service=HPLIII

#共享打印机的共享名

password="pass"

#使用口令为pass

然后就可以用lpr命令打印了。


5.2.5 WINS和NetBIOS

熟悉Windows NT的用户会知道,windows 用NetBIOS名字在网络上确定机器,但是在互
连网络中人们用DNS名字,两个名字可能会不一致;另外,NetBIOS名字的传播是依靠广播
机制,也就意味着Windows 系统的名字不能跨越子网和路由器,对于大型网络这是非常
讨厌的事情。Microsoft使用WINS(windows 通用命名服务)来解决这两个问题。

WINS Server通常是一台Windows NT服务器,Windows 客户机器通过它彼此交换自己的
NetBIOS名字,因为WINS服务器是通过IP地址访问的,所以使用同一个WINS的机器无论物
理上是否处于同一个网段内都可以直接在网络邻居内看到。

要将samba配置成WINS 服务器,在[global]段落中使用下面的两行:

wins support = yes

以后将windows 客户机的WINS地址设置成samba机器就可以了。例如:



图5.4 启用wins

如果要让samba使用已有的WINS服务,使用

wins server = [WINS服务器地址]

在使用已有的wins服务器的情况下,可以将samba当成一个wins代理来使用。wins代理
实际上也是一个wins服务器,但是它是从某个主wins服务器取得名字信息,然后广播给
别的机器,这可以让netbios名字广播给别的机器。

要将samba配置成为wins代理,只要设置这样的一行:

wins proxy = yes

不要忘记同时应该给出主wins服务器的地址。

5.3 DHCP

DHCP即Dynamic Host Configuration Protocol (动态主机配置协议),它用于给子网
内的机器动态分配IP地址、域名服务器和网关地址等信息。通常使用它的主要理由是节
省IP地址,但是也有许多单位为了避免管理每台机器的IP地址这样的复杂问题而使用它
。如果你的系统中有很多连什么是IP地址都搞不清的用户,用dhcp提供网络配置是一件
很有益的事情。

要使用DHCP,首先必须记住DHCP是一个租用体系,系统会定期以广播的方式传递给客
户机器可以使用的IP地址,为此,你必须有一些IP地址可以供动态分配之用。实际上,
纯粹的局域网中,DHCP并没有太大的用处,但是当面对一个较大的部门的时候,为了使
安装配置网络客户机器的方法简化,也可以使用DHCP。

要使用DHCP,必须安装dhcp软件包,例如我用的是dhcp-2.0.3.rpm,当然你也仍然可
以自己编译这个工具。

dhcp的配置非常简单,缺省下使用/etc/dhcp.conf,这个文件通常需要自己建立,下
面是一个范例的dhcp.conf文件:

subnet 192.168.12.0 netmask 255.255.255.0 {

range 192.168.12.10 192.168.12.55;

#出租的IP范围

default-lease-time 600;

#缺省的占用时间

max-lease-time 7200;

#最大占用时间片

option subnet-mask 255.255.255.0;

#子网的掩码

option broadcast-address 192.168.12.255;

#广播地址

option routers 192.168.12.1;

#路由器地址

option domain-name-servers 192.168.12.2;

#域名服务器地址

option domain-name "asnc.edu.cn";

#缺省的域名


}


每个由subnet开始的段落定义了一个独立的租用段落,可以有多个subnet,每个subn
et段落里面还可以有多个range段落。

接下来,你需要启动dhcpd程序,这个程序会使用一个文件,这个文件的名字是dhcpd
.leases,不过具体的位置和发行版本有关,你可以直接执行dhcpd程序来看看它的位置


[root@openlab /etc]# dhcpd

Internet Software Consortium DHCP Server 2.0

Copyright 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium.

All rights reserved.


Please contribute if you find this software useful.

For info, please visit http://www.isc.org/dhcp-contrib.html


Can't open lease database /var/state/dhcp/dhcpd.leases: No such file or di
rector

y -- check for failed database rewrite attempt!

Please read the dhcpd.leases manual page if you.

don't know what to do about this.

exiting.

显然,它认为dhcpd.leases应该位于/var/state/dhcp/dhcpd.leases,因此你可以手
工建立这个文件:

[root@openlab /etc]# touch /var/state/dhcp/dhcpd.leases

然后就可以重新执行dhcpd了。

不过需要注意的是,dhcpd是通过广播来完成服务的,所以你应该确定核心中加入了广
播支持,用ifconfig程序可以看到当前的状况:

[root@openlab dhcp]# ifconfig eth0

eth0 Link encap:Ethernet HWaddr 52:54:4C:B9:B8:29

inet addr:192.168.12.2

Bcast:192.168.12.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:3288 errors:0 dropped:0 overruns:0 frame:0

TX packets:1015 errors:0 dropped:0 overruns:0 carrier:0

collisions:1 txqueuelen:100

Interrupt:3 Base address:0x300

MULTICAST说明广播已经被支持了。

下一步要确认广播路由,例如,你要想通过eth0广播DHCP服务信息,必须将eth0加入
广播路由表,即

route add –host 255.255.255.255 dev eth0

下面就可以使用dhcpd了,在测试阶段,你可以使用-f让dhcpd在前台工作:

dhcpd –f –d

-d选项显示调试信息。

然后,你需要准备windows 9x客户机器,这只要在Windows 98的控制面板中选择网络
设置,设置TCP/IP通信协议的属性,将IP地址设置成“自动获得IP地址”就可以了。

然后可以重启动windows 98,在启动中,你应该可以在Linux的终端上看到这样的题是


Internet Software Consortium DHCP Server 2.0

Copyright 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium.

All rights reserved.


Please contribute if you find this software useful.

For info, please visit http://www.isc.org/dhcp-contrib.html


Listening on LPF/eth0/52:54:4c:b9:b8:29/202.199.248.0

Sending on LPF/eth0/52:54:4c:b9:b8:29/202.199.248.0

Sending on Socket/fallback/fallback-net

DHCPREQUEST for 192.168.12.47 from 00:40:05:47:7c:14 via eth0

DHCPREQUEST for 192.168.12.47 from 00:40:05:47:7c:14 via eth0



图5.5 启用DHCP

这样的信息表示IP地址已经正确地分配了。

如果想要了解当前dhcp分配的情况,可以看看/var/state/dhcp/dhcpd.leases,这基
本是个对照表,例如:

[root@openlab dhcp]# cat dhcpd.leases

# All times in this file are in UTC (GMT), not your local timezone. This
is

# not a bug, so please don't ask about it. There is no portable way to

# store leases in the local timezone, so please don't request this as a

# feature. If this is inconvenient or confusing to you, we sincerely

# apologize. Seriously, though - don't ask.

# The format of this file is documented in the dhcpd.leases(5) manual page
.


lease 192.168.12.50 {

starts 5 2000/02/18 07:45:49;

ends 5 2000/02/18 07:55:49;

hardware ethernet 00:88:cc:12:53:15;

uid 01:00:88:cc:12:53:15;

client-hostname "aaa";

}

这个信息表示192.168.12.50分配给了一个名叫aaa的客户机器。

在某些情况下,你可能需要建立绑定到确定的以太网地址的IP地址对照表,这可以通
过host段落来设置,例如:

host test {

hardware ethernet 08:00:2b:4c:59:23;

#以太网卡的MAC地址

fixed-address 192.168.12.40;

#分配一个固定的IP地址

}

这个段落里仍然可以使用各种option 子句。

使用Linux提供的dhcp程序有一个比较讨厌的问题,一般来说,Linux的dhcp服务是相
当稳定的,问题在于,如果你在同一个子网内同时有windows NT和Linux的dhcp服务程序
,那么windows 9x客户机器总是会先选择Windows NT服务器,目前我们还没有找到解决
这个问题的好办法,只能尽量保证不开Windows NT dhcp服务。

15楼
5.4 NIS

我们现在要来处理一个纯粹在局域网中使用的服务,即NIS(网络信息系统)。这个东
西是sun搞出来的在不同机器之间共享口令文件和组文件的工具。依靠它,不同的机器可
以使用一组同样的账号信息。对于NFS,Samba等共享服务,或者其他需要在机器之间共
享用户权限信息的软件,NIS相当有用。

最简单的NIS应用是共享passwd文件,例如一个NIS服务器可以散布它自身的passwd和
shadow文件的信息,使得即使在NIS客户机器上没有账号的用户也可以根据服务器上的帐
号和口令登录到客户机器上。

NIS有两个版本,其中,比较早期的一个是我们下面要介绍的版本,而比较新的一个,
称为NIS+,被sun应用在它的Solaris系统中。目前Linux的免费NIS服务器只能支持比较
早的版本,虽然Linux的NIS客户程序可以使用NIS+。因为我们这本书是服务器指南,所
以我们将不会涉及NIS+。

在理解NIS之前,我们必须首先了解它的局限性。NIS是一个简单的数据库系统,客户
机器通过广播的方法从网络上取得NIS服务信息,它对NIS请求和服务信息都不作验证,
因此任何人都可能冒充成真正的NIS客户来取得你的NIS服务器提供的口令映射表,也就
是说可以拿到你的服务器的/etc/passwd和/etc/shadow文件。或者,更危险的情况是,
任何人都可以冒充为一台NIS服务器发布NIS信息。因此,除非你确保你得局域网是安全
的,否则不要使用NIS。如果你的网络接入Internet,记住应该用防火墙把局域网和Int
ernet割开。

因为NIS是基于广播的,因此你在每一个以太网段中都需要包含一个NIS服务器,为了
确保服务器之间的信息同步,NIS使用“主”和“从”服务器的概念。主NIS服务器发送
权威的NIS信息,而从NIS服务器只是从主服务器那里取得NIS信息,并且对同一网段的机
器提供服务。主从服务器之间的NIS信息传递基于IP,所以可以跨越路由,这使得使用N
IS管理较大的网络成为可能。

要使用NIS,你必须安装NIS服务器程序,在Linux中,对应的软件包是以yp开头的几个
包,例如:

# ls yp*

yp-tools-2.3-2.i386.rpm ypbind-3.3-24.i386.rpm ypserv-1.3.7-3.i386.rpm

#rpm –i yp*

这个古怪的名字是因为NIS最早被称为Sun Yellow Page。

我们说过NIS主要是用来在机器之间共享账号信息,实际上还有一些信息也在NIS中传
递,例如下面的几个文件:/etc/hosts,/etc/networks,/etc/protocols,/etc/serv
ices和/etc/netgroup等等。

现在我们来构造一个简单的NIS服务系统,它包括一个NIS服务器和NIS客户机器。NIS
服务器的设置是简单的,首先我们必须设置NIS域的名字:

# domainname ASNC

这样就建立了一个名字叫ASNC的NIS域。注意不要把NIS域和DNS或者Windows NT的域混
淆。

接下来,需要初始化服务器,这可以用ypinit程序来完成,通常情况下,ypinit位于
/usr/lib/yp目录下,要将服务器初始化为NIS主服务器,使用ypinit –m:

# /usr/lib/yp/ypinit -m


At this point, we have to construct a list of the hosts which will run NIS

servers. mail.asnc.edu.cn is in the list of NIS server hosts. Please con
tinued

the names for the other hosts, one per line. When you are done with the

list, type a <control D>.

next host to add: mail.asnc.edu.cn

next host to add:

这里需要你填入各个NIS服务器的地址,输入所有NIS服务器的地址后,按下^D组合健
,将会出现类似下面的信息:

The current list of NIS servers looks like this:

mail.asnc.edu.cn

wxd.asnc.edu.cn

Is this correct? [y/n: y]

回车后,系统将自动初始化NIS服务器。

接下来,你需要启动NIS服务程序,这个程序的名字是ypserv,一般位于/sbin下面,
你只要简单地执行它就可以了,不过它是基于portmap程序的,所以

#portmap

#ypserv

这样,NIS主服务器就开始运行了。

以后你可以将domainname和ypserv命令加入到系统启动脚本中。在大部分UNIX启动脚
本中,可以通过在/etc/domainname中写入NIS域名让系统启动时自动设置NIS域,而yps
erv程序也可以通过NTSYSV程序启动。

要使用NIS服务,需要使用ypbind程序,在NIS客户机器上,你需要的只是设置NIS域和
启动ypbind:

#domainname ASNC

#portmap

#ypbind

这样客户机器就可以使用NIS信息了。注意如果没有portmap,ypbind程序会简单地退
出。

要想使用NIS提供的信息,需要管理/etc/nsswitch.conf文件。例如,这是我们的/et
c/nsswitch文件:

passwd: files nisplus nis

shadow: files nisplus nis

group: files nisplus nis


hosts: files nisplus nis dns


bootparams: nisplus [NOTFOUND=return] files


ethers: files

netmasks: files

networks: files

protocols: files

rpc: files

services: files


netgroup: nisplus


publickey: nisplus


automount: files nisplus

aliases: files nisplus

注意passwd: files nisplus nis这样的行,它表示在需要passwd文件的时候,首先察
看对应的本地文件,接着是NIS+,最后是NIS。以下的行的概念类似,至于与DNS有关的
行我们已经在以前介绍过了。

在passwd和shadow,group里面可以使用的选项有files(代表本地文件),nisplus(NI
S+),nis(NIS),还有一个特殊的选项是compat。这个选项比较有趣,通常我们如果使
用NIS提供passwd和shadow,group文件的话,那么来自NIS服务器的所有账户信息都会被
接受,而compat允许我们用“魔饼”来控制那些信息被接受。所谓“魔饼”其实就是一
些以+号开头的行。例如,我们希望来自服务器的信息中,只有账号user1的信息被接受
,其他信息都被忽略,这样只有user1用户可以利用服务器上的账号在客户机器上登录,
那么,我们首先这样设置/etc/nsswitch.conf中的对应行:

passwd: compat

shadow: compat

然后设置/etc/passwd文件,在最后加入这样的行:

+user1

然后,user1用户就可以在客户机器上登录了。同样的办法也可以用来控制整个组。

在使用魔饼的过程中,我们可以用“网组”来简化管理,网组是sun提出的概念,它的
设置是由/etc/netgroup文件决定。这个文件的每一行由这样的语法构成:

[组名] [列表]

列表由一系列三元组构成,格式是这样的:

(主机名,用户名,域名)

任何空栏位表示通配符。例如,(host1,,)代表主机host1上的所有用户,(host1,,do
main1)代表主机host1上domain1域内的所有用户。

/etc/netgroup文件中的每一行代表一个网组,例如

group1 (host1,,)

说明了一个名叫group1的组,它代表host1上的所有用户。

网组也可以用在客户机器的passwd和group文件中,例如我们想让客户机器能够接受g
roup1网组内的所有信息,可以使用

+@group1

当你处理一个比较大的网络的时候,你可能需要为每个NIS域建立几个从NIS服务器。
建立NIS从服务器的步骤比较简单,首先必须在建立主服务器时设置从服务器地址,即当
出现这样的提示:

the names for the other hosts, one per line. When you are done with the

list, type a <control D>.

next host to add: mail.asnc.edu.cn

next host to add:

依次填入所有从NIS服务器的主机名或者地址,最后按下^D退出,这样从服务器的地址
就被记录了下来。如果你在初始化主服务器时忘了加入这样的内容,可以直接编辑主NI
S服务器上的/var/yp/ypservers文件来加入,每一行代表一个NIS服务器地址。编辑结束
后,在这个目录下执行make程序来刷新NIS数据库。

然后可以初始化从NIS服务器,这可以用这样的命令完成:

/usr/lib/yp/ypinit –s [主服务器名]

然后在从服务器上执行portmap和ypserv就可以了。

为了保持从服务器和主服务器的数据同步,你需要定期从主服务器取得NIS数据。NIS
数据保存在/var/yp目录下,每一个域会有一个单独的目录,例如:

bash# rwho

bash# ls

ASNC Makefileasnc binding nicknames securenets ypservers

bash# ls ASNC

hosts.byname.db protocols.byname.db services.byname.db

group.bygid.db netid.byname.db protocols.bynumber.db ypservers.db

group.byname.db passwd.byname.db rpc.byname.db

hosts.byaddr.db passwd.byuid.db rpc.bynumber.db

你可以用/usr/lib/yp/ypxfr程序从主服务器上取得NIS数据,例如,想取回passwd.b
yname.db的最新版本,执行

#/usr/lib/yp/ypxfr passwd.byname.db

如同前面说的那样,NIS服务器的主要优势是简化账号的管理,但是它的安全性很值得
怀疑,而且必须注意的是,NIS的信息取得是使用广播,因此它很浪费带宽。特别是你需
要在每个以太网之内加入一个NIS服务器。我们建议除非你有绝对必要的理由,否则不要
使用NIS。如果你对同步网络账号感到困扰,可以考虑使用某种自动化工具用蛮力方式拷
贝所有的账号文件。

为了解决NIS的固有问题,Sun提出了NIS+系统,它解决了NIS数据分层,安全性,增量
传送等等问题,不幸的是它过于复杂,而且在作者写这本书的时候还没有能在Linux上执
行的NIS+服务器软件,所以本书将不涉及这一方面的问题。当然,什么也不能阻止你把
Linux配置成一台NIS+客户机器,但是NIS服务器只能在solaris上运行。

5.5 远程过程调用和X客户/服务器

下面我们要简单介绍一下X客户/服务器模型的问题。一般来说,很少有人像我们下面
介绍的这样使用Linux,这是因为x86体系结构本质上在处理高性能计算的时候效果不好
,而且Linux的图形支持至今也不能令人完全满意。不过,我确实知道有人这样使用X,
比如某个网络系统中你有一台非常强大的系统(PIII Xeon 700 *2),那么,你很可能
想将某些图形的计算/设计程序放到服务器上去执行,并且在本地观察输出。特别是如果
你有一台浮点超强的工作站(比如某些Power PC系统),你可以将图形的计算程序通过
网络提交给它来完成,用自己的Windows或者Linux PC作为图形终端来观察输出结果。

另外一种常见的方式是Linux到UNIX/Linux的,你可以把某些任务提交给远程系统完成
。这可以简单地使用telnet,也可以使用UNIX下常用的一组r(远程)命令,如rsh,rlog
in,rexec等等。大部分windows 95的远程X 调用都使用这些功能,而且这些命令也是许
多安全性灾难的起源,所以我们在这里也相应地解释这些东西。

5.5.1 r命令

r命令是一些常用的远程操作命令,主要包括rcp,rsh,rlogin和rexec,当然还有其
他几个也用r开头的命令,如ruser,rwho等等,但是我们将不把主要内容放在这些东西上


rcp,rsh的目标都是给用户提供一种不需要口令就可以访问远程系统的方式。比如,
你在服务器server.yourdomain.com上有一个test账号,而在另外一台机器client.your
domain.com上也有一个test账号,那么,你可能在client机器上远程对server机器进行
操作,并且,为了简单,也许你不想给出用户口令。那么,你就需要使用rsh和rcp命令
了。

无论哪一种,都是基于远程机器之间的互相信任。在UNIX中,确定这种互相信任的文
件有两种,一种是全局的信任文件,这个文件是/etc/hosts.equiv;另外一种是单个的
对于某个用户的信任文件,这个文件存放在每个用户的宿主目录下,名字是.rhosts。

/etc/hosts.equiv定义了那些远程机器的账号和本地账号等价。例如,在我们刚才提
到的情况,你可以在server上建立一个/etc/hosts.equiv文件,其内容包括这样的行:

client.yourdomain.com test

这样一行代表client.yourdomain.com上的test账号等价于本地机器上的test账号。同
样,client.yourdomain.com cook代表client上的cook账号等价于本地账号cook。

必须注意一个很严重的问题,由于r命令可以切换用户身份(见下面的介绍),因此,
一个等价于本地账号的全局信任账号实际上已经取得了控制所有账号的能力。因此,除
非你确定所有的全局信任账号都是绝对可靠的,否则,保证hosts.equiv为空文件并且定
时检查!

单个信任文件.rhosts文件必须存放在用户的宿主目录下,而且出于安全性的考虑,它
的属性至少是640以免非授权的修改。这个文件的格式与hosts.equiv类似,所不同的是
,这个文件可以用来定义不同的用户账号之间的等价性。例如,你在server的user1用户
的宿主目录(/home/user1)下面建立这样的.rhosts文件:

host1.yourdomain.com user1

host2.yourdomain.com user2

这样的文件意味着除了host1上的user1用户被等价为server的user1用户之外,host2
上的user2用户也被等价为server的user1用户。

常用的远程访问命令有下面几条:

rsh

这个命令用来在远程机器上执行一条命令,格式是rsh [目标主机] [命令]。例如,我
们已经按照上面说的建立了server和client之间test账号的等价关系,那么现在就可以
在client机器上用rsh命令远程执行server上的命令:

#rsh server.yourdomain.com ls –l

这样,rsh将调用远程机器上的ls -l命令(显示的是server的目录内容),然后将输出
返回到client机器上。

rsh的开关-l用来改变用户名,在缺省的情况下,rsh会自动使用你在client机器上的
用户名建立等价关系,但是如同我们前面那个例子,你在host2上的名字为user2,现在
想以user1的身份到server上执行命令cat file1,那么可以执行

#rsh –l user1 server.yourdomain.com cat file1

rlogin

从特性上说,它等价于telnet。不过,对于建立了信任关系的账号,它无需输入口令
。命令格式是rlogin [目标主机]

例如rlogin server.yourdomain.com

rsh程序也可以用-l改变身份,用法和rsh命令一样。

rcp

这个命令用来在机器之间拷贝文件,例如,你想把当前目录下的test.zip文件拷贝到
远程机器server的/home/test目录下,执行:

rcp test.zip server.yourdomain.com:/home/test

rexec

这个命令也是在远程机器上执行命令,不过需要给出用户名和口令,格式是

rexec –l [用户名] -p [口令] [目标主机] [命令]

要使用这些r命令,需要启动对应的服务,一般这些服务在inetd.conf中定义,下面是
/etc/services和/etc/inetd.conf中对应的段落:

# /etc/services

…………

exec 512/tcp

login 513/tcp

shell 514/tcp cmd # no passwords used

…………………


#/etc/inetd.conf

……………

shell stream tcp nowait root /usr/sbin/tcpd in.rshd

login stream tcp nowait root /usr/sbin/tcpd in.rlogind

exec stream tcp nowait root /usr/sbin/tcpd in.rexecd

……………………


一般来说,应该尽量避免使用r命令,除非你能确信自己是安全的。

5.5.2 X Window的客户/服务器模式

我们一直没有把时间消耗到X上,因为对于一台网络服务器来说,X Window实际是可有
可无的。不过,确实存在我们说的那种情况,用Linux作为高性能的中心计算服务器或者
图形终端。

X本身是基于客户-服务器模式的,简单地说,每个运行X应用程序的机器上必须有一个
X服务程序,而X应用程序通过网络(如果在同一台机器上,就通过lo网络接口)将自己
的请求/调用提交给服务程序,然后由X服务器显示到屏幕上。因为X应用程序和服务程序
之间的对话是通过网络的,所以X应用程序和X服务器可以不在同一机器上运行。我们可
以在某一台机器上运行X应用程序,然后将它的输出转发到另外一台运行着X server的机
器上,这样就可以把计算程序和终端分离开来。

要使用这种功能,需要在你准备作为X终端的机器上使用xhost命令。这个命令用来在
X服务程序上设置它接受那些机器来的X输出,注意你只能在X已经启动的情况下执行这个
程序,比如在xterm中。语法是xhost [+/-] 主机名。例如xhost + 192.168.1.2意味着
你的X现在将接收来自192.168.1.2的X应用程序的输出。相反,xhost – 192.168.1.2把
这个项移除。一个xhost +意味着你的机器接受任何地方来的X应用程序的信息。

在设置了X终端之后,你需要在运行X应用程序的机器上设置DISPLAY环境变量。例如你
的X终端的IP地址是192.168.1.1,那么你需要在运行X应用的机器(比如192.168.1.2)上
执行

#DISPLAY=192.168.1.1

#export DISPLAY

然后各种X应用程序的输出就会被送到192.168.1.1去,因此在这之后你只要直接输入
对应的X应用程序的启动命令就可以在X终端上看到X界面了。

如果你觉得设置DISPLAY环境变量比较讨厌,也可以直接使用display参数,例如,想
把xterm的输出转发到192.168.1.1,直接在提示符下(在运行X应用程序的机器上并不需
要启动X)输入

xterm –display 192.168.1.1:0.0 &

另外,如果你这样执行了xterm,那么以后从xterm中启动的任何程序都将自动获得一
个环境变量DISPLAY=192.168.1.1:0.0。

5.5.3 exceed

上面说的X应用也可以用来将Linux的输出送到Windows 9x中,只要Windows 9x中安装
了X服务器程序。目前这种服务程序有很多种,最常用的是exceed。

安装exceed非常简单(信不信由你,:PP),安装之后,在第一次运行exceed的时候后
要求你建立一个X session,以后再启动exceed将会直接缩小为图标,但是你仍然可以用
右键建立新的X session。

如果你想要用X session启动远端的X客户程序,你首先必须激活远端的r命令,方法就
是我们前面说的。接下来,你需要配置X session,启用"X clients"会出现一个会话框
,首先要选择通信方式,缺省的REXEC就行了。 我们一般建议你启动一个xterm,然后在
xterm中启动其他的程序,因此Program Type选“Terminal Emulator",添上user id和
口令, host就是远端机器的地址,接下来的command输入(假定你运行eXceed的客户机
器IP地址是192.168.1.1)

xterm -display 192.168.1.1:0.0

它表示把对应的Linux机器的显示输出重定向到192.168.1.1这个地址。然后按下run菜
单,很快你会发现任务栏或者屏幕上多了一个终端窗口(如果被极小化,就是任务栏里
多了一个任务,激活它就行了),从现在开始,你就可以象使用本地机器一样使用Linu
x机器的图形应用程序了。你可以启动 netscape或者kedit程序检验XWindow的输出是否
会出现在你的windows 95客户机器上。

注意,当你退出Xclients时,可以将前面的设置存盘,而在第二次及以后运行 eXcee
d时,eXceed会自动收缩成任务栏的图标,只要按下右键选择tools-> client starter就
可以了。

配置X session确实非常简单,不过你也可以像前面说的那样直接telnet到远端机器上
,设置环境变量DISPLAY,然后就可以直接从命令行执行x程序,程序会显示到你的wind
ows 9x机器上,例如

$ xclock -display 192.168.1.12:0.0 &

30866

然后就会在192.168.1.12上看到xclock的界面:



图5。6 远程使用X服务

本书的一些涉及图形的部分是用这种方式写成的。

注意X的远程使用非常消耗网络带宽,所以不要指望用它来执行视频程序,或者通过一
个速度比较慢的网络连接使用它。
16楼
【资料】Linux基础教程 第6章 Intranet
第6章 Intranet

本章要点:

本章介绍如何将Linux配置为Intranet/Internet服务器,如ftp,www服务器等等。

本章具体包括以下内容。

Internet名字服务器的配置

ftp服务器的配置

WWW服务器的配置

6.1 域名系统

域名服务即DNS系统,它可以让你在访问确定的机器的时候,无需给出IP地址而是利用
容易记忆的名字来处理问题。实际上,它有两种任务,将用户提出的名字翻译成IP地址
,或者从IP地址查出域名。

6.1.1 DNS的工作模式

DNS是一个庞大的分布式数据库系统,它使用树状结构来处理各种查询。首先,我们会
注意到,DNS名字是一些用点号分开的字符串,例如www.microsoft.com,这种名字通常
用一种虽不太准确却很容易的方式来理解,例如microsoft.com是.com下的一个“子域”
,而www.microsoft.com是microsoft.com的一个成员。所有DNS的共同祖先是".",称为
根域。

每个子域都应该有自己的名字服务器,或DNS服务器,例如,我们有一个.mydomain.c
om域,为了实现对域内的机器以及下层子域能够提供DNS服务,我们至少应该有一台域名
服务器来处理DNS请求。

下面我们看看DNS是如何工作的,假设我们的域名服务器是ns.mydomain.com,它用来
处理所有域内机器发出的DNS请求,这种DNS请求可以分成三种,一种是在mydomain.com
内部的名字,名字形式是(比如说)host1.mydomain.com;第二种是在mydomain.com之外
,比如说bbs.edu.cn;第三种是在mydomain.com下的一个子域内的一台机器,例如host
2.subdomain.mydomain.com。

ns.mydomain.com中应该包含所有名字为*.mydomain.com的机器的名字到IP地址的对照
关系,但是不包含*.subdomain.com的对照关系。所以,当DNS客户机器向它提出一个查
找host1.mydomain.com的请求的时候,它直接从本地数据库得到host1.mydomain.com的
IP地址信息并且送回。

当接收到一个类似于bbs.edu.cn的DNS查询请求的时候,DNS服务器将首先判断出它不
在本地域内部,为了得出一个结果,它有两个选择,一个是回答客户“我不知道,但是
你可以去问XXX服务器”;另外一个选择是自己去查询其他的DNS服务器,得到结果后再
传送给客户。第二种方式称为递归检索。

为了能够找到bbs.edu.cn的地址,ns.mydomain.com必须知道世界上其他服务器的地址
,这有两种方案,第一种是ns.mydomain.com一开始就知道一个更庞大的DNS服务器,所
有不懂的名字都交给它去查询,这种方式称为转发;另外一个方法更专业一点,首先,
ns.mydomain.com知道世界上某些最重要的名字服务器的地址,然后再从这些服务器开始
按照DNS的树状顺序查询。

举例来说,ns.mydomain.com发现自己不知道bbs.edu.cn的地址,但是它知道世界上有
一些“根”服务器,例如,a.root.net就是这样的一个服务器,其地址是198.41.0.4。
所以,它向198.41.0.4提出一个请求。

a.root.net在接受到这个请求之后,它也不知道这个名字到底在那里,但是由于bbs.
edu.cn看起来在.cn中,而它知道.cn的域名应该由ns.cnc.ac.cn负责,其IP地址是159.
226.1.1。于是它回答:“去问159.226.1.1,以后凡是.cn的请求你可以问它”。

接下来,ns.mydomain.com将会去询问ns.cnc.ac.cn,ns.cnc.ac.cn也不知道bbs.edu
.cn在那里,但是它知道edu.cn应该由dns.edu.cn负责,所以它回应:“edu.cn应该去问
dns.edu.cn,IP是202.112.0.35”。

当ns.mydomain.com询问dns.edu.cn时,终于得到了这个域名的正确地址:202.112.5
8.200。但是接下来,在返回信息之前,ns.mydomain将首先记忆自己所学到的知识:

凡是.cn的名字,去问159.226.1.1

凡是.edu.cn的名字,去问202.112.0.35

bbs.edu.cn的名字是202.112.58.200

它将这些信息记录在自己的文件中,以后当再有客户询问bbs.edu.cn时,它直接回答
:“我记得那是202.112.58.200”。

最后,返回查询结果。

当提问的是host2.subdomain.mydomain.com时,ns.mydomain.com将会首先看到subdo
main.mydomain.com应该由ns.subdomain.mydomain.com处理,所以去询问ns.domain.my
domain.com,其他和上面说的流程基本相同。

显然,由于ns.mydomain.com存储了查询到的知识,所以它也可以回答许多不应该由它
回答的信息,但是这些信息可能是错误的(因为名字到IP的对照关系可以更改)。这种
信息称为“非权威信息”。相反,有关host1.mydomain.com的信息它的知识肯定是正确
的。

为了提高域名服务的效率,通常一个子域内可以有多个域名服务器,这些服务器可以
分成三类,一类是确实记录了域内机器的名字信息的服务器,称为主(primary)域名服
务器;另一类也包含记录,但是它的信息是定期从主服务器来的,这种服务器的名字信
息也是权威信息,这种服务器称为从(secondary)域名服务器;还有一类简单地缓冲各种
查询信息,自己并不发布任何权威信息,这称为cache-only服务器。

6.1.2 bind 8 服务器配置

DNS服务器通常用named守护进程提供,不过它有一个怪异的名字,称为bind。由于历
史的原因,named有两个规范,分别称为bind 4和bind 8。我们研究的是bind 8,这是目
前的Linux发行版本中的named程序的标准。

要使用named程序,你需要安装bind软件包,我这里使用的是bind-8.2.1-7。

配置bind8首先需要处理/etc/named.conf文件,通常它由一串段落构成,我们这里只
能介绍最重要的部分。

让我们来看一个范例性的named.conf文件,在这个例子中,我们配置的是asnc.edu.c
n域的主域名服务器:

[root@openlab /etc]# cat named.conf

options {

directory "/var/named";

};


zone "." in {

type hint;

file "named.ca";

};


zone "0.0.127.in-addr.arpa" in {

type master;

file "named.local";

};

zone "asnc.edu.cn" in {

type master;

file "asnc.hosts";

};

zone "248.199.202.in-addr.arpa" in {

type master;

file "asnc.rev";

};

首先是options段落,它用于建立一些全局信息,这里的directory 信息告诉named程
序到哪里去找后面指出的那些文件。

每个zone段落定义一组查询信息,zone "."定义的是根信息,即DNS根服务器的信息,
接下来file "named.ca"给出了根文件的名字。

zone "0.0.127.in-addr.arpa"段落给出反向的域名解析信息,注意0.0.127.in-addr
.arpa"实际是定义的127.0.0.*的信息,也就是IP地址是反写的。type master表示这是
个主域名服务器。同样,这个定义文件在named.local。

zone "asnc.edu.cn" 给出*.asnc.edu.cn的信息,按照这里的定义显然相应的信息在
asnc.hosts文件中。相应地,zone "248.199.202.in-arpa"给出的是202.199.248.*的名
字信息,文件在asnc.rev。

上面提到的四个文件按照options段落应该位于/var/named,那么我们看一下这几个文
件:

[root@openlab named]# cat named.ca

. 3600000 IN NS A.ROOT-SERVERS.NET.

A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4

. 3600000 NS B.ROOT-SERVERS.NET.

B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107

. 3600000 NS C.ROOT-SERVERS.NET.

C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12

. 3600000 NS D.ROOT-SERVERS.NET.

D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90

. 3600000 NS E.ROOT-SERVERS.NET.

E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10

. 3600000 NS F.ROOT-SERVERS.NET.

F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241

显然,现在这个文件定义的是一些根服务器的地址。这个文件是在安装bind的时候自
动生成的,你也可以按照bind的文档自己去下载。由于根服务器可能会改变,你需要定
期下在这个文件。

接下来,我们可以注意named.local文件:

[root@openlab named]# cat named.local

@ IN SOA localhost. root.localhost. (

1997022700 ; Serial

28800 ; Refresh

14400 ; Retry

3600000 ; Expire

86400 ) ; Minimum

IN NS localhost.


1 IN PTR localhost.

这个文件由两个部分构成:SOA段落和名字记录。每个信息文件必须以一个SOA段落开
始。它定义了下面的名字记录应该如何理解和使用,一个@ IN SOA代表了SOA记录的开始
,现在的形式是:

@ IN SOA localhost. root.localhost. (

第一个localhost.表示这个SOA段落使用的是localhost机器,接下来的root.localho
st应该理解为root@localhost,表示DNS管理员的邮件地址。注意这些地址后面都必须加
上一个点号。加上结束点号的名字代表完整的主机名,而没有结束点号的名字将自动加
上zone里面定义的后缀。

括号内定义了一组信息,其中,最主要的是序列号信息,例如这里的1997022700,实
际上,其数值无关紧要,问题是次域名服务器需要根据这个数值判断文件的版本信息,
所以每次更改内容,你都应该将这个数值加大一点。

另外的几个信息是缺省的刷新时间,这个缺省值已经可以使用,通常你无需更改它们
,只有到最后的负载均衡部分我们才需要真正关心这个信息。

下面就是记录信息了,这里只有两个信息:

IN NS localhost

这是个NS记录,表示本域的域名服务器是localhost。

IN PTR localhost.

我们指出过named.local是一个反向查询用的信息文件,现在就是一个信息记录,PTR
表示这是一个反向解析记录,这里的PTR记录指出127.0.0.1的名字是localhost。注意这
里用的是1,因为后面没有点号,所以named会自动给它加上来自named.conf的后缀,在
这里就是.0.0.127,也就是组成1.0.0.127,反序之后就成为127.0.0.1。

下一个文件是asnc.hosts,它是:

[root@openlab named]# cat asnc.hosts

@ IN SOA openlab.asnc.edu.cn. wanghy.openlab.asnc.edu.cn.
(

1997022700 ; Serial

28800 ; Refresh

14400 ; Retry

3600000 ; Expire

86400 ) ; Minimum

IN NS openlab.asnc.edu.cn.

openlab IN A 202.199.248.6

mail IN A 202.199.248.11

www IN A 202.199.248.2

同样使用SOA段落开始,内容和刚才说的差不多。

NS之后就是A记录,A记录和PTR记录正好相反,是从域名解析IP地址用的记录。注意到
按照/etc/named.conf这个文件负责的是asnc.edu.cn域,而且openlab后面没有点号,所
以解释为openlab.asnc.edu.cn = 202.199.248.6。相应地,下面的两个记录也如此解释


最后是asnc.rev,它的内容对于我们现在很清楚了:

[root@openlab named]# cat asnc.rev

@ IN SOA openlab.asnc.edu.cn. wanghy.openlab.asnc.edu.cn.
(

1997022700 ; Serial

28800 ; Refresh

14400 ; Retry

3600000 ; Expire

86400 ) ; Minimum

IN NS openlab.asnc.edu.cn.

2 IN PTR www.asnc.edu.cn.

11 IN PTR mail.asnc.edu.cn.

6 IN PTR openlab.asnc.edu.cn.

177 IN PTR physics.asnc.edu.cn.

确认上述文件无误之后,可以启动named了。通常我们用/usr/sbin/ndc程序来启动na
med:

$ ndc start

new pid is 1289

出现这个信息说明named程序已经开始工作了。

要确认named的工作是否正确,使用nslookup程序:

$nslookup

Default Server: openlab.asnc.edu.cn

Address: 202.199.248.6


>

>是nslookup程序的提示符,在这里可以输入nslookup命令,比如,在刚才我们定义了
一个mail.asnc.edu.cn,其地址是202.199.248.11,那么,我们可以实验一下是否正确


> mail.asnc.edu.cn

Server: openlab.asnc.edu.cn

Address: 202.199.248.6


Name: mail.asnc.edu.cn

Address: 202.199.248.11

> 202.199.248.11

Server: openlab.asnc.edu.cn

Address: 202.199.248.6


Name: mail.asnc.edu.cn

Address: 202.199.248.11

显然,这个地址信息的添加是正确的,然后我们要测试一下对非本域的地址验证是否
正确,例如:

> www.gov.tw

Server: openlab.asnc.edu.cn

Address: 202.199.248.6


Name: service.gov.tw

Address: 210.69.2.1

Alias: www.gov.tw

这个操作要花费比较长的时间,因为要去查询非本地的名字服务器,但是如果你再次
查询这个信息,就会发生这样的情况:

> www.gov.tw

Server: openlab.asnc.edu.cn

Address: 202.199.248.6


Non-authoritative answer:

Name: service.gov.tw

Address: 210.69.2.1

Aliases: www.gov.tw

Non-auth.....这样的提示表示信息不是真正从对方的服务器来的,而是来自某个缓冲
服务的结果(在现在就是本地缓冲的结果)。

测试完毕后,输入exit退出。

一般情况下,DNS的工作信息可以在/var/log/messages中看到。

上面我们定义了一个主域名服务器,其实次要域名服务器的配置也差不多,不过,因
为次要域名服务是从主域名服务器得到数据,所以不需要配置asnc.rev和asnc.hosts文
件,相反,我们需要把zone中相应的部分改成:

zone "asnc.edu.cn" in {

type slave;

masters {202.199.248.2};

};


zone "248.199.202.in-addr.arpa" in {

type slave;

masters {202.199.248.2};

};

type slave说明这是个从域名控制器,masters子句给出了本域的主域名控制器的地址
,注意必须用花括号括起来,这是个非常容易犯的错误。

还可以定义cache-only控制器,这可以用type forward方式实现,如

zone "asnc.edu.cn" in {

type forward;

forwarders {202.199.248.2};

};

由于named的实现,每次修改名字解析文件(如asnc.hosts,asnc.rev等等)之后,需
要重新启动named,这可以用ndc restart命令实现。

前面我们曾经指出过,DNS是一种分级检索系统,那么,上级DNS如何知道下级DNS的信
息呢?举个例子来说,如果你申请了一个mydomain.com的域名,那么.com的服务器应该
如何注册它呢?

为了解释这个问题,我们看一个例子,这个例子的配置就是上面说的asnc.edu.cn域的
主DNS服务器,现在我需要建立一个子域lab.asnc.edu.cn,那么,注意新的asnc.hosts
文件(加粗体的是增加的部分):

[root@openlab named]# cat asnc.hosts

@ IN SOA openlab.asnc.edu.cn. wanghy.openlab.asnc.edu.cn.
(

1997022700 ; Serial

28800 ; Refresh

14400 ; Retry

3600000 ; Expire

86400 ) ; Minimum

NS openlab.asnc.edu.cn.

openlab IN A 202.199.248.6

mail IN A 202.199.248.11

www IN A 202.199.248.2

physics IN A 202.199.248.177

lab 134000 IN NS ns.lab.asnc.edu.cn.

ns.lab 134000 IN A 202.199.248.149

第一个加粗的行定义了一个子域,因为lab后面没有点,所以自动解释为lab.asnc.ed
u.cn。NS是名字服务器记录,这一行说明lab.asnc.edu.cn域的内容应该去ns.lab.asnc
.edu.cn域询问,134000是生存期,即这个名字在多长时间内不会改变,这个栏目是可选
的,缺省就使用前面的定义。注意如果在IN NS前面没有子域说明的话,就表示相应的名
字服务记录是对于本域的。例如IN NS 202.199.248.254将定义另一个对于asnc.edu.cn
域的域名服务器。

接着的一行定义了ns.lab机器的地址,这样,以后再有询问host.lab.asnc.edu.cn.的
时候,我们的DNS服务器将去查询202.199.248.149服务器。

显然,如果你做的是一个很大的公司的主域名控制器,那么你的名字服务器会缓冲许
多的信息,而且会忙于处理愚蠢的检索。为了解决这个问题,你可以将你的服务器设置
成为非递归的,这可以通过在named.conf中加入参数 recursion no子句来实现,通常r
ecursion是置为yes的。

在一般情况下,PTR和A记录是域名系统的主要数据,另外两种常见的记录类型是MX和
CNAME,MX记录我们放到电子邮件那一章去描述,而CNAME是某个A记录的别名,例如在a
snc.hosts中加入

www2 CNAME mail

表示www2.asnc.edu.cn是mail.asnc.edu.cn的另外一个名字。

注意有两种给一个地址赋以多个名字的办法,一种是用两个地址栏相同的A记录,另一
种是用CNAME,但是只有CNAME才能产生别名关系。这会在http server的设置中产生一些
影响,详细内容见WWW server那一节。

6.2 文件传输服务

文件传输即ftp服务,在各种intranet的服务中它应该是最容易配置的。一般来说,它
也非常容易管理。我们这里使用的是wu-ftpd和一些派生的ftp软件。实际上,如果要做
ftp站点,Linux是非常合适的,因为它的磁盘操作性能很高。

6.2.1 wu-ftpd的配置和管理

wu-ftpd是Linux缺省的ftp服务器,几乎每个Linux发行版本都会包含这个产品。通常
安装系统的时候就会安装这个软件,你可以用rpm –q wu-ftpd来检查是否安装了这个程
序。如果没有,你仍然可以自己安装这个产品。

wu-ftpd程序是通过inetd程序启动的,要使用它,你应该首先确定/etc/services文件
中包含这样一行:

ftp 21/tcp


然后确定/etc/inetd.conf包括这样的行:

ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a


重新启动inetd就可以提供服务了。

因为in.ftpd程序是通过/usr/sbin/tcpd程序启动,所以以前介绍的身份控制文件hos
ts.allow和hosts.deny程序对它仍然起作用。另外,ftp程序还有一些额外的身份检查。

前面我们指出过,/etc/passwd文件的最后一个栏目是用户的登录shell,即用户登录
完成后执行的第一个程序,在ftp服务器启动的时候,它检查用户的shell程序,并且和
/etc/shells文件列出的程序比较,只有在shell包含在/etc/shells里面的用户才能成功
登录ftp,否则将被弹回。

登录时的另外一个检查是用户名是否是anonymous或者ftp,如果是,那么in.ftpd程序
将认为这是一个匿名用户,这种情况下,它检查/etc/passwd中是否有名叫ftp用户,如
果存在,in.ftpd程序将用户放到ftp用户的宿主目录中,并且执行一个chroot命令,将
这个目录变成用户的根目录;如果不是匿名用户,那就把用户放到他的正确宿主目录中
,也不执行chroot命令。显然,由于chroot的作用,匿名用户无法越出ftp用户的宿主目
录,即使用连接也不行。但是这带来了一个问题,就是ftp用户无法访问/bin和/usr/bi
n,/lib,/usr/lib目录,因此无法使用UNIX命令。解决的办法是在匿名用户的根目录(
比如/ftp)下建立bin和lib目录,然后把最常用的一些命令拷贝到里面去,通常安装系
统的时候,安装程序会替你作这件事情,不过它是自动建立在/home/ftp下面,如果你更
改了ftp用户的目录,请把/home/ftp下面的bin和lib目录移动过去。

理解了wu-ftpd的工作方式之后,配置它就并不复杂了。wu-ftpd程序有一组配置文件
,最重要的是/etc/ftpaccess,这个文件决定了大部分的ftp服务器行为,另外,/etc/
ftpconversions,/etc/ftphosts,/etc/ftpusers,/etc/ftpgroups也很重要。

让我们先看一下/etc/ftpaccess的语法,通常ftpaccess支持下列的句子(注意,这里
只列出了绝对必须理解的句子,其他的你可以简单地使用缺省值。Linux的一大好处就是
配置可以在原来的文件上改来改去):

class

定义可以访问服务器的一类用户。格式是class [类名] [用户类型] [地址组]

类名是任意的字符串,用它来标志一个类,用户类型是用逗号分开一个列表,表中的
项目可以是anonymous,guest和real。anonymous就是匿名用户,real表示一切在服务器
上有实际账户的用户,而guest用户比较奇怪,它是用guestgroup限制的真实用户,一般
我们并不需要这个功能,如果你对此感兴趣,参考ftpd的文档。地址组是个通配符,表
示用户可以登录的地点。

例如,class myclass real * 将允许真实用户从任何地方登录服务器,而class hos
t anonymous 192.168.42.* 意味着允许匿名用户从192.168.42.0-255来登录;当然cla
ss all guest,real,anonymous * 意味着所有人可以从任何地方登录。

可以有任意多个class子句。

deny

禁止用户从某些主机登录。语法是deny [地址组] [信息文件名字],其中信息文件名
字是拒绝服务时显示的内容。例如,deny host1.edu.cn /ftp/message_deny将在有人试
图从host1.edu.cn启用本机的ftp服务时拒绝并显示/ftp/message_deny文件的名字。

如果想拒绝没有域名的机器登录,在地址组中使用 ! nameserved。

limit

限制某个类中的ftp连接数。例如,想限制myclass类中的连接不能超过10个,使用

limit myclass 10

注意limit还有两个可选的参数,时间参数用于设定限制生效的时间,其形式比较古怪
,你可以自己参考文档,不过我不认为这个有太大用处;另外一个参数是达到限制之后
拒绝连接所显示的文件,如上面的行可以改成

limit myclass 10 /ftp/toomanyopen

然后在/ftp/toomanyopen中写上“由于连接数已满,请稍候再连接”。

loginfails

设置用户可以重试密码的次数,语法是loginfails [次数]

banner

显示欢迎信息,这个信息将在登录提示之前显示。语法是banner [文件名]

email

如果系统出错,给谁发信,语法是email [邮件地址]。

message

设定一些条件,当发生这些条件的时候,向用户传递信息。语法是 message [信息文
件名] [条件] [适用的类]。其中条件可以是LOGIN或者CWD=[路径名],LOGIN表示登录成
功,CWD则是进入到某个目录。不过要注意当对匿名用户使用时,信息文件的路径名要相
对于ftp用户的宿主目录。

例如,定义匿名用户的类是ftp,然后希望匿名用户登录时显示/ftp/welcome,进入/
ftp/download目录时显示/ftp/help,而且ftp用户的宿主目录是/ftp,那么welcome和h
elp文件的相对路径名应该是/help和/welcome,所以可以写成:

message /welcome LOGIN ftp

message /help CWD=/download ftp

log commands

记录用户的命令,用法是log commands [用户类型]。例如,要记录所有用户输入的命
令,用log commands anonymous,real,guest

log transfers

记录用户进行的文件传输,语法是log transfers [用户类型] [传输类型],用户类型
就是anonymous,guest和real,而传输类型可以是inbound和outbound,表示两个传输方
向。例如

log transfers anonymous,guest,real inbound,outbound

记录文件在/var/log/xferlog。

chmod,delete,overwrite,rename

是否允许用户执行上述操作,语法类似于chmod [yes/no] [用户类型]。例如,想禁止
匿名用户和guest用户更改服务器上的文件,可以使用:

chmod no guest,anonymous

delete no guest,anonymous

overwrite no guest,anonymous

rename no guest,anonymous

compress,tar

这是两个古怪的功能,它可以允许一个文件在被下载之前先解压或者先压缩,语法有
点类似于compress [yes/no] [用户类型]。这样可以让没有tar或者gzip程序的用户也能
够展开这些文件,但是这需要配置/etc/ftpconversions文件。实际上现在这两个功能几
乎没有任何意义,你就自己看个乐子吧。man ftpconversions得到更多的信息。

passwd-check

对匿名用户的口令检验的方式,格式是passwd-check [规则] [处理方式]。规则可以
是三个选项之一,即none,trial或者rfc822。如同你知道的那样,匿名ftp登录的时候
需要输入一个email地址作为口令,none表示根本不进行检验,trial表示这个地址中至
少要有一个@符号,rfc822要求最严,要求必须看上去是一个正确的email账号(然而,
反正任何人都可以编造一个假的,不是吗?)。处理方式可以是warn或者enforce。在w
arn的情况下,输入不合法信息的匿名用户仍然可以登录,但是会显示一条错误信息,而
enforce将强迫你输入一个合乎规则的字符串。

upload

指定匿名用户上传文件的方式,语法是upload [目录] [上载位置] [yes/no] [uid]
[gid] [mode] [dirs/nodirs]

目录是这个upload子句影响的目录,通常我们直接把它设置成匿名用户的宿主目录;
上载目录是相对于前面定义的那个目录的上载目录的位置,yes或no这个开关设定[上载
位置]目录是否可以上载,uid/gid/mode表示上载后文件的属主,组名和属性,dirs/no
dirs则确定用户是否可以在这个目录里建立子目录。

例如,匿名用户的宿主目录为/ftp,要把/ftp/incoming当成上载目录,而且可以建立
子目录,上传的文件属于ftp,组为ftp,属性0644,允许创建目录,那么可以设置

upload /ftp /incoming* yes ftp ftp 0644 dirs

注意/incoming*,这表示incoming各个子目录也可以上载。

为了使上载成功,需要将/ftp/incoming的属性设置为0777。

下面是一个范例性的ftpaccess文件:

class all real,guest,anonymous *

email root@localhost

loginfails 5

message /welcome.msg login

message .message cwd=*

compress yes all

tar yes all

chmod no guest,anonymous

delete no guest,anonymous

overwrite no guest,anonymous

rename no guest,anonymous

log transfers anonymous,real inbound,outbound

passwd-check rfc822 warn

upload /ftp /incoming* yes ftp ftp 0644 dirs


下一个比较重要的配置文件是/etc/ftphosts,它用来定义一些地址可以或者不能使用
ftp,语法是allow [用户名] [地址表] 或者 deny [用户名] [地址表],例如allow us
er1 10.0.0.0/8。

/etc/ftpusers用来定义禁止使用ftp服务的用户,例如,在/etc/ftpusers中写上roo
t一行将禁止root用户使用ftp。

6.2.2 其他的服务器

wu-ftpd是最常用的ftp服务器程序,但是,也存在许多其他的ftp服务程序,例如pro
ftpd和beroftpd。

BeroFTPD实际是wu-ftpd的一个衍生程序,实际上,它和wu-ftpd几乎是一样的,但是
支持一些新的功能。例如限制用户每次下载的字节数等等,组管理,虚拟服务器等等。
要使用BeroFTPD,必须先安装这个产品,我们不想详细地介绍这个产品,你应该下载它
的源代码并且自己编译这个程序,与wu-ftpd的主要差别在于你必须谨慎地配置它的各个
目录。特别地,我们总是建议自己编译源代码:

./configure

make

make install

BeroFTPD的配置文件和wu-ftp兼容,如果你愿意,可以直接把原来的/etc/ftpaccess
文件拷贝到/etc下面,然后更改/etc/inetd.conf文件,将有关ftp的行改成:

ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/BeroFTPD

BeroFTPD是编译出的服务程序的名字。然后重新启动inetd就可以工作了。不过必须注
意,BeroFTPD不使用/etc/ftpusers文件!

BeroFTPD有一些非常详细的手册页面,如man ftpd,man ftpaccess等等,如果需要进
一步了解它的功能,可以参考联机手册。

另外一个非常常用的服务器程序是proftpd,详细的资料请自己参考其文档。
17楼
【资料】Linux基础教程 6.3 WWW服务器
6.3 WWW服务器

现在要开始我们的重点内容了:www server。目前能做www server的程序很多,在UN
IX下较常见的免费服务器就有很多种,例如NSCA,Apache等等。我们讨论的将是世界上
最常用的一种,即Apache Server。

6.3.1 Apache服务器

按照apache开发组的说法,Apache代表“A patched Server”,因为它是在更古老的
一些服务程序上通过一连串的补丁开发出来的。除非你买的是sun那样的系统,否则几乎
每个UNIX发行商都可以免费提供apache的源代码或者是可以安装的软件包。几乎所有的
Linux发行版本都会附带apache的软件包或者源代码,当然你也可以到任何能够提供UNI
X系统应用的ftp站点去下载这个东西,所以我不想告诉你如何去下载它的代码了。

可以取得的apache软件包可以是目标代码形式或者源代码方式,我们这里假定你用的
是rpm包,例如redhat或者turbo Linux附带的apache rpm包。以下说明的内容将适用于
这种rpm的缺省设置,特别是缺省目录设置,在后面我们将解释apache的编译,在那里我
们将讨论目录设置和模块设置等功能。

Apache的缺省配置文件放在/etc/httpd/conf下面,在较早的版本中,配置被分成几个
文件,如/etc/httpd/conf/httpd.conf,/etc/httpd/conf/srm.conf和/etc/httpd/con
f/access.conf。在较新的apache版本中,建议你只使用一个配置文件,即/etc/httpd/
conf/httpd.conf。我们将主要的讨论比较新的这种配置方式。我的版本是apache-1.3.
9。特别需要注意的是,如果你的系统配置目录中除了httpd.conf之外还有srm.conf和a
ccess.conf的话,那么系统缺省要去察看这两个文件。因此,建议你将这两个文件从系
统上删除。

/etc/httpd/conf/httpd.conf文件相当长,我们首先介绍基本的内容,在设置apache
的工作中,第一个任务是设置html文档的位置。

新的httpd.conf一般被分成几个段落,第一部分是全局变量的位置,按照我们习惯的
方式,将在缺省的httpd.conf上进行必要的修改,下面列出一些我们比较感兴趣的选择


ServerType

这个选项用来设置你的apache如何启动,它有两个选择,即standalone和inetd。sta
ndalone表示你的服务器程序是直接作为服务器守护进程启动,而inetd表示apache服务
器将在inetd程序中启动。一般我们总是建议用standalone方式,因为inetd在请求较多
的时候会出现一些问题。即使用ServerType standalone子句。

ServerRoot "/home/httpd"

设置Apache的缺声运行路径。不过,除非你在某些配置选项中使用相对路径,否则它
从来不会影响什么。

ErrorLog

CustomLog


这两行设置缺省的记账文件的位置,errorlog和customlog分别是出错信息和正常工作
信息的记录地点,例如

ErrorLog /var/log/httpd/error_log

CustomLog /var/log/httpd/access_log common

Port

这个参数指明http服务器使用的端口,缺省值是80,当然你也可以选择其他的端口,
但是这意味着你在连接的时候必须明确地指出使用的端口。

范例:

Port 80

User

Group

设置服务器运行时使用的身份,通常我们为了安全,总是要把它设置成nobody,如:

User nobody

Group nobody

ServerAdmin

这个选项用来设置当服务器出现问题时,用来反馈问题的邮件地址,例如

ServerAdmin webmaster@mydomain.com


ServerName

通常apache服务器会从域名服务信息中得到服务器的域名,但是你也可以使用这个选
项来避免域名服务器出错时apache失效。例如

ServerName www.mydomain.com

DocumentRoot

这个选项设置缺省的服务器使用的html文件的位置,例如:下面的一行

DocumentRoot "/home/httpd/html"

意味着 http://www.mydomain.com/xxx.html 被解释为/home/httpd/html/xxx.html。

ScriptAlias

定义CGI脚本目录,例如

ScriptAlias /cgi-bin/ “/home/httpd/cgi-bin”

定义CGI脚本应该放在/home/httpd/cgi-bin/目录下,而反映在浏览器中的目录是/cg
i-bin/。

DirectoryIndex

这个选项定义缺省的主页文件,例如,DirectoryIndex index.html意味着http://ww
w.mydomain.com/将显示/home/httpd/html/index.html。

index.html

Alias

建立目录别名,例如

Alias /ftp/ “/home/httpd/html/ftp/”

UserDir

用宿主目录作为html目录。参考6.3.2节。

AccessFileName

定义身份控制的文件名,通常总是设置成为AccessFileName .htaccess

AddType

AddHandler

这两个选项用来加入各种文件映射,或者说MIME类型。通常AddType设定某种特定的文
件类型对应某个特定的扩展名字,而AddHandler则为这种类型定义一个处理程序。例如
,AddHandler cgi-script .cgi表示无论在什么地方,凡是看上去是一个.cgi的扩展名
的程序就作为CGI脚本执行(应该避免,对吗?不过对于那些~user的目录你可能只能用
这个办法了。好在还有一个options ExecCGI也对可以执行cgi的目录进行限制)

另外的一个常用的设定是

AddType text/html .shtml

AddHandler server-parsed .shtml

这两行允许服务器处理那些.shtml并且将它翻译成html送出。

显然,我们现在的任务主要是修改DocumentRoot和ScriptAlias,DirectoryIndex,写
一个简单的html文件,放到缺省的主页目录里,例如/home/httpd/html/index.html,设
置其属性为755,然后就可以启动apache了:

/usr/sbin/apachectl start

或者

/usr/sbin/httpd

如果是重新启动apache,执行/usr/sbin/apachectl restart或者killall –HUP ht
tpd。然后在浏览器中就可以实验页面服务是否可以使用了。如果apache抱怨找不到htt
pd.conf,可以执行

httpd –f /etc/httpd/httpd.conf


6.3.1 目录管理

如同其他所有的网络服务一样,Apache同样使用各种安全性控制,例如存取地址控制
和身份控制。这里我们先讲地址和目录控制。

Apache将目录作为单元来进行存取控制,每个目录在/etc/httpd/conf/httpd.conf中
使用一个段落,首先的是/目录,这实际是设置缺省值:

<Directory />

Options FollowSymLinks

AllowOverride None

</Directory>

每个段落都是由这样的两组尖括号构成的行夹起来的,其中最主要的句子是Options,
AllowOverride,Allow/Deny,Order等。

Options

这个子句用来说明一些主要的设置,目前可以使用的设置有Indexes,Includes,Fol
lowSymLinks,ExecCGI,MultiView,当然还有两个最简单的选择就是None和All。None
是禁止所有选择,而All允许上面的所有Options。一般我们主要关心的是Indexes和Fol
lowSymLinks。Indexes是设定是否允许在目录下面没有index.html的时候显示目录,而
FollowSymLinks决定是否可以通过符号连接跨越DocumentRoot。例如,尽管/ftp不在/h
ome/httpd/html下面,但是我们仍然可以使用符号连接建立一个/home/httpd/html/ftp
使得可以直接输入http://mydomain.com/ftp来访问这个目录。

使用FollowSymLinks的办法很简单,就是首先在合适的目录段落里面Options Follow
SymLinks,(符号连接的上层就可以)然后建立一个别名:

Alias /ftp/ “home/httpd/html/ftp/”

后面的是你建立的到/ftp的符号连接。注意这一行应该位于所有目录段落之外。

AllowOverride

AllowOverride定义是否允许各个目录用目录中的.htaccess(后面解释)覆盖这里设定
的Options。它的选择有Options,FileInfo,AuthConfig,Limit或者它们的组合,当然
还有None和All。

由于/是缺省设置,所以这里没有设置太多的内容,相反,我们应该在/之后独立设置
各个目录的控制,例如:

<Directory "/home/httpd/html">

Options Indexes FollowSymLinks

AllowOverride None

Order allow,deny

Allow from all

</Directory>

出现了两个新的选项:Order和Allow。

Order

它有两种用法,即Order allow,deny或者Order deny,allow。简单地说,它用来设置
是先执行deny还是先执行allow,例如,Order deny,allow意味着先看deny行,再看all
ow行,这样如果deny from all再allow from 202.112.58.0/24后来的allow子句就会超
越deny而对202.112.58.x打开访问。

Allow/Deny from

这两个选项和Order一起使用,Allow允许某个地址来的连接请求,Deny则禁止这个请
求,例如在Order deny,allow的情况下,Deny from all,Allow from 192.168.12.0/
24表示只有192.168.12.x的用户可以访问这个目录。


现在我们来看看下面的一个设定:

UserDir public_html

<Directory /home/*/public_html>

AllowOverride FileInfo AuthConfig Limit

Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

<Limit GET POST OPTIONS PROPFIND>

Order allow,deny

Allow from all

</Limit>

<Limit PUT DELETE PATCH PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>

Order deny,allow

Deny from all

</Limit>

</Directory>

这个有什么用处?UserDir是一个特殊的选项,用来在用户的宿主目录下设置主页,比
如,有一个名字叫wanghy的用户,其宿主目录是/home/wanghy,而且UserDir象我们刚才
那样设定,那么,你可以在浏览器中输入http://www.mydomain.com/~wanghy,它将对应
的是宿主目录+UserDir,也就是/home/wanghy/public_html。当然,为了使这个功能生
效,你得将这个目录设置为大家都可以读。(现在知道http://xxx.net/~yourname是怎
么回事了吧,:PP)

下面的行就是对这个功能的限制,注意要使得某人的这个功能生效,必须有这个段落
,这个段落里别的东西都是熟知的,唯一新的东西是Limit段,它用来提供存取限制,例
如<Limit GET POST>对应的段落设置GET和POST权限,诸如此类。上面的段落表示所有人
都可以通过www进行GET和POST,而任何人都不能PUT和DELETE、MOVE等等。

Limit

对某个路径进行存取限制。

6.3.2 proxy系统

Proxy就是代理,简单地说,客户机器把请求转发给服务器,服务器代替客户机器进行
Internet访问,将访问回来的结果再回送给客户机。通常我们说的Proxy有好几种,工作
方式也不同。例如,最常用的Proxy方式是服务器打开一个端口,在这个端口上接受客户
的请求,然后自己代替客户机器进行访问。这种方法不需要在客户端安装特殊的软件,
一般的浏览器都可以支持这种功能,缺陷是只能代理标准的一些服务,如WWW,FTP等等;
另外一种方法是在客户端安装专用的软件,然后应用软件通过这个代理工具提供的接口
与服务器联系;当然还有另一种最简单的办法就是IP伪装。我们这里介绍的Proxy是第一
种,即Apache本身提供的Proxy系统。这个代理系统可以将代替服务器取得的内容在服务
器硬盘上存贮起来,以后再有客户访问的时候可以直接从硬盘上取回,因此可以节省网
络流量并加快客户的访问速度。

要启动Apache的Proxy倒是非常的简单,只要在httpd.conf里面加上这样几行:

ProxyRequest ON

Listen 8080

CacheRoot /var/cache

然后在你的客户浏览器(比如IE)里面将代理服务器设置成你的Apache机器,端口号
8080就可以了。不过这时的Proxy由于Cache太小没有什么实际意义,我们现在来看一看
和Proxy相关的设置,按照我们的习惯,只列出有趣的内容:

ProxyRequest

它的值为ON的时候,启动Proxy功能

ProxyRemote

级联Proxy。例如你已经有了一个proxy1.mydomain.com的Proxy服务器,现在想让pro
xy2.mydomain.com来直接用proxy1代理,可以使用

ProxyRemote http://proxy1.domain.com:8080

ProxyPass

这个选项的意思比较古怪。例如你有一台www.mydomain.com的apache服务机器,另外
还有一个www2.mydomain.com也是个www服务器,然后你加上一行

ProxyPass /www2/ http://www2.mydomain.com/

那么以后访问http://www.mydomain.com/www2/就会直接将请求转发给www2,www2目
录看上去是一个本地映像。(这个到底有什么用处?你就当找个乐子吧)

ProxyBlock

一个有点恶心的功能,用来阻挡到某些站点的访问,例如ProxyBlock someone.com s
omefool.com将会断掉*.somefool.com,someone.com甚至someone.com.cn的访问。这里
的字符串都是匹配子串的方式使用的。

NoProxy

设置你对哪些站点的内容不使用Proxy。通常你显然不愿对同一局域网内的东西进行代
理,所以这个选项一般总是列出你自己内部网的地址。在它的地址列表里面可以使用同
配符和子网的形式,例如:

NoProxy .mydomain.com 192.168.12.0/24

ProxyVia

这个选项表示是否在返回内容中说明已经使用了代理,如果你使用级联代理,需要把
它设置成ON。

例如

ProxyVia on

CacheForceCompletion

这个选项用来设置一种特殊情况,就是客户的请求快要完成的时候却取消了,服务器
是否应该将未传完的内容保存,这个选项取一个0到100之间的数字,一般取为70,意思
是传递量超过70%的页面就应该缓冲。例如:

CacheForceCompletion 70

CacheRoot

存放缓存文件的位置,例如:

CacheRoot /var/cache

CacheSize

允许使用多少硬盘空间作为Cache。单位是KB。例如

CacheSize 200000

CacheGcInterval

每隔一段时间,Apache会检查cache目录,删除超过Cache空间的文件以便释放硬盘空
间。单位是小时,例如

CacheGcInterval 24

CacheMaxExpire

最大的Cache有效期。如果Cache中的文件的存放时间已经超过了这个有效期,那么再
访问这个页面的时候,apache将重新去下载对应页面。

CacheLastModifiedFactor

很难说清这个选项的含义,缺省的值是0.1,你只要按照这个值设置就没有问题了。例


CacheLastModifiedFactor 0.1

CacheDefaultExpire

对于那些不支持内容有效期的协议,使用这个值作为缺省的有效期,例如

CacheDefaultExpire 1

NoCache

类似于NoProxy和ProxyBlock,定义一个不进行本地缓存的列表,例如

NoCache Freemail.263.net

Listen

缺省的http和Proxy服务端口是80和8080。但是你可以定义一些其他的端口接收信息,
例如

Listen 8080

Listen 8081

Listen 192.168.12.21:8080

这个选项在做端口虚拟主机的时候也有用。


6.3.3 虚拟主机

随着Apache的流行,虚拟主机已经变得没有那么神秘了。流行的虚拟主机有几种,例
如,对每个虚拟主机分配一个IP,或者是一个主机端口,当然更好的方法是分配一个IP
对应多个域名,然后根据域名来提供正确的相应。

做一个基于IP的虚拟主机是最简单的。按照我们在前面提出的办法,给你的Apache服
务器提供几个IP,例如192.168.1.2,192.168.1.3,。。。,然后对每一个IP使用一个
这样的段落:

<VirtualHost 192.168.1.2>

DocumentRoot /home/httpd/html/www1/doc

ServerName www1.yourdomain.com

ScriptAlias /cgi-bin/ /home/httpd/html/www1/cgi-bin

</VirtualHost>

以后浏览192.168.1.2的内容就是/home/httpd/html/www1/doc/index.html的内容了。
有几个虚拟主机,就写上几个VirtualHost段落,注意这时候主机也必须是一个Virtual
Host。

在VirtualHost段落中,ErrorLog,CustomLog,DocumentRoot,ServerName,Script
Alias和ServerAdmin选项仍然可以使用,而User和Group选项必须SuEXEC附加模块的支持


然后要明确地启动Listen,例如:

Listen 192.168.1.2:80

Listen 192.168.1.3:80

每个地址Listen一次,这样就可以使用虚拟主机了。

也可以使用端口虚拟主机,不过我认为这意义不大,因为客户必须明确地给出服务器
的运行端口。

IP虚拟主机实际并不是一个特别好的功能,因为它需要为每一个虚拟主机提供一个IP
别名,对于IP地址比较紧张的商业单位,名字虚拟主机通常更有意义。

名字虚拟主机是为一个IP地址分配若干个域名记录,例如192.168.1.2可以同时设置为
www1.mydomain.com,www2.domain.com,等等,也就是在域名解析记录中写上:

www1 IN A 192.168.1.2

www2 IN A 192.168.1.2

而在域名的反向查询文件中加上对应的PTR记录:

2 IN PTR www1.mydomain.com.

2 IN PTR www2.mydomain.com

然后,根据对不同名字的请求,服务器将发回不同的页面。

要实现这个功能,假定你已经完成了DNS记录的设置,然后只要在httpd.conf中加入这
样的一行:

NameVirtualHost 192.168.1.2:80

这一行告诉服务器把192.168.1.2当成一个名字虚拟主机。然后,可以类似地设置虚拟
主机目录,只是这个时候需要使用的是名字来标示虚拟主机:

<VirtualHost www1.mydomain.com>

DocumentRoot /home/httpd/html/www1/doc

ServerName www1.yourdomain.com

ScriptAlias /cgi-bin/ /home/httpd/html/www1/cgi-bin

</VirtualHost>

这样就定义了一个名字虚拟主机。其他的虚拟主机入口可以同样地设置。

注意:如果你要使用名字虚拟主机,那么请记住:你需要用A记录定义多个主机名字,
而不是用CNAME来建立别名。CNAME建立的名字实际访问的时候仍然是原来的名字。

电脑版 Page created in 0.0781 seconds with 4 queries.