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

Linux网络管理员手册(17)



         翻译:赵炯
    [email protected]

    第十七章 C News


    用于网络新闻的非常流行的软件包之一是C News。它被设计成用于在UUCP链接上传送news的站点。这一章将讨论C News的中心思想,以及基本的安装与维护任务。
    C News的配置文件存储在/usr/lib/news中,而它的绝大多数执行文件在/usr/lib/news/bin目录中。文章被放置在/var/spool/news下。事实上,你应该确保这些目录中的所有文件要属于用户news、组news。许多问题起于C News访问不了文件。在你触碰里面的任何文件之前使用su变成为news用户—让这成为你操作的准则。仅有的例外是setnewsids,用于设置某些news程序的真实用户id的。它必须由root拥有,并且必须有setuid比特置位。
    下面,我们详细地描述C News的所有配置文件,并且向你说明要让你的站点运行该做些什么。

    17.1 投递News
    文章可以有几种方法馈给C News。当一个本地用户邮递了一篇文章时,新闻阅读器通常会将该文章传递给inews命令用以建立标题信息。远程站点来的新闻,不管是单篇文章还是整个批处理文件,都被送至rnews命令。该命令将它们存储在/var/spool/newsin.coming目录中,以后newsrun会从中选取文件。然而,不管使用这两种技术中的哪一个,文章最终都将被送至relaynews命令。
    对于每一篇文章,通过在histroy文件中查询消息id,relaynews命令首先检查该篇文章是否已经在本地站点上。重复的文章将被抛弃。然后,relaynews观察Newsgroups:标题行以查明本地站点是否向任何这些组请求过文章。如果是的并且该新闻组已列在active文件中,relaynews就会试着将该文章存储到news spool区内相应的目录中。如果这个目录不存在的话,就建立一个。此时,这篇文章的消息id将被记录在history文件中。否则的话,relaynews就会抛弃掉这篇文章。
    如果由于文章要投递到的组没有列在你的active文件中而致使relaynews存储入站文章失败时,该篇文章将被移入junk组中。[1] relaynews也会对过时的或填错日期的文章进行检测并拒收它们。由于任何其它原因而失败的任何入站批处理文章将被移入/var/spool/news/in.coming/bad中,并在日志文件中记录一个错误消息。
    此后,使用各个站点特定的传输方式,文章将被中继到从这些组中请求news的所有其它站点去。为了确保文章没有被送到早已见过这篇文章的站点上,每个目的站点会检查文章的Path:标题字段,该字段含有文章至今为止已经经过的站点的清单,是以bang path形式写的。
    C News一般用于在UUCP站点之间中继news,尽管也能将它用于NNTP环境中。为了将news投递到远程UUCP站点去—比如单篇文章或整个批处理—uux被用来在远程站点上执行rnews命令,并在标准输入上把文章或批处理文件喂给它。
    当对一指定站点开启了批处理,C News不会立刻发送任何入站的文章,而是将文章的路径名添加到一个文件中,通常是out.going/site/togo。周期性地,crontab会执行一个批处理程序,[2] 该程序将文章放入一个或多个文件中,还可选择对他们压缩,并且将它们发送到远程站点的rnews。
    图17.1示出了流经relaynews的news。文章可以被转发到本地站点(由ME表示)、通过email到某个名为pronderosa的站点、或到一个开启了批处理的名为moria站点。

    图17.1 流经relaynews的news。

    17.2 安装
    为了安装C News,如果你还没有解开压缩,首先将文件解开到适当的地方,并且编辑下面所列出的配置文件。它们都位于/usr/lib/news。它们的格式将在下面几节中描述。

    sys 一般你必须修改描述你系统的ME一行,尽管使用all/all总是安全的。你也需要为每个你要喂信的站点增加一行配置。
    如果你是个页站点,你只需要添加一行将所有本地生成的文章发送给你的喂信者的配置信息。假设你的喂信者是moria,那么你的sys文件看上去就象这样的:

    ME:all/all::
    Moria/moria.orcnet.org:all/all,!local:f:

    organization 你的组织的名称。例如,“Virtual Brewery, Inc.”。在你自己的机器上,输入“private site”,或任何你喜欢的信息。如果你没有定义这个文件,许多人将不能呼叫你的站点。

    newsgroups
    mailname 你的站点的邮件名称,例如,vbrew.com。

    wohoami 用于news的你的站点名。常常使用UUCP站点名,例如vbrew。

    explist 一般你应该编辑这个文件来反映某些特定新闻组的过期时间。

    为了建立初始的新闻组层次结构,从给你喂信的站点上取得active和newsgroups两文件,并将这两文件安装到/usr/lib/news中,确保它们的宿主是news并具有模式644。从active文件中删除所有的to.*组,并加入to.mysite和to.feedsite,以及junk和control。to.*组通常用于交换ihave/sendme消息的,但不管你是否计划使用ihave/sendme都应该建立它们。下一步,在active的第二和第三字段中使用下面的命令替换掉所有文章的数(号)。

    # cp active active.old
    # sed ‘s/ [0-9]* [0-9]* / 0000000000 00001 /’ active.old > active
    # rm active.old

    第二个命令是对sed(1)的调用,是我最喜欢的UN*X命令之一。这个调用分别将两个数字串替换为一个全零串和字符串00001。
    最后,建立news假脱机目录和用于入站和出站news的子目录:

    # cd /var/spool
    # mkdir news news/in.coming news/out.going
    # chown –R news.news news
    # chmod –R 755 news

    如果你正在使用一个C News的最新发布版,那么你也必须在news假脱机目录中建立out.master目录。
    如果你正在使用一个不是已经运行的C News中的不同的newreaders发布版程序的话,你可能会发现某些newsreaders期望news spool在/usr/spool/news中而不是在/var/spool/news。如果你的newsreader好象没有找到任何文章的话,那么就从/usr/spool/news建立一个到/var/spool/news的符号链接。
    现在,你已准备好接收news了。注意,除了上面示出的目录以外,你不需要建立任何其它目录,因为每次C News从一个组接收到一篇至今还没有spool目录的文章时,它就会创建该目录的。
    特别地,文章被交叉投递的所有组都会发生。所以,过一阵子,你会发现你的news spool目录被你从没有订阅的新闻组的目录搞的乱七八糟,象alt.lang.teco等。你可以通过从active中删除所有不想要的组,或通过定期运行一个shell脚本来避免出现这种情况。这个shell脚本会删除所有在/var/spool/news(当然,除了out.going和in.coming)下的空目录。
    C News需要一个用户来给它发送出错信息和状态报告。默认地,这个用户就是usenet。如果你使用这个缺省的用户,你就必须为它设置一个别名,它会将它的所有邮件中转给一个或多个负责人。(第14和15章解释了针对smail和sendmail是如何做的)。你也可以通过将环境变量NEWSMARSTER设置成适当的名字来覆盖这个特性。在news的crontab文件中、以及每次你手工调用一个管理工具时,你都必须这样做,所以设置一个别名通常是更容易的。
    当你在编辑/etc/passwd时,请确信每个用户在密码文件的pw_gecos字段(这是第四个字段)中都有她真实的名字。这是Usenet的网络礼节,发送者的真实姓名必须出现在文章的From:字段中。当然,在使用邮件时你也应该这样做。

    17.3 sys文件
    位于/usr/lib/news中的sys文件控制着你接收和中转到其他站点的层次结构。尽管有着名为addfeed和delfeed的维护工具,我想最好亲手来维护这个文件。
    sys文件含有你中转news所到的各个站点的条目,以及你接受的组的描述。条目看上去象这样

    site[/exclusions]:grouplist[/distlist][:flags[:cmds]]

    条目可以使用一个反斜杠(\\)来续行。井字符号(#)表示一个注释。

    site 这是条目相应的站点的名称。通常选择站点的UUCP名字。在sys文件中也必须有你自己站点的条目,否则的话你将收不到任何文章。
    特殊的站点名ME表示你的站点名。ME条目定义了你想在本地存储的所有组。与ME行不匹配的所有文章都将进入junk组。
    因为C News是把site和Path:标题字段上的站点名作比较检查的,所以你必须确保它们真正是匹配的。有些站点在这个字段中使用它们的全资域名,或是象news.site.domain这样的别名。为了避免任何文章被返回给这些站点,你必须将这些站点加入排除清单中,并用逗号分开。
    例如,对于站点moria的条目,该站点的这个字段将含有moria/moria.orcnet.org。

    grouplist 这是一个用逗号分开的组和相应站点层次结构的订阅清单。层次结构可以通过给定层次结构的前缀来指定(比如,名字以comp.os为前缀的所有组),后面可以跟一个可选用的关键字all(比如,comp.os.all)
    通过在一个层次结构或组的前面放上一个感叹号就可以排除对这个层次结构或组的转发。如果用这个清单来检查新闻组,那么适用于最长匹配的名称。例如,如果grouplist含有

    !comp,comp.os.linux,comp.folklore.computers

    那么除了comp.folklore.computers和comp.os.linux下的所有组以外,comp层次结构下的其它组都不会喂给那个站点。
    如果站点请求将你所接收到的所有组都转发给它,那么在grouplist中输入all。
    distlist 是使用一个斜杠的grouplist的分支,含有要转发的发布信息的一个清单。同样,你可以通过在它们前面加上一个感叹号来排除适当的发布信息。所有的发布信息是用all来表示的。省略distlist暗示一个all清单。
    例如,你可以使用一个all发布清单,!local用于避免只供本地使用news发送到远程站点去。
    起码有两种发布:world,当用户没有指定时,这经常是默认的发布,还有一个是local。还可以有应用于某个区域、州、国家等等的其它发布。总的来说,C News只使用两个发布;这是sendme和ihave,并且是用于sendme/ihave协议的。
    发布的使用是一个有争论的问题。首先,某些新闻阅读器通过简单地使用顶层层次结构建立假的发布,例如,在投递到comp.os.linux时用comp。应用于区域的发布也常常是有问题的,因为当通过Internet发送时news可以传输到你的区域之外去。[3] 然而,应用于一个组织机构的发布是非常有意义的,例如,避免机密的信息跑到公司网络外面去。但是,针对这个目的通常最好通过创建一个独立的新闻组或层次结构来做到。

    flags 这描述了喂信的适当参数。它可以是空的,或者是下面标志的组合:
    F 这个标志开启批量处理。
    f 这个标志与F几乎是相同的,但是允许C News更精确地计算出出站批量的大小。
    I 这个标志使得C News生成一个适用于ihvae/sendme的文章清单。还需要对sys和batchparms文件额外的修改,以开启ihave/sendme。
    n 这个标志为活跃的NNTP传输客户(象nntpxmit 见第18章)建立批处理文件。该批处理文件含有文章的文件名和它的消息id。
    L 这个标志告诉C News只传送在你站点上投递的文章。这个标志后面可以跟一个十进制数n,这使得C News只传输离你站点n跳之内的文章。C News从Path:字段来确定跳数。
    u 这个标志告诉C News只从unmoderated组中批量处理文章。
    m 这个标志告诉C News只从moderated组中批量处理文章。

    你最多可以使用F、f、I、或n中的一个。

    Cmds 除非开启了批量处理,这个字段域含有对每篇文章所要执行的命令。文章将在标准输入上馈给该命令。这只能用于非常小的输入;否则的话,两个系统的负载都会太大。
    缺省的命令是


    uux - -r –z system!rnews

    该命令在远程系统上调用rnews,在标准输入上给它喂文章。
    该字段中给出的命令的默认搜索路径是/bin:/usr/bin:/usr/lib/news/bin/batch。最后一个目录中含有许多shell脚本,这些脚本的名字以via开头;将在本章后面讨论。
    如果使用了F或f、I或n标志开启了批量处理,C News会期望在这个字段中找到一个文件名而非一个命令。如果这个文件名不是以一个斜杠(/)开头的,就假设是与/var/spool/news/out.going相关的。如果这个字段是空的,它缺省地指向system/togo。

    在设置C News时,你一般肯定要写出自己的sys文件。为了帮助你编写,下面我们给出了vbrew.com的样本文件。从中你可以拷贝你需要的部分。

    # We take whatevr they give us.
    ME:all/all::

    # We send everything we receive to moria, except for local and
    # brewery-related articles. We use batching.
    Moria/moria.orcnet.org:all,!to,to.moria/all,!local,!brewery:f:

    # We mail comp.risks to [email protected]
    ponderosa:comp.risks/all::rmail [email protected]

    # swim gets a minor feed
    swim/swim.twobirds.com:comp.os.linux,rec.humor.oracle/all,!local:f:

    # Log mail map articles for later processing
    usenet-maps:comp.mail.maps/all:F:/var/spool/uumaps/work/batch

    17.4 active文件
    active文件位于/usr/lib/news中,其中列出了你的站点所知道的所有组,以及目前在线上的文章。你很少需要改动它,但为了完整起见我们还是对它作些解释。文件中的条目有如下的形式:

    newsgroup high low perm

    当然,newsgroup是组的名字。Low和high是现有的最低和最高文章数量。如果此时一篇文章也没有,那么low就等于high+1。
    起码,这是low字段所代表的意思。然而,考虑到效率的问题,C News并不更新这个字段。在没有新闻阅读器依赖于这个字段时是不会有什么大损失的。例如,trn检查这个字段看它是否能够从它的线程数据库中清除任何的文件。为了更新low字段,你需要定期地运行updatemin命令(或者,在早期的C News版本中是upact脚本)。
    perm是一个详细描述用户对组的访问许可。它可以取下列值之一。

    y 允许用户往这个组中投递文章。
    n 不允许用户往这个组中投递文章。然而,该组仍然是可被阅读的。
    x 这个组已被本地禁止掉了。当news管理员(或他们的上司)禁止用户向某个组投递文章时有时就会这样做。
    往这个组投递的文章并不在本地存储,尽管会将这些文章转发到请求它们的站点去。
    m 这是一个调解(仲裁)组。当一个用户企图往这个组邮递文章时,一个智能新闻阅读器会注意到她的这个操作,并将该文章发送到调解人那里去而不是这个组中。调解人的地址取自/usr/lib/news中的moderators文件。
    =real-group 这标志出newsgroup作为另一个组(即real-group)的本地别名。所有邮递到newsgroup的文章都将重定向到它。

    在C News中,一般你不需要直接访问这个文件的。可以使用addgroup和delgroup在本地增加或删除组(见下面维护工具和任务小节)。当为整个Usenet增加或删除组时,常常是通过分别发送一个newgroup或rmgroup控制消息来完成的。你自己绝对不要发送这样的消息!有关如何建立一个新闻组的方法,请阅读news.announce.newusers中的每月投递。
    与active紧密相关的文件是active.times。每当创建了一个组时,C News就往这个文件中记录一条消息,该消息含有被创建组的名称、创建的日期、是通过newgroup控制消息建立的还是本地建立的、以及是谁操作的。这是为了便于新闻阅读器通知用户近期建立的任何新组。这个文件也被NNTP的NEWGROUPS命令所使用。

    17.5 文章批量处理(Batching)
    新闻批量处理遵循着一个特定的格式,这个格式是与Bnews、C News和INN的相同。每篇文章的前面都有象这样的一行:

    #! Rnews count

    这里count是文章的字节数。当使用批量压缩时,产生的文件是作为一个整体压缩的,并且在前面有另一行,其中的信息是用于解压缩的。标准的压缩工具是compress,是用以下来标记的

    #! cunbatch

    有时候,当需要通过会从所有数据中去除第八比特的邮件软件中发送批量文件时,压缩的批量文件可以使用所谓的c7-编码进行保护;此时这些批量文件将标记为c7unbatch。
    当一个批量文件被喂到远程站点上的rnews时,它会检查这些标记并进行适当的处理。有些站点也使用其它的压缩工具,比如gzip,并在它们的用此工具压缩的文件前面加上zunbatch而不是cunbatch。C News识别不出象这样的非标准标题来;所以你必须修改源程序来支持它。
    在C News中,文章批量处理是通过/usr/lib/news/bin/batch/sendbatches来执行的,它从site/togo文件中取得文章的清单,并将它们放入几个新闻批处理中。它应该每隔一小时执行一次或更频繁地执行,这依赖于数据的流量。
    它的操作是由/usr/lib/news中的batchparms文件控制的。该文件描述了每个站点所允许的最大批量处理大小、进行批量处理和可选压缩所用的程序、以及将它们投递到远程站点所用的传输方式。你可以针对每个站点指定批量处理的参数,以及对没有明确提及的站点指定一缺省参数集。
    要对一特定站点执行批量处理,象下面那样来调用它

    # su news –c “/usr/lib/news/bin/batch/sendbatches site”

    当不带参数进行调用时,sendbatches将处理所有排着队的批处理。对“所有”的解释依赖于batchparms中是否有缺省条目。如果有,则/var/spool/news/out.going中的所有目录都将被检查,否则的话,它将循环使用batchparms中的条目。注意,当扫描out.going目录时,sendbatches将只取不含有点和@符号作为站点名字的目录。
    当安装C News时,你肯定会在你的发行版中找到一个batchparms文件,其中含有一个合适的缺省条目,所以你一般不需要改动这个文件。不过为了以防万一要改动,所以我们还是描述一下它的格式。每一行含有六个字段,由空格或制表符tab分开:

    site size max batcher muncher transport

    这些字段的含义如下:
    site是条目所应用的站点。这个站点的togo文件必须位于news spool下的out.going/togo中。/default/站点名表示缺省的条目。
    Size是所创建的最大文章批量文件的大小(在压缩之前)。对与大于这个值的单个文章,C News将其作为一个例外并将它放入单独一个批量文件中。
    max是特定站点的最多建立和定期要传输的批量的数目。这在远程站点关闭了很长时间的情况下是很有用的,因为这可以避免C News用成千上万个新闻批量文件将你的UUCP假脱机目录搞乱。
    C News使用/usr/lib/news/bin中的queulen脚本来确定排于队列中的批量文章的数目。Vince Skahan的newspak发行版应该含有一个BNU兼容UUCP的脚本。假如你用了不同的假脱机目录Taylor UUCP,那么你可能需要自己来编写它。[4]
    batcher字段含有用于从togo文件中的文章清单生成批量文件的命令。对于定期的喂信操作,这通常是batcher。对于其它的目的,可以提供另外的batchers。例如,ihave/sendme协议要求文章清单被转换成ihave或sendme控制消息,该消息会被投递到新闻组to.site中。这是通过batchih和batchsm来执行的。
    muncher字段指定用于压缩的命令。通常,这是一个产生压缩批量文件的脚本compcun。[5] 另外地,你也可以提供一个使用gzip,比如gzipcun(为了清楚起见,你必须自己编制它)的muncher。你必须确信远程站点上的uncompress已被修改成能识别用gzip压缩的文件。
    如果远程站点没有uncompress命令,你可以指明nocomp来不做任何压缩。
    最后一个字段transport描述了所用的传输方式。针对不同的传输方式有许多标准的命令,这些命令的名字都以via开头。Sendbatches在命令行上将目的站点的名字传给它们。如果batchparms的条目不是/default/,它就会从site字段通过剥离在第一个点或斜杠后的任何字符来取得站点名字。如果条目是/default/,那么就使用在out.going中的目录名。
    有两个命令使用uux在远程系统上执行rnews;viauux和viauuxz。后一个命令为(老版本的)uux设置-z标志以使它对每一篇投递的文章返回成功消息。另一个命令,viamail,通过邮件将批量文章发送到远程系统上的rnews用户。当然,这需要远程系统会将所有rnews的邮件喂到它们的本地news系统。有关这些传输方式完整的清单,请参见newsbatch(8)手册页。
    最后三个字段中的命令必须位于out.going/site或/usr/lib/news/bin/batch中。其中多数的命令是脚本,所以你可以方便地根据你的所需编辑这些新工具。它们是通过管道来调用的。文章清单是在标准输入上喂给batcher的,并在标准输出上生成批量文件。而这个输出又通过管道送至muncher,等等。
    下面给出了一个样本文件。

    # batchparms file for the brewery
    # site | size |max |batcher |muncher |transport
    #-------------+--------+-------+---------+-----------+-----------
    /default/ 100000 22 batcher compcun viauux
    swim 10000 10 batcher nocomp viauux

    17.6 过期News(新闻)
    在Bnews中,过期操作通常是通过expire程序来执行的,它将新闻组的清单和文章过期的日期作为参数。为了操作不同的层次结构在不同的时间过期,你就必须编制一个分别针对它们每个层次结构调用expire的脚本。而C News对此提供了一个更加方便的解决办法:在一个称为explist的文件中,你可以指定新闻组和过期的间隔时间。一个称为doexpire的命令通常从cron中每天执行一次,并根据这个清单对所有的组进行处理。
    有时候,即使已经过期,你也可能想要保存特定组中的文章;例如,你可能想要保存投递到comp.sources.unix中的程序。这称作存档操作archiving。explist允许你标记出需要存档的组。
    explist中的条目看上去象这样:

    grouplist perm times archive

    grouplist是一个用逗号分开的对应于当前条目的组的清单。层次结构可以通过给出组名前缀来指定,后面可以附加任选的all。例如,对应于所有comp.os下的组,你可以在grouplist中输入comp.os或comp.os.all。
    当从组中对新闻进行过期操作时,将把名字与explist中所有条目以给出的顺序作比较检查。首个匹配的条目将起作用。例如,除了comp.os.linux.announce中的文章你想保留一个星期外,其它多数文章在四天后就丢弃掉,那么你只需针对前者有一个条目,指定过期时间周期为一个星期,后面跟一个针对comp的条目,指定过期周期为四天。
    perm字段详细说明了该条目应用于moderated、unmoderated、还是任何的组。它可以取值m、u、或x,分别表示moderated、unmoderated或任何类型。
    第三个字段times通常只含有一个数。如果没有在文章标题的Expires:字段中人为指定了过期日期,这将是文章将过期的天数。注意这个天数的计数是从文章到达你的站点开始的,而不是从文章投递的日期开始算起的。
    然而,times字段可能更复杂些。它可以是三个用斜杠分开的数字的组合。第一个数字表示文章被认为是过期的所要经过的天数。除了用数字零以外,这个数字很少要用到其它的数。第二个字段是上面所提到的文章过期缺省的天数。第三个字段是一篇文章无条件地所经过的天数,而不管该文章是否有Expires:字段。如果只给出了中间一个数字,那么另两个数就取缺省值。这些可以用特定的条目/bounds/来指定,见下面描述。
    第四个字段archive,表示新闻组是否要进行归档,以及归档到那里。如果并不想要归档,那么就要用一短划线。否则,你或者使用一个全路径名(指向一个目录),或者一个@符号。@符号表示缺省的归档目录,这个缺省目录必须在命令行上用-a标志给予doexpire。归档目录必须属于news。比如,当doexpire从comp.sources.unix归档一篇文章时,就会将该篇文章存储在归档目录下的comp/sources/unix下,如果该目录不存在就会创建它。然而,归档目录本身是不会被创建的。
    在explist文件中有两个特殊条目是doexpire所依赖的。它们有关键字/bounds/和/expired/而不是一个新闻组清单。/bounds/条目含有上述times字段中三个值的缺省值。
    /expired/字段用来确定C News要与history文件中相应行保持多久时间。这是需要的,因为一旦相应的文章已被过期作废处理后,C News将不会从histroy文件中删除一行,但是会与该行保持着联系以防在该日期后重复的文章的到来。如果你只是由一个站点给你喂信的,你可以保持这个值很小。否则的话,在UUCP网络上,可以是几个星期,这要依赖于你经历的从这些站点来的文章的延迟值。
    一个具有非常小的过期间隔时间的explist样本文件见如下所示:

    # Keep histroy lines for two weeks. Nobody gets more than three months
    /expired/ x 14 -
    /bounds/ x 0-1-90 -

    # groups we want to keep longer than the rest
    comp.os.linux.announce m 10 -
    comp.os.linux x 5 -
    alt.folklore.computers u 10 -
    rec.humor.oracle m 10 -
    soc.feminism m 10 -

    # Archive *.sources groups
    comp.sources,alt.sources x 5 @

    # defaults for tech groups
    comp,sci x 7 -

    # enough for a long weekend
    misc,talk x 4 -

    # throw away junk quickly
    juck x 1 -

    # control messages are of scant interest, too
    control x 1 -

    # catch-all entry for the rest of it
    all x 2 -

    就C News的过期操作来讲,还有一些潜在的问题。首先是你的新闻阅读器可能依赖于active文件的第三个字段,其中含有在线文章的最低数量。当对文章进行过期操作时,C News并不更新这个字段。如果你需要(或想要)这个字段反映真实的情况,那么在每次运行doexpire以后,你需要运行一个称为updatemiin的程序。[6]
    其次,C News通过扫描新闻组的目录并不会过期,而只是简单地检查一下history文件看文章是否要过期。[7] 如果history文件由于某些原因不同步了,文章将会永存于你的磁盘上,因为C News已经忘记它们了。[8] 你可以使用/usr/lib/news/bin/maint中的addmissing脚本来修复这个问题,addmissing将把遗漏的文件加进history文件,或者使用mkhistroy,该脚本会从破坏的文件中重建整个history文件。在调用它之前不要忘记换作news用户,否则会引起C News读不了history文件的错误。

    17.7 其它各类文件
    还有许多控制着C News的文件,但对C News的功能来讲并不是很重要的。它们都在/usr/lib/news中。我们将概要地描述它们。

    newsgroups 这是active的搭档文件,含有新闻组名称的清单和对每个新闻组的主题的单行描述。在C News接收到一个checknews控制消息时(见章节17.8)这个文件会自动更新。

    mailpaths 含有每个moderated组的moderator地址。每行含有组名,后跟moderator的电子邮件地址(由制表符TAB分隔)。
    提供了两个特殊的条目作为缺省。这些是backbone和internet。两个都以bang-path表示方法提供了到最近的主干站点、以及理解RFC 822地址(user@host)的站点的路径。缺省的条目为

    internet backbone

    如果已安装了smail或sendmail,那么你就不需要改变internet条目,因为它们了解RFC 822寻址方式。
    每当用户投递到一个moderator没有明确列出的moderated组,就要用到backbone条目。如果新闻组的名称是alt.sewer,并且backbone条目含有path!%s,那么C News会将该文章邮递到path!alt-sewer,并希望主干机器会转发这篇文章。为了找出要使用哪个路径,请询问喂信给你的站点的管理员。作为最后一个方法,你也可以使用uunet.uu.net!%s。

    distributions 这个文件其实不是一个C News的文件,但是某些新闻阅读器和nntpd使用它。它含有你的站点能够辨认的distributions的清单,以及它所起的作用的描述。例如,虚拟酿酒厂有以下文件:

    world everywhere in the world
    local Only local to this site
    nl Netherlands only
    mugnet MUGNET only
    fr France only
    de Germany only
    brewery Virtual Brewery only

    log 这个文件含有C News所有活动的记录。通过运行newsdaily它被定期地采集;老日志文件的拷贝以log.o、log.oo等保存。

    errlog 这是C News所生成的所有错误消息的日志文件。这些错误不包括由于组的不对而造成的无用文章等。如果这个文件不是空的,就会被newsdaily自动地邮寄给新闻管理员(缺省为usenet)。
    errlog由newsdaily负责清理。旧的拷贝被保存为errlog.o等相似的文件。

    batchlog 此文件记录所有sendbatches的运行结果。通常是不感兴趣的。它也是由newdaily来维护的。

    watchtime 这是newswatch每次运行时产生的空文件。

    17.8 控制消息
    Usenet新闻协议知道一特殊类型的文章能够引起新闻系统特定的响应或动作。这些特殊类型的文章称为控制消息(control message)。它们是通过文章标题中存在着Control:字段来辨认的,其中含有所要执行的控制操作的名称。它们可分为几类,但所有都是通过位于/usr/lib/news/ctl中的shell脚本来处理的。
    在C News处理这类文章的同时,大多数这类文章会自动地执行它们的操作,而不会通知新闻管理员。缺省地,只有checkgroups消息会被送给新闻管理员,[9] 但你可以通过编辑脚本来改变这种情况。

    17.8.1 cancel消息
    最为大家知晓的消息是cancel,使用它用户可以取消她早些时候发送的文章。如果该文章存在的话,这可以有效地从假脱机目录中删除这篇文章。cancel消息会被转发到所有从这个被作用的组中接收新闻的站点去,而不管该文章是否早已有了。这是考虑到原来的文章可能会被取消消息所延误。有些新闻系统允许用户取消其他人的信息;这当然是不可取的。

    17.8.2 newgroup和rmgroup
    涉及创建和删除新闻组的两个消息是newgroup和rmgroup。在“普通”层次结构下的新闻组只有在Usenet读者中经过讨论和表决之后才可以被建立。而应用于alt层次结构的规则几乎允许是可以随意创建新闻组的。有关更多的信息,请参见定期投递到news.announce.newusers和news.announce.newgroups中的信息。绝对不要发送一个newgroup或rmgroup消息除非你确实知道允许你这样做。

    17.8.3 checkgroups消息
    checkgroups消息是由新闻管理员发送的用以使得在一个网络中的所有站点的active文件与真实的Usenet同步。例如,商业Internet服务提供者可能会向他们的客户站点发出这样一个消息。对于主要层次结构的“官方的”checkgroups消息由它的moderator每月一次地投递到comp.announce.newgroups。然而它是作为一个普通文章投递的,而不是作为一个控制消息。为了进行checkgroups操作,将该文章保存到一个文件中,比如/tmp/check,将直到控制消息开始处的所有信息删除,并使用下面的命令将它送至checkgroups脚本:

    # su news –c “/usr/lib/news/bin/ctl/checkgroups” < /tmp/check

    这将更新你的newsgroups文件,并将列于localgroups中的组加入其中。而老的newsgroups文件将被更名为newsgroups.bac。注意,本地投递该消息是不起作用的,因为inews会拒绝接受这样一个大型文章的。
    如果C News发现checkgroups列表与active文件之间不匹配,那么它会生成一个命令清单来让你的站点更新到最新,并将该命令列表邮寄给新闻管理员。典型的输出看上去象这样:

    From news Sun Jan 30 16:18:11 1994
    Date: Sun, 30 Jan 94 16:18 MET
    From: news (News Subsystem)
    To: usenet
    Subject: Problems with your active file

    The following newsgroups are not valid and should be removed.
    alt.ascii-art
    bionet.molbio.gene-org
    com.windows.x.intrisics
    de.answers

    You can do this by executing the commands:
    /usr/lib/news/bin/maint/delgroup alt.ascii-art
    /usr/lib/news/bin/maint/delgroup bionet.molbio.gene-org
    /usr/lib/news/bin/maint/delgroup comp.windows.x.xintrisics
    /usr/lib/news/bin/maint/delgroup de.answers

    The following newsgroups were missing.
    comp.binaries.cbm
    comp.databases.rdb
    comp.os.geos
    comp.os.qnx
    comp.unix.user-friendly
    misc.legal.moderated
    news.newsites
    soc.culture.scientists
    talk.politics.crypto
    talk.politics.tibet

    当你从你的新闻系统收到象这样的信息时,不要盲目地相信它。依赖于是谁发送的checkgroups消息,它可能缺少几个组或着甚至是整个层次结构;所以在删除任何组时你应该小心谨慎。如果发现你想在你的站点上要的组被列为遗漏的,那么你就必须用addgroup脚本来增加它们。将遗漏组的清单保存到一个文件中并将该文件送给下面的小脚本中:

    #!/bin/sh
    cd /usr/lib/news

    while read group; do
    if grep –si “^$group[[:space:]].*moderated” newgroup; then
    mod=m
    else
    mod=y
    fi
    /usr/lib/news/bin/maint/addgroup $group $mod
    done

    17.8.4 sendsys、version和senduuname
    最后,还有三个消息可以用于找出有关网络的拓扑。这些消息是sendsys、version和senduuname。它们将使得C News分别将sys文件、一个软件版本字符串、以及uuname(1)的输出返回给发送者。对于version消息C News是非常简明的;它返回一简单的明了的“C”。
    再者,你绝对不要发出这样的消息,除非你确信该消息不会跑到你的(区域)网络以外去。对sendsys消息的应答可以很快地使一个UUCP网络瘫痪。[10]

    17.9 NFS环境中的C News
    在一个本地网络中发布新闻的一个简单方法是将所有新闻保存在一个中央主机上,并通过NFS将相关的目录输出,这样新闻阅读器就可以直接扫描文章。在NNTP上这种方法的优点是检索和调度文章的负荷是相当低的。另一方面,在一个主机的设备变化极大的多机种的网络中,或者是用户在服务器机器上没有等效的帐号的情况下,NNTP是胜任的。
    当使用NFS时,在本地主机上投递的文章必须被转发到中央主机上,因为否则的话,访问管理用的文件可能会将系统暴露在不同的条件下而导致文件的不一致。同样,你可能想通过将你的也需要转发到中央机器上的新闻假脱机区域公布为只读来加以保护。
    C News能够透明地对此进行处理。当你投递了一篇文章,你的新闻阅读器通常会调用inews来将这篇文章送入新闻系统。这个命令对该文章进行一系列的检查、完善标题,并检查/usr/lib/news中的文件server。如果这个文件存在并且其中含有不同于本地主机的主机名,此时,通过rsh在那个服务器主机上inews被调用。由于inews脚本使用了很多的二进制命令和C News中的支持文件,所以你必须在本地安装了C News,或者从服务器将news软件加载(mount)过来。
    为了让rsh调用能正常地工作,每个用户必须在服务器系统上有一个相同的帐号,也即,一个不需要再被要求密码的帐号。
    请确保在server中给出的主机名与服务器机器上hostname(1)命令的输出是匹配的,否则在试投该文章时C News将永远地循环下去。

    17.10 维护工具和任务
    尽管C News很复杂,但是一个新闻管理员的日常工作可以是非常轻松的,因为C News为你提供了大量的维护工具。其中有些是用于定期地从cron中运行的,象newsdaily。使用这些脚本可以大大地减少C News的日常维护和喂信需求。
    除非另加说明,这些命令都位于/usr/lib/news/bin/maint中。注意,在调用这些命令之前你必须是news用户。用超级用户的身份来运行这些命令可能会导致C News不能访问这些文件。

    newsdaily 这个名称本身就说明了自己:每天运行一次。这是一个重要的脚本,它帮助你保持日志文件的短小、保存最后三次运行的每个拷贝。它也试图检测出任何的异常情况,比如在入站和出站目录中早已失效的批处理、向未知的或moderated新闻组的投递活动,等等。产生的错误消息将被邮寄给新闻管理员。

    newswatch 这是一个应该定期运行的脚本程序用以查找新闻系统中的异常情况,一般一个小时左右运行一次。它是用来检测对新闻系统的运行有着即可影响的问题并且将问题报告邮寄给新闻管理员。所要检查的情况包括陈旧被锁定而删除不掉的文件、没有预订的输入批处理、以及磁盘空间的短缺。

    addgroup 给你本地站点增加一个组。适当的调用是

    addgroup groupname y|n|m|=realgroup

    第二个参数有着与active文件中的标志同样的含义,意思是任何人都可以向该组中投递(y)、任何人都不可以向该组投递(n)、那是一个moderated组(m)、或者这是另外一个组(=realgroup)的别名。
    当最新建立的组的文章在newgroup控制消息打算创建该组之前到来时,你也可以使用addgroup。

    delgroup 允许你删除本地的一个组。调用方式如

    delgroup groupname

    你仍然需要删除余留在新闻组假脱机目录中的相应文章。或者,你也可以任随它自然地消去(也叫作过期expire)。

    addmissing 将遗漏的文章加到history文件中。当发现有文章好象老是存在时,就运行这个脚本程序。[11]

    newsboot 这个脚本程序应该在系统启动时运行。它会删除当新闻进程在关机时刻被杀死时所遗留下来的任何锁定的文件,并且会关闭和执行任何从NNTP连接余留下来的批处理,这是在系统关闭时所中止的NNTP连接。

    newsrunning 这个程序在/usr/lib/news/bin/input中,可以用来,例如在工作时间内,禁止对入站新闻的解批处理操作(unbatching)。你可以通过调用

    /usr/lib/news/bin/input/newsrunning off

    来关闭解批处理操作。
    用on代替off就可以开启它。



    注释
    [1] 在你的站点上的组和那些你的站点要接收的组之间可能会有些不同。例如,订阅清单可能指明comp.all,这表明在comp结构下的所有新闻组,但是在你的站点上,只有几个comp组列在active中。邮递到那些组的文章都将移入junk。
    [2] 注意,为了不破坏文件的权限,这应该是news的crontab。
    [3] 比如对于一篇在Hamburg投递的文章通过荷兰的reston.ans.net、甚至通过U.S的某些站点跑到了Frankfurt。
    [4] 如果你并不关心假脱机文件的数量(因为你是使用你的计算机的唯一的人,并且你不会写出有兆字节大的文章来),你可以用一简单的exit 0语句来替换脚本中的内容。
    [5] 作为与C News一起发行,compcun用12比特选项使用compress,因为对于很多站点来说,这是最经济实惠的(最小公分母)。你可以生成它的一个拷贝,比如说是compcun16,这里你使用16比特压缩。但是改进并不是很明显。
    [6] 对于C News的早期版本,是用一个称为upact的脚本来完成的。
    [7] 文章到达的日期是保存在histroy行的中间字段中,从1970年1月1日算起以秒计。
    [8] 我不知道这为什么会发生,但对于我来说,这并不是经常的。
    [9] 在RFC 1036(p.12)中有一个有趣的排印错误:“Implementors and administrators may choose to allow control messages to be carried out automatically, or to queue them for annual processing.”
    [10] 我也不会在Internet上试用的。
    [11] 还想知道如何除去“Help! I can’t get X11 to work with 0.97.2!!!”这样的文章吗?
    发布人:netbull 来自:Linux自由鸽