当前位置:Linux教程 - Samba - samba - 第5章局域网服务器

samba - 第5章局域网服务器

第5章局域网服务器
2004-04-23 15:18 pm
来自:Linux文档
现载:Www.8s8s.coM
地址:无名

本章要点:

本章介绍如何将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

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服务。

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的远程使用非常消耗网络带宽,所以不要指望用它来执行视频程序,或者通过一
个速度比较慢的网络连接使用它。