当前位置:Linux教程 - Linux - Linux网络管理员手册(12)

Linux网络管理员手册(12)



         翻译:赵炯
    [email protected]


    第十二章 管理Taylor UUCP


    12.1 历史回顾
    UUCP是AT&T贝尔实验室的Mike Lesk在七十年代末期设计的,用于在公共电话线路上提供简单的拨号上网服务。由于许多想在自己的机器上有email和Usenet News的人仍然使用modem进行通信,所以UUCP仍然很流行。尽管有运行于各种类型的硬件平台和操作系统上的许多实现版本,然而它们在很高的程度上是兼容的。
    然而,尽管在过去的这些年中有许多软件以各种方式已成为“标准”,还没有一个UUCP软件被称为UUCP的。自从在1976年第一个版本实现以来,它经历了一个稳固的演变过程。目前,存在着两个主要种类,它们在硬件支持和配置上是不同的。它们都有各式各样的实现,每种实现都有一些细微的差别。
    其中一类就是所谓的“版本2 UUCP”,它是Mike Lesk、David A. Novitz和Greg Chesson于1977年实现的。尽管这是一个很老的版本,但仍然被经常使用。版本2的近期实现提供了更新的UUCP种类的易用性。
    第二种是于1983年开发的,并且通常被称为BNU(基本连网工具)、HoneyDanBer UUCP,或简称为HDB。这个名称产生自作者的名字,P. Honeyman、D. A. Novitz和B. E. Redman。HDB考虑到了排除版本2 UUCP的某些不足之处。例如,增加了新的传输协议并且针对每个与之有UUCP通信的站点都有一个独立的目录。
    目前随同Linux发行的UUCP实现是Taylor UUCP 1.04,[1]本章即基于这个版本进行讨论。Taylor UUCP 版本1.04是于1993年2月发布的。除了传统的配置文件以外,Taylor UUCP也可被编译成使用新的样式 – a.k.a.“Taylor”—配置文件。
    最近发行了1.05版,并且不久就将融入大多数Linux发行版中。这些版本的不同之处主要在于你不太会使用到的特性上,所以你可以使用本书中的信息来配置Taylor UUCP 1.05版。
    对于包含在许多Linux发行中的Taylor UUCP,它通常被编译成BNU兼容的,或者是使用Taylor配置方案的,或者间而有之。由于后者更具灵活性,并且可能比经常是晦涩的BNU配置文件易于理解,所以下面我将介绍Taylor配置方案。
    本章的目的不是给你一个对UUCP命令的命令行选项是什么和怎么使用的详尽描述,而是给你一个对如何设置一个可使用的UUCP站点的概要介绍。第一部分给出了有关UUCP是如何实现远程执行和文件传输的一个简要说明。如果对于UUCP,你不是一个完全的新手的话,你可以跳过这一部分而直接到UUCP的配置文件部分,该部分解释了用于设置UUCP的各种文件。
    然而,我们将假设你对UUCP套件的用户程序很熟悉。这些程序是uucp和uux。有关这两个命令的介绍,请参见在线手册页。
    除了通常使用的uux和uucp程序,UUCP套件还包含了仅用于管理目的的一系列命令。它们用于监视通过你的节点的UUCP通信、删除老的日志文件或者汇总统计参数。这里将不对它们进行任何说明,因为它们与UUCP的主要任务是并行的。而且,它们有很好的文档可作参考并且很容易理解。不过,还有一类,它们是由UUCP实际的“工作机器”组成。它们被称为uucico(这里cico代表copy-in copy-out)和uuxqt—用于执行远程系统发送来的作业。
    12.1.1 有关UUCP的更多信息
    对于不能在本章中找到所要信息的人,应该阅览随该软件包而来的文档。这是描述使用Taylor配置方案进行设置的一打texinfo文件。可以分别使用tex和makeinfo将texinfo转换成DVI和GNU信息文件。
    如果你想使用BNU或者甚至是(令人战栗的)版本2配置文件的话,这里有一本很好的书,“管理UUCP和Usenet”([Oreilly89])。我发现它非常有用。其它有关Linux上UUCP的很好的信息来源是Vince Skahan的UUCP-HOWTO,它是定期地投递到comp.os.linux.announce上的。
    当然还有一个专门讨论UUCP的新闻组,叫做comp.mail.uucp。如果你有针对Taylor UUCP的问题,你最好在那里去问他们,而不要在comp.os.linux组中。

    12.2 概述
    12.2.1 UUCP传输和远程执行的概要
    对于理解UUCP至关重要的概念是作业(jobs)。用户使用uucp或uux发起的每一个传输被称作一个作业。它是由在远程系统上执行的命令,以及将要被在站点间传输的文件集构成。当然,可以省略其中一部分。
    作为一个例子,假设你在你的主机上发出了下面的命令,该命令使得UUCP将文件netguide.ps拷贝到主机pablo上,并且使得它执行lpr命令来打印这个文件。

    $ uux –r pablo!lpr !netguide.ps

    UUCP通常不会立刻调用远程系统来执行一个作业(不过你可以使用kermit来做到)。而是临时地将该作业描述存储起来。这称为假脱机操作(spooling)。作业所存放的目录树因此也就称为假脱机目录(spool directory)并且通常位于/var/spool/uucp中。在我们的例子中,该作业描述含有将被执行的远程命令(lpr)的有关信息、要求进行该操作的命令以及其它一些项目。除了这个作业描述,UUCP也需要存储输入的文件netguide.ps。
    假脱机文件所在的确切位置和命名方法是可以不同的,这依赖于一些编译时的选项。HDB兼容的UUCP通常将假脱机文件存储于命名为/var/spool/uucp/site的目录中,这里site是远端站点的名称。当以Taylor配置方式编译时,UUCP将针对不同类型的假脱机文件在指定站点的假脱机目录下再创建子目录。
    在规定的时间间隔,UUCP将向远程系统拨号。当与远程系统的连接建立后,UUCP就会传输描述作业的文件,加上所有的输入文件。输入的作业不会立刻被执行的,而要到连接结束关闭之后。这是用uuxqt来执行的,如果有指定到其它站点的作业,它也处理这些作业的转发工作。
    为了区分重要的和不很重要的作业,UUCP给每个作业指定了一级别(grade)。这是一单个字母,范围从0到9、A到Z以及a到z,级别从大到小。Mail通常以级别B或C进行假脱机操作,而news则以级别N进行假脱机操作。级别越高的作业传输的越早。级别可以在调用uucp或uux时用-g标志来指定。
    你也可以在一定时间内禁止低于某级别的作业的传输。这称为在对话期间所允许的最大假脱机级别(maximum spool grade),缺省值是z。这里请注意术语上的含糊不清:一个文件将被传输当且仅当它的级别等于或高于最大假脱机级别。

    12.2.2 uucico的内部工作机制
    要理解为什么uucico需要知道某些事情,这里给出了它实际上是如何连接至远程系统的一个快速描述。
    当你在命令行上执行uucico –s system时,它首先必须进行物理连接。所进行的操作起决于所打开的连接类型 – 例如,当使用电话线时,它必须找到一个modem,并且进行拨号。而在TCP上,它就必须调用gethostbyname(3)将名字转换为一个网络地址、找出要打开那一个端口,并且将该地址绑定于相应的套接字(socket)上。
    在这个连接被建立起来后,接下来必须通过一个认证过程。这常常是由远程系统询问一个登录名字以及一个可能的密码组成。这通常被称为登录对话(login chat)。认证过程或者是通过通常的getty/login套件执行的,或者是由uucico自身在TCP套接字上完成的。如果认证成功的话,远端系统就会启动uucico。初始化连接的本地uucico拷贝被视作主端(master),远端的则作为从端(slave)。
    接下来是握手阶段(handshake phase);主端现在发出自己的主机名,加上几个标志,从端检查这个主机名的登录许可,发送和接收文件等等。这些标志用于描述(以及在其它一些事情中)被传输的假脱机文件的最大级别。如果使能的话,这里将会进行一个对话计数,或调用序列号的检查。使用这个特性,两端站点就维持有一个成功连接的计数,可用于进行比较。如果它们不匹配的话,握手过程就失败了。这对于保护你免受冒充者是很有用的。
    最后,两个uucico试着达成一个共同的传输协议。这个协议指导数据被传输的方法、检查一致性并且在出错时进行重传操作。针对所支持的不同的连接类型需要有不同的协议。例如,电话线路要求有一个对于出错保守的“安全”协议,而TCP传输天生就是可靠的因此可以使用一个更为有效的无须附加出错检查的协议。
    在握手阶段完成以后,就开始进行实际的传输阶段。传输两端开启所选的协议驱动程序。驱动程序一般还要进行与该协议相关的初始化过程。
    首先,主端将发送假脱机级别足够高的排于队列中的所有文件到远程系统中。当它完成传输后就会通知从端,此时从端就可以挂断了。现在从端可以或者同意挂断,或者将对话控制权接过来。这是一个规则的变化:现在远程系统变成了主端,而本地则变成了从端。新的主端现在发送它的文件。当完成后,两个uucico互相交换传输消息,并关闭连接。
    我们将不再进行更为详细的描述:请参阅代码或任何针对于此的有关UUCP的好书。在网上也还流传着一篇很古老的文章,是由David A. Novitz写的,它给出了UUCP协议的详细描述。Taylor UUCP FAQ也讨论了UUCP实现方法的某些细节。它被定期地投递到comp.mail.uucp上。

    12.2.3 uucico命令行选项
    本节描述uucico的一些最重要的命令行选项。有关完整的命令行选项列表,请参阅uucico(1)手册页。

    -s system 呼叫指定的系统(system)除非受到呼叫时间的限制。

    -S system 无条件地呼叫指定的(system)。

    -r1 以主端(master)模式启动uucico。这是在给出-s或-S时的缺省值。如果只有该选项,该-r1选项将致使uucico试尝呼叫sys中的所有系统(systems),除非受到呼叫限制或重试次数限制。

    -r0 以从端(slave)模式启动uucico。这是在没有-s或-S给出时的缺省值。在从端模式中,或者是标准的输入/输出被假设连接至一个串行端口,或者是使用由-p指定的TCP端口。

    -x type,-X type 开启指定类型的调试。可以用逗号分开的一个列表指定几种类型。以下类型是有效的:abnormal,chat,handshake,uucp-proto,proto,port,config,spooldir,execute,incoming,outgoing。为了与其它UUCP实现方式的兼容,可以用一个数字代替,该数字开启上面列表中的头n项。

    调试信息将被记录在/var/spool/uucp文件Debug中。

    12.3 UUCP的配置文件
    与简单的文件传输程序相比,UUCP被设计成能够自动地处理所有的传输操作。一旦被正确地设置好,就无须管理员每日进行干预了。操作所需要的信息被保存在/usr/lib/uucp目录下的几个配置文件中。这些文件大多数用于拨出操作中。

    12.3.1 Taylor UUCP简介
    要是说UUCP的配置很难,这只是一种保守的说法。实际上它是一个错综复杂的问题,并且有时候配置文件简明的格式并没有使得问题变得更容易些。(尽管与HDB或版本2中的老式格式相比较,Taylor格式几乎是很容易阅读的)。
    为了给你一个这些文件是如何相互作用的感觉,我们将向你介绍一个非常重要的文件,并对这些文件的样本进行观察。现在我们将不解释各种细节问题;更精确的描述将在下面各个独立小节中给出。如果你想在你的机器上设置UUCP,你最好是从某些样本文件开始,并逐渐地对样本文件加以调整。你可以或者采用下面示出的,或者采用那些包含在你的Linux发行版本中的样本文件。
    本节描述的所有文件都存储在/usr/lib/uucp或其中的一个子目录中。有些Linux发行版含有UUCP执行文件,它们对HDB和Taylor配置都支持,并且对每种配置文件集使用不同的子目录。在/usr/lib/uucp中通常有一个README文件。
    为了让UUCP能正常地工作,这些文件必须为uucp用户所有。其中某些文件含有密码和电话号码,因此应该有600的许可权限。[2]
    最主要的UUCP配置文件是/usr/lib/uucp/config,并用于设置通常的参数。其中最重要的(并且到现在为止,也是仅有的),是你的主机的UUCP名字。在虚拟酿酒厂,他们使用vstout作为他们的UUCP网关:

    # /usr/lib/uucp/config – UUCP main configuration file
    hostname vstout

    另一个重要的配置文件是sys文件。它含有你将连接站点的所有系统方面的信息。这包括站点名字以及连接本身的信息,比如当使用modem连接时的电话号码。一个以modem连接的称为pablo站点的典型内容将是
    图12.1: Taylor UUCP配置文件之间的相互关系。

    # /usr/lib/uucp/sys – name UUCP neighbors
    # system: pablo
    system pablo
    time Any
    phone 123-456
    port serial1
    speed 38400
    chat ogin: vstout ssword: lorca

    port指定了所使用的端口,而time指出了它将被呼叫的时刻。Chat描述了登录对话脚本-必须相互交换以允许uucico登录进pablo的字符串序列。我们将稍后讨论登录脚本。port命令并不指定一个设备相关的文件比如/dev/cua1,而是指定了port文件中的一个入口。你可以随心所欲地指定分配这些名字只要这些名字在port文件中有有效的引用。
    port文件掌握着与连接相关的信息。对于modem连接,它描述了所使用的设备相关文件、所支持的速度范围以及连接至端口的拨号设备的类型。下面的入口条目描述/dev/cua1(即已知的COM2),一个NakWell modem连接到它上面,该modem可以运行在最高38400bps的速度上。入口条目的命名方法是选择与sys文件中端口名匹配的名字。

    # /usr/lib/uucp/port – UUCP ports
    # /dev/cua1 (COM2)
    port serial1
    type modem
    device /dev/cua1
    speed 38400
    dialer nakwell

    属于拨号器(dialer)本身的信息则被保存在另一个文件中,称为-你猜得到的:dial。对于每种拨号器类型,它基本上含有用于发出拨号到一个远程站点的命令序列、和给出的电话号码。再一次,这是作为一个对话脚本给出的。例如,对于上面的NakWell的入口条目看上去可以象这样:

    # /usr/lib/uucp/dial – per-dialer information
    # NakWell modems
    dialer nakwell
    chat “” ATZ OK ATDT\\T CONNECT

    以chat开头的一行指出了modem对话,它是发送到modem和从modem接收的初始化modem并使它拨出所期望号码的命令串。”\\T”序列将被uucico替换成电话号码。
    为了给你一个uucico是如何处理这些配置文件的大概思路,假设你在命令行上发出命令

    # uucico –s pablo

    uucico所做的第一件事是在sys文件中查找pablo。从sys文件的pablo入口条目中它看到它应该使用serial1端口来建立连接。port文件告知它这是一个modem端口,并且有一个NakWell modem连在该端口上。
    uucico现在在dial文件中查找描述NakWell modem的入口条目,并且找到一个,并打开串行端口/dev/cua1并执行拨号器对话。也即,它发送出“ATZ”,等待响应“OK”,等等。当遇到字符串“\\T”时,就用从sys文件中获得的电话号码(123-456)取代之。
    在modem返回CONNECT以后,连接就被建立好了,并且modem对话也就结束了。uucico现在返回到sys文件并执行登录对话。在我们的例子中,它将等待提示“login:”,然后送出它的用户名(neruda),等待“password:”提示,并送出它的密码,“lorca”。
    在完成了权限认证以后,远端即会启动它自己的uucico。然后,这两个uucico将进入前节所述的握手阶段。
    配置文件之间的相互关系也在图12.1中示出了。

    12.3.2 UUCP需要知道些什么
    在你开始编写UUCP配置文件之前,你必须收集它需要知道的一些信息。
    首先,你必须知道你的modem连接在哪个串行端口上。通常,(DOS)端口COM1至COM4映射到设备文件/dev/cua0至/dev/cua3上。对于大多数发行版,比如象Slackware,创建了一个链/dev/modem作为到适当cua*设备文件的一个链,并配置kermit、seyon等等,以使用这个通用文件。在我们这个情况下,你也应该在你的UUCP配置中使用/dev/modem。
    这样做的原因是所有拨号程序在串行端口被占用时使用所谓的lock文件来作出通知。这些锁定文件的名称是字符串LCK..和设备文件名的串联,例如LCK..cua1。如果程序对于同样的设备使用不同的文件名,它们将不能识别出各自的锁定文件。结果,当它们同时启动时,将毁坏对方的进程。在你使用crontab确定你的UUCP呼叫时间表时,这并非不常发生的事。
    关于设置你的串行端口的详细信息,请参见第四章。
    下一步,你必须找出在什么速度上你的modem将与Linux通信。你必须将它设置成你所期望获得的最大有效传输速率上。有效的传输速率可能比你的modem的原始物理传输速率高得多。例如,许多modem以2400bps(每秒比特数)发送和接收数据。如果使用了压缩协议如V.42bis,实际的传输速率可能爬升至9600bps。
    当然,如果UUCP要做任何事的话,你将需要一个被呼叫的系统的电话号码。同样,对与远程系统,你还需要一个有效的登录id和一个可能的密码。[3]
    你也必须明确地知道如何登录进系统。例如,在登录提示出现之前你是否需要按下BREAK键?它是显示login:还是user:?这对于编制对话脚本(chat script)是必须的,这个对话脚本告知uucico如何进行登录。如果你不知道,或者如果常用的对话脚本失败了,就尝试使用象kermit或minicom的终端程序,并明确地写下来你必须做些什么。

    12.3.3 站点命名
    对于基于TCP/IP的网络,使用UUCP连网时,你的主机必须有一个名字。要是你只是想简单地使用UUCP来进行你直接拨号的站点间或在在本地网上文件的传输工作,那么这个名字就不需要符合任何标准。[4]
    然而,如果你将UUCP用于mail或news连接,你应该考虑把你的名字注册在UUCP映射计划项目中。UUCP映射计划将在第13章加以描述。即使你只是在一个域中,你也应该考虑为你的站点获取一个官方的UUCP名字。
    人们常常选择他们的UUCP名字与他们的全资域名相匹配。假如你的站点的域名地址是swim.twobirds.com,那么你的UUCP主机名就应该是swim。考虑那些互相熟知的基于第一个名字的UUCP站点。当然,你也可以使用一个完全与你的全资域名无关的UUCP名字。
    然而,请确信不要在邮件地址中使用不合格的站点名称除非你已经将其注册为你的正式UUCP名字。在最好的情况下,邮递到没有注册的UUCP主机的所有信息将只是悄无声息地消失掉了。如果你使用了一个早已属于其它站点的名字,那么邮件将会路由到那个站点去,并会给那个站点的邮件管理者带来无穷无尽的烦恼。
    默认地,UUCP站点使用由hostname设置的名字作为该站点的UUCP名字。这个名字通常是在/etc/rc.local脚本中设置的。如果你的UUCP名字与你的主机名的设置不同的话,你就必须在config文件中使用hostname选项来告知uucico你的UUCP的名字。这将在下面讲解。

    12.3.4 Taylor配置文件
    现在我们回过来讨论配置文件。Taylor UUCP从下列文件中获取信息:

    config 这是个主要的配置文件。你可以在这里定义你的站点的UUCP名字。

    sys 这个文件描述了你所知道的所有站点。对于每个站点,它指定了站点的名字、呼叫时间、拨号号码(如果有的话)、所使用的设备类型以及如何登录。

    port 含有描述各个存在端口的入口条目,以及线路所支持的速率和所用的拨号器。

    dial 描述用于建立电话线路连接的拨号器。

    call 含有呼叫一个系统时所用的登录名和密码。很少用到。

    passwd 含有在登录时系统可能用到的登录名和密码。仅当uucico自己进行密码检查时才用到这个文件。

    Taylor配置文件通常由含有关键字-值对的行组成。一个‘#’符号指定本行直到行尾都为注释。要使用‘#’符号本身,你就要和反斜杠一起使用它。
    你可以使用很多的选项来调节这些配置文件。这里我们不能讨论所有这些参数,而将只是讨论几个很重要的参数。利用它们,你就可以配置一个基于modem的UUCP连接。其它的小节将描述当你想在TCP/IP或直接串行线上使用UUCP时所须作的必要修正。完整的参考资料已随同Taylor UUCP原代码以Texinfo文档给出。
    当你认为你已经完全配置好你的UUCP系统以后,你可以使用uuchk工具(位于/usr/lib/uucp)来检查你的配置情况。uuchk读入你的配置文件,并打印出用于每个系统的配置值的详细报告。

    12.3.5 常用配置选项 – config文件
    除了你的UUCP主机名以外,这个文件通常并不包含其它信息。默认地,UUCP将使用你用hostname命令设置的名称,但是明确地设置UUCP名字将是一个好注意。下面示出了一个例子文件:

    # /usr/lib/uucp/config – UUCP main configuration file
    hostname vstout

    当然在这里也可以设置许多各种各样的参数,比如假脱机的目录、或匿名UUCP访问的权限。后者将在后面小节中讨论。

    12.3.6 如何告知UUCP有关其它系统的信息 – sys文件
    sys文件描述了你的机器要了解的远端系统的信息。一个条目由system关键字引入;随后的几行直到下一个system指令之间的信息详细描述了有关那个站点的参数。通常,一个系统条目将定义电话号码和登录对话等参数。
    在头一个system行以前的各个参数设置了用于所有系统的缺省值。一般地,你要在缺省部分中设置协议参数等的信息。
    下面,较详细地描述了几个很重要的字段。

    系统名称(System Name)
    System命令指定了远程系统。你必须指定远程系统的正确名字,而不是你虚构的别名,因为在你登录时uucico将拿它与远程系统所给出的作检查比较。[6]
    每个系统名字只能出显一次。如果对同一个系统你想使用几种配置(比如uucico应该尝试的几个不同的电话号码),你可以指定alternates。Alternates将在下面讨论。

    电话号码(Telephone Number)
    如果远程系统是通过电话线路联系的,phone字段将指定modem将拨号的号码。它可以含有由uucico的拨号过程解释的标记。一个等于符号意思是指等待第二个拨号音,一个破折号产生一秒的暂停时间。比如,有些安装的电话当你在前导码与电话号码之间不暂停时就会止住。

    [对此我并不知道适当的英语术语,就象一个公司内部私有安装的电话,当你要接外线时你首先必须拨一个0或9。]

    任何内嵌的字符串可以用于隐藏与站点相关的信息,比如区位号。任何象这样的字符串使用dialcode文件都被转换成拨号代码。假如你有以下的dialcode文件:

    # /usr/lib/uucp/dialcode – dialcode translation
    Bogoham 024881
    Coxton 035119

    利用这些转换,你可以在sys文件中使用Bogoham7732这样的电话号码,这使得号码变得清晰易读些。

    端口与速率(Port and Speed)
    port和speed选项用作选择用于呼叫远程系统的设备以及设备应该设置的最高速率。[7]一个system条目可以单独地使用这两个选项,或同时使用它们。当在port文件中查找适当的设备时,只有那些端口名以及/或者速度范围匹配的端口被选中。
    通常,使用speed选项就足够了。如果在port中只定义了一个串行设备的话,uucico无论如何将总能选择到一个正确的,所以你只需给它一个所期望的速度即可。如果你的系统上连接了几个modem的话,你通常仍然无须指定一个特定的端口,因为在uucico发现有几个匹配时,它回逐个尝试每个设备直到找到一个未用的设备为止。

    登录对话(The Login Chat)
    上面,我们已经遇到过登录对话脚本,它告知uucico如何登录进远程系统。它由本地uucico进程指定的期望字符串和发送字符串的一个标记列表组成。目的是为了让uucico等待远程机器发送过来一个登录提示,然后返回登录名称,再等待远程系统发送密码提示,并发送密码。所期望的和发送的字符串是交替给出的。uucico自动地将回车符(carriage return character \\r)附加到任何发送的字符串上。这样,一个简单的对话脚本将象这样

    ogin: vstout ssword: catch22

    你会注意到所期望的字段并没有包含完整的提示。这是为了确信即使远程系统广播了Login:而不是login:时也能登录成功。
    uucico同样也允许某些条件执行,例如,在发出提示之前远程机器的getty需要被复位的情况。对于此,你可以将一个子对话附加到一期望字符串上,用一破折号补偿。只有当主要期望失败时,例如超时,子对话才会被执行。使用这个特性的一种方法是在远程站点没有显示一登录提示时发送一BREAK。下面的例子给出了一个多用途的对话脚本,对于你必须在登录显示出来之前按回车的情况也同样能用。””告诉UUCP不要等待任何信息而立刻继续进行下一字符串发送。

    “” \\n\\r\\d\\r\\n\\c ogin:-BREAK-ogin: vstout ssword: catch22

    在对话脚本中会存在几个特殊的字符串和逃逸字符。下面是在期望字符串中合法的字符的不完整列表:

    “” 空字符串。它告知uucico不要等待任何事情,而立刻进行下个字符串的发送处理。

    \\t Tab字符。

    \\r 回车(Carriage return)字符。

    \\s 空格字符。你需要它在对话串中加入空格。

    \\n 换行符。

    \\\\ 反斜杠字符。

    对于发送的字符串,除了上面的字符以外,下面这些字符和字符串也是合法的:

    EOT 传输结束字符(^D)(End of transmission character)。

    BREAK 中断字符。

    \\c 在字符串尾压缩回车的发送。

    \\d 延迟1秒发送。

    \\E 允许响应(回送echo)检查。在uucico能继续进行对话之前,它要等待写出的所有信息的来自设备的响应被读取到。当用于modem对话时,这是非常有用的(我们将在下面遇到)。缺省地,响应检查是关闭的(off)。

    \\e 禁止响应检查。

    \\K 同BREAK。

    \\p 暂停几分之一秒。

    备用(Alternates)
    有时,非常希望对于单个系统有多个条目,比如如果系统能通过不同的modem线路到达。对于Taylor UUCP,你可以通过定义一个所谓的alternate来做到。
    为了对pablo使用两个电话号码,你要用以下方法修改它在sys中的条目:

    system pablo
    phone 123-456
    … entries as above …
    alternate
    phone 123-455

    当呼叫pablo时,uucico现在将首先拨出号码123-456,如果失败了,就会试用备用的。备用条目维持与主要系统条目所有的设置,仅是电话号码不同而已。

    限定呼叫时间(Restricting Call Times)
    Taylor UUCP提供了许多方法允许你限制对远程系统呼叫的时间。这样做的原因或者是因为远端主机只在上班时间才提供此类服务,或者简单地只是为了避免高呼叫时间段的费用。注意,通过给uucico选项-S或-f,总是可以覆盖呼叫时间限制。
    默认地,Taylor UUCP不允许任意时间的连接,所以你必须在sys文件中使用某些时间的规格说明。如果你不在乎呼叫时间限制的话,那么你可以在你的sys文件中把值Any指定给时间time选项。
    限定呼叫时间的最简单的办法是利用time条目,它是由一个日子和时间子字段组成的字符串指定的。日子可以是任何Mo、Tu、We、Th、Fr、Sa、Su的组合,或者是Any、Never、或者平日Wk。时间由两个24小时时钟值组成,由短划线分隔。它们指定了呼叫的时间范围。这些标记的组合之间没有空格。任何数量的日子和时间的说明可以用逗号组合在一起。例如,

    time MoWe0300-0730,Fr1805-2000

    允许在星期一以及星期三从早上3点到7点30分,以及星期五在18点05分到20点之间进行呼叫活动。当时间字段跨越午夜时,比如Mo1830-0600,它实际上表示星期一,在午夜到早上6点之间,以及在下午6点30分到午夜之间。
    特殊的时间字符串Any和Never意思即是它们的本意:分别是指在任何时候都可以进行呼叫和在任何时候都不可以呼叫。
    time命令有一个可选的第二个参数,用于描述以分钟计的重试时间。当建立一个连接的企图失败时,uucico在一定时间间隔内将不允许另一次拨号到远程主机的尝试。缺省地,uucico使用一种指数后退方案,这是指重复失败次数越多,那么重试间隔的时间就越长。例如,当你指定5分钟的重试时间时,uucico在距上次失败5分钟之内将拒绝呼叫远程系统。
    timegrade命令允许你往时间表上附加一个最大假脱机级别。例如,假设在system条目中你有以下的timegrade命令:

    timegrade N Wk1900-0700,SaSu
    timegrade C Any

    这允许只要呼叫一被建立,那么假脱机级别C或更高的作业(通常,mail是以级别B或C排队的)即可立刻传输,而news(通常以级别N排于队列中)将只能在夜晚和周末传输。
    和time一样,timegrade命令将一个以分钟计的重试间隔时间作为第三个可选的参数。
    然而,有关假脱机级别的一个告戒是:首先,timegrade选项只应用于你的系统的发送;而远程系统仍然可以随心所欲地传输任何东西。你可以使用call-timegrade选项明确地请求远程系统只发送那些高于假脱机级别的作业;但并不能保证它一定会遵循这个请求。[8]
    同样地,当远程系统呼叫进来时,并不会检查timegrade字段,所以任何排队等待这个远程系统的作业都将被发送出去。然而,远程系统可以明确地请求你的uucico来限制自身只发送一定假脱机级别的作业。

    12.3.7 有些什么设备 – port文件
    port文件告知uucico现有的端口。这些可能是modem端口,但其它类型的端口比如直接串行线路连接和TCP套接字也同样得到支持。
    象sys文件一样,port文件由以关键字port开始后接端口名的各个条目构成。这个端口名可以被用于sys文件中的port语句中。这个名字无须是唯一的;如果几个端口有同样的名字,uucico将按顺序地试用每一个端口直到它找到一个空闲的端口。
    port命令后必须紧跟描述端口类型的type语句。有效的类型有modem、直接连接的direct、和用TCP套接字的tcp。如果port命令不存在,那么端口类型的缺省值是modem。
    在这一小节中,我们将仅讨论modem端口;TCP端口和直接线路连接将在后面的小节中讨论。
    对于modem和直接端口,你必须使用device指令指定用于呼出的设备。通常,这是/dev目录中一个设备文件的名字,象/dev/cua1。[9]
    对于modem设备的情况,端口条目也确定了那种类型的modem连接在端口上。不同类型的modem要求不同的配置。即使是那些声称Hayes兼容的modem也不一定是互相真正兼容的。因此,你必须告知uucico如何初始化modem以及如何让它拨出所希望的号码来。Taylor UUCP将所有拨号器的描述保存在一个称为dial的文件中。为了要使用其中任何一个,你必须使用dialer命令指定拨号器的名字。
    有时候,你会想以不同的方式使用一个modem,这依赖于你呼叫的系统。例如,当一个高速modem试图以14400bps来连接时,某些老式的modem就不能理解;它们只是简单地中断线路而不是协商一个连接速度,比如说,9600bps。当你知道站点drop使用这样一个不灵光的modem时,那么在呼叫它们时,你就必须以不同的方式设置你的modem。针对于此,在port文件中你需要一个指定一个不同的拨号器的额外的端口条目。现在你可以给这个新端口一个不同的名字,比如说serial1-slow,并在sys文件的drop系统条目中用port指令。
    一个更好的办法是通过他们所支持的速度来区分它们。例如,上面情况的两个端口入口条目看上去象这样:

    # NakWell modem; connect at high speed
    port serial1 # port name
    type modem # modem port
    device /dev/cua1 # this is COM2
    speed 38400 # supported speed
    dialer nakwell # normal dialer

    # NakWell modem; connect at low speed
    port serial1 # port name
    type modem # modem port
    device /dev/cua1 # this is COM2
    speed 9600 # supported speed
    dialer nakwell-slow # don’t attempt fast connect

    对于站点drop的系统入口条目将给出serial1作为端口名,但只请求以9600bps使用它。此时,uucico将会自动地使用第二个端口入口条目。在系统条目中有38400bps速度的所有站点都将被使用第一个端口条目呼叫。

    12.3.8 如何拨号 – dial文件
    dial文件描述了各种拨号装置(拨号器)的使用方法。传统上,UUCP只谈及拨号器而非modem,因为在早期,只拥有一个(昂贵的)的拨号器来服务于一组modem是很现实的事。如今,大多数modem都有内置的拨号支持,因此这种区别有一些使人混淆。
    然而,不同的拨号器或modem需要不同的配置。你可以在dial文件中来描述它们的每一种。dial中的每一个条目都以给出拨号器名字的dialer命令开始。
    除此之外最重要的条目是由chat命令指定的modem对话条目。与登录对话类似,它是由一系列uucico发送到拨号器和它所期望的返回响应字符串组成。它通常用于将modem复位到某种已知状态并且进行拨号。下面的拨号器条目样本示出了Hayes兼容modem的一个典型modem对话:

    # NakWell modem; connect at high speed
    dialer nakwell # dialer name
    chat “” ATZ OK\\r ATH1EOQO OK\\r ATDT\\T CONNECT
    chat-fail BUSY
    chat-fail ERROR
    chat-fail NO\\sCARRIER
    dtr-toggle true

    modem对话过程以空字符串“”开始。接下来uucico将送出第一个命令(ATZ)。ATZ是Hayes命令用于复位modem。然后等待modem送回OK,接着送出下一个命令来关闭本地回显,等等。当modem再次返回OK以后,uucico发出拨号命令(ATDT)。该字符串中的逃逸字符序列\\T将被从sys文件中的系统条目内的电话号码替换掉。此后,uucico等待modem返回字符串CONNECT,这个字符串表示与远程的modem已经成功地建立了连接。
    常常,modem与远程系统的连接会失败,例如,远程系统正在与其它人通话并且线路忙的话。在这种情况下,modem将返回某些出错信息指出失败的原因。Modem对话是没有能力来识别出这种消息的;uucico将继续等待期望的字符串的到来直到超时。因此UUCP的日志文件将只显示出一模糊的“对话脚本超时(timed out in chat script)”信息而非真正的原因。
    然而,Taylor UUCP允许你使用上面的chat-fail命令告知uucico有关此类出错消息。在执行modem对话时,当uucico检测出一个对话出错(chat-fail)字符串,它就会放弃这次呼叫,并且将错误消息记录在UUCP的日志文件中。
    上面样本例子中所示的最后一个命令告知UUCP在开始modem对话之前转换DTR线的信号。大多数modem能够配置成当检测到DTR线路信号转换时挂断线路,并进入命令模式。[10]

    12.3.9 TCP上使用UUCP
    初听起来有些荒谬,然而使用UUCP在TCP上传输数据并不是一个坏主意,尤其是当传输象Usenet news这样的大量数据时。在基于TCP的链接上,news通常使用NNTP协议来进行交换的,请求和发送文章是分别进行的,没有压缩也没有进行任何的优化。尽管这适用于有着几个并行的喂信功能的大站点,这种技术对于使用ISDN等慢速连接来接收他们的news的小型站点并不合适。这些站点通常希望能结合TCP大批量发送news的优点,能够将数据压缩传输而只有非常小的过载。批量传输这些数据的一个标准方法就是在TCP上使用UUCP。
    在sys中,你要以下面的方法来指定一个系统通过TCP来呼叫:

    system gmu
    address news.groucho.edu
    time Any
    port tcp-conn
    chat ogin; vstout word; clouseau

    address命令给出了主机的IP地址,或者是它的全资域名。相应的port条目将是:

    port tcp-conn
    type tcp
    service 540

    这个条目表示当一个sys条目参考使用tcp-conn时将使用一个TCP连接,并且uucico将试图连接到远端主机的TCP网络端口540上。这个端口是UUCP服务的默认端口号。除了端口号,你也可以给service命令一个符号端口名。而与这个名字对应的端口号将在/etc/services中找到。UUCP服务的通用名称是uucpd。

    12.3.10 使用直接连接
    假设你使用线缆把你的系统vstout和tiny直接连接起来。与使用modem的情况非常相似,你必须在sys文件中写一个系统条目。确定串行端口tiny的port命令被连通起来。

    system tiny
    time Any
    port direct1
    speed 38400
    chat ogin; cathcart word; catch22

    在port文件中,你必须对直接连接描述这个串行端口。不需要dialer条目,因为无须拨号。

    port direct1
    type direct
    speed 38400

    12.4 UUCP能做与不能做的 – 调整权限
    12.4.1 命令执行
    UUCP的任务是将文件从一个系统拷贝至另一个系统,并且请求在远程主机上执行适当的命令。当然,你作为一个管理员会想要控制给予其它系统的权限 – 允许他们能够执行你的系统上的任何命令肯定不是一个好主意。
    默认地,Taylor UUCP所允许其他系统在你的机器上执行的仅有的命令是rmail和rnews,它们通常是用于使用UUCP交换email和Usenet news。用于uuxqt的默认搜索路径是一个编译时的选项,通常包含有/bin、/usr/bin和/usr/local/bin。如果想要改变一个特定系统能执行的命令集的话,你可以在sys文件中使用commands关键字。类似地,可以用command-path语句改变搜索路径。例如,除了rmail和rnews命令,你可能还想允许pablo系统能执行rsmtp命令:[11]

    system pablo

    commands rmail rnews rsmtp

    12.4.2 文件传输
    Taylor UUCP也允许你非常详细地微调文件的传输。在一个极端情况下,你可以禁止向/从某一特定系统的传输。只需设置request为no,远程系统就不能从你的系统中汲取文件也不能向你的系统发送任何文件。同样地,通过把transfer设置成no,你可以禁止你的用户向一个系统传输文件或从一个系统中传进文件。默认地,本地的和远程的用户是允许上载和下载文件的。
    另外,你可以配置进行文件拷贝的目录。通常,你会想要限制远程系统的访问到某一个目录结构中,但仍然允许你的用户从他们的主目录中发送文件。常常,远程用户只被允许从公共的UUCP目录/var/spool/uucppublic中接收文件。这是放置公共文件的传统地方;非常象Internet上的FTP服务。它通常用~字符指示。
    因此,Taylor UUCP提供了四种不同的命令用来配置发送和接收文件的目录。它们是local-send,它指定了用户可以要求UUCP从中发送文件的目录列表;local-receive,它给出了用户可以请求UUCP接收文件的目录列表;remote-send和remote-receive,它们针对外部系统做类似的工作。考虑下面的例子:

    system pablo

    local-send /home ~
    local-receive /home ~/receive
    remote-send ~ !~/incoming !~/receive
    remote-receive ~/incoming

    local-send命令允许你的主机上的用户将/home和公共UUCP目录中的任何文件发送到pablo。local-receive命令允许用户将接收到的文件放在uucppublic中的完全可写的receive目录中或/home下任何完全可写的目录中。remote-send命令允许pablo从/var/spool/uucppublic中获取文件,而除了incoming和receive目录下的文件。这是通过在相应的目录名前放置感叹号来指出的。末了,最后一行允许pablo往incoming中上载任何文件。
    使用UUCP传输文件的严重问题之一是它仅允许将接收到的文件放到完全可写的目录中。这可能会引诱某些用户对其他用户设置陷阱等等。然而,并没有任何方法来阻止这个问题,除非完全禁止UUCP的文件传输。

    12.4.3 转发(Forwarding)
    UUCP提供了让其它系统依你的的要求执行文件传输的机制。例如,这允许你使得seci为你从uchile获取一个文件,并将它发送到你的系统。下面的命令将完成这个任务:

    $ uucp –r seci!uchile!~/find-ls.gz ~/uchile.files.gz

    这种将一个作业通过几个系统传送的技术叫做转发(forwarding)。在上面的例子中,使用转发的原因可能是seci有对uchile的UUCP访问,而你的系统却没有。然而,如果你运行了一个UUCP系统,你会想要将转发服务限制到你可信任的很少几台主机,以免会为他们去下载一个最新的X11R6源程序版本而花费惊人的电话费用。
    缺省地,Taylor UUCP完全不允许转发活动。为了对某一特定系统启动转发,你可以使用forward命令。这个命令指定了能够请求你的系统进行转发作业的站点的一个列表。例如,为了允许pablo能够从uchile请求文件,seci的UUCP管理员必须将下列几行内容加入到sys文件中:

    ####################
    # pablo
    system pablo

    forward uchile
    ####################
    # uchile
    system uchile

    发布人:netbull 来自:Linux自由鸽