📄 1382.html
字号:
<br>
2.1适宜的模式(-b)<br>
<br>
sendmail程序的“-b”参数可以衍生出许多功能。例如:使sendmail显示队列的内容,使sendmail重建别名数据库。本章将介绍一些比较常用到的子参数。<br>
<br>
格式 说明<br>
-ba 使用ARPAnet(灰皮书书)协议<br>
-bD 以守候进程模式运行,但不fork<br>
-bd 以守候进程模式运行<br>
-bH 清除固有的主机状态<br>
-bh 打印固有的主机状态<br>
-bi 重建别名数据库<br>
-bm 成为一个邮件发送者<br>
-bp 打印邮件队列内容<br>
-bs 在标准输入处运行SMTP<br>
-bt 测试模式:仅解析地址<br>
-bv 检验:不收集、分发<br>
-bz 冻结配置文件<br>
<br>
选项可以使sendmail执行时象其它名字。每个名字可以是一个硬连接,一个符号连接,或sendmail的一份拷贝。<br>
<br>
hoststat -bh 打印固有主机状态<br>
mailq -bp 显示邮件队列内容<br>
newaliases -bi 重建别名数据库<br>
purgestat -bH 清除固有主机状态<br>
smtpd -bd 以守侯进程运行<br>
<br>
2.1.1 守候进程模式 (-bd)<br>
<br>
sendmail程序能够在后台以守侯进程模式运行,监听来自其它机器的邮件。Sendmail当第一次以守侯进程模式运行时,程序只读取配置文件一次,然后就一直运行,不再读取配置文件了。也就是说,执行后将不会发现配置文件的变化。<br>
<br>
当你对配置文件sendmail.cf做了任何修改,都需要kill掉sendmail进程,然后重新启动它。但当你kill掉这个守候进程前,必须知道如何正确地重新启动它。这些信息是/etc/sendmail/pid或一个系统rc文件。<br>
<br>
在BSD系列的UNIX系统,守候进程通常使用以下命令启动:<br>
<br>
/usr/lib/sendmail –bd –q1h<br>
<br>
命令行开关选项“-bd”指定sendmail以守候进程方式运行。“-q”选项告诉sendmail多久去查看一次待处理邮件队列。“-q1h”就是将其设置为1小时。<br>
<br>
在你的机器上启动sendmail的命令,可能与我们这儿给出的是不同的。如果你管理许多不同的UNIX系统,你无须知道每一种是如何运行的。<br>
<br>
2.1.1.1 kill并重启sendmail v8.7<br>
<br>
在sendmail 8.7以后的版本中,kill并重启sendmail变得比较简单。一个单一的命令将会完成这一工作:<br>
<br>
% kill –HUP `head –1 /etc/sendmail.pid`<br>
<br>
<br>
这个单一的命令与下一个小节中的两个命令的效果完全相同。<br>
<br>
2.1.1.2 kill并重启sendmail v8.6<br>
<br>
当你要以守候进程方式启动sendmail,你须确认没有一个已运行的sendmail守候进程。在8.6版sendmail中,可以在/etc/sendmail.pid文件的第一行中找到进程ID号pid。你可以执行以下命令来kill掉sendmail:<br>
<br>
% kill `head –1 /etc/sendmail.pid`<br>
<br>
当你kill掉当前运行的守候进程,你可以使用以下命令来重新运行sendmail:<br>
<br>
% `tail –1 /etc/sendmail.pid`<br>
<br>
2.1.1.3 kill并重启老版本sendmail<br>
<br>
在老版本的sendmail中,你必须使用ps来获得sendmail的进程ID号pid。在BSD UNIX和System V UNIX使用ps的方法不尽相同。<br>
<br>
针对BSD UNIX来说,ps命令的将得到类似以下的输出:<br>
<br>
% ps ax | grep sendmail | grep –v grep<br>
99 ? IN 0:07 /usr/lib/sendmail -bd –q1h<br>
% kill 99<br>
<br>
这个输出的最左边的就是进程ID号。<br>
<br>
针对System V UNIX系统来说,ps命令的参数及命令输出都不尽相同:<br>
<br>
<br>
% ps ae | grep sendmail<br>
99 ?0:01 sendmail<br>
% kill 99<br>
<br>
<br>
在老版本的sendmail中,你必须通过查看rc文件来获知如何重启sendmail。<br>
<br>
2.1.1.4 如果你忘记了kill守候进程<br>
<br>
如果你在重启sendmail时,忘了kill掉原来的进程的话,你就会看到类似以下列出的错误消息,每5秒显示一次。<br>
<br>
Getrequests: cannot bind: Addredd already in use<br>
Getrequests: cannot bind: Addredd already in use<br>
Getrequests: cannot bind: Addredd already in use<br>
Getrequests: cannot bind: Addredd already in use<br>
Getrequests: cannot bind: Addredd already in use<br>
Getrequests: cannot bind: Addredd already in use<br>
Getrequests: cannot bind: Addredd already in use<br>
Getrequests: cannot bind: Addredd already in use<br>
Getrequests: cannot bind: Addredd already in use<br>
Getrequests: cannot bind: Addredd already in use<br>
Getrequests: cannot bind: Addredd already in use<br>
Opendaemonsocket: Server SMTP socket wedged:exiting<br>
<br>
2.1.2 显示邮件队列模式 (-bp)<br>
<br>
sendmail程序能够显示邮件队列的内容。可以通过两种方法实现:一种是运行mailq,另一种是运行带开关选项“-bp”的sendmail。无论你使用哪种方法,邮件队列将会显示出来。如果这个队列是空的,sendmail将打印出:<br>
<br>
Mail queue is empty<br>
<br>
如果有一个邮件正在等待队列中,那么将输出更多的消息,其中包含类似于下列的信息:<br>
<br>
) Mail Queue (1 requests)<br>
--Q-ID--- --Size-- ----Q-Time<br>
-------------------Sender/Recipient-------------------<br>
GAA29775* 702 Thu Mar 12 16:51<you@here.us.edu><br>
Deferred:Host fbi.dc.gov is down<br>
<george@fbi.dc.gov><br>
<br>
在此,带开关选项“-bp”的sendmail显示了仅有一个邮件信息在队列中。如果有多个,那么每一个邮件都会像这样列出来。每一个至少有两行输出。<br>
<br>
第一行显示邮件和发送者的细节信息。GAA29775是这个邮件在队列中的标记。“*”号则代表由于这个邮件正在被处理,所以已被锁定。“702”是邮件体的字节数。这里的时间则是邮件被放入队列的时间。地址则显示了发送者的名字。<br>
<br>
第二行则可能显示出错的原因,这个邮件就是因为暂时无法分发,所以才暂存在队列中的。<br>
<br>
第三行则可能显示接收者地址。<br>
<br>
如果你想更完整、清楚地了解这里的输出,参见第23章:队列。<br>
<br>
2.1.3 重建别名库模式 (-bi)<br>
<br>
由于sendmail有可能需要在存放上千条别名记录的aliases文件中寻找别名,为了提高效率,可以使用dbm或db格式来存储。使用这种数据库格式来存储将大大提高检索速度。<br>
<br>
尽管sendmail可以在aliases文件改变时自动更新数据库,但它并不总能及时完成。你可以通过运行newaliases命令或带“-bi”开关选项的sendmail来完成,以下这两个命令是相同的:<br>
<br>
% newaliases<br>
% /usr/lib/sendmail -bi<br>
<br>
稍过一会儿,将显示出统计信息:<br>
<br>
/etc/aliases: 859 aliases, longest 615 bytes, 28096 bytes total<br>
<br>
<br>
这一行表示数据库已成功重建。从8.6版以后,就可以存在多个别名文件,所以每一行都是以别名文件名开始的。然后是显示处理了的别名,最大的一项的长度,总长度, 同时有多少个出错也会显示出来。<br>
<br>
关于aliases文件更详细的信息,参见第24章:别名。<br>
<br>
2.1.4 校验模式 (-bv)<br>
<br>
带开关选项“-bv”的sendmail是一个简单方便的检查别名的工具。它能够在别名中递归地查找,并显示出最终的用户名称。<br>
<br>
假设aliases文件中有如下别名设置:<br>
<br>
animals: farmanimals, wildanimals<br>
bill-eats: redmeat<br>
birds: farmbirds, wildbirds<br>
bob-eats: seafood,whitemeat<br>
farmanimals: pig, cow<br>
farmbirds: chicken, turkey<br>
fish: cod, tuna<br>
redmeat: animals<br>
seafood: fish,shellfish<br>
shellfish: crab, lobster<br>
ted-eats: bob-eats, bill-eats<br>
whitemeat: birds<br>
wildanimals: deer, boar<br>
wildbirds: quail<br>
<br>
虽然你也可以通过演算得知ted-eats最终的用户名称,但远不如使用sendmail来帮你完成那样方便。使用sendmail也将更加准确,而且对于很大很复杂的aliases文件来说,更加显得重要。<br>
<br>
另外,sendmail –bv还有一个附加的功能,那就是可以检验别名是否真的可分发。假设在aliases文件中包含以下一行:<br>
<br>
root: fred, larry<br>
<br>
假定fred是一个拥有本地机器帐户的系统管理员,但用户larry已经离开,帐号已经被删除。你可以运行sendmail –bv检查所有的用户是否有效:<br>
<br>
% /usr/lib/sendmail –bv root<br>
<br>
这个命令将在aliases文件检查root用户,由于larry不存在,输出将会如下所示:<br>
<br>
larry … User unknow<br>
fred … deliverable: mailer local, user fred<br>
<br>
2.2冗长模式(-v)<br>
<br>
命令行开关选项“-v”,将使sendmail运行在冗长(verbose)模式下。在这个模式下,sendmail将会打印出转发邮件的每一步的详细说明。为了观察运行在冗长模式下sendmail的运行情况,可以执行:<br>
<br>
% /usr/lib/sendmail –v you < sendstuff<br>
<br>
邮件传送在本地进行,输出如下所示:<br>
<br>
you … Connecting to loca…<br>
you … Sent<br>
<br>
当sendmail通过TCP/IP网络传送邮件到其它机器,它将使用一个叫SMTP(简单邮件传输协议)。为了观察使用SMTP的情况,我们再次运行sendmail程序,但这次,我们使用一个不在本地的E-mail地址代替“you”:<br>
<br>
% /usr/lib/sendmail –v you@remote.domain < sendstuff<br>
<br>
这个命令的输出看起来类似:<br>
<br>
you@remote.domain … Connecting to remote.domain via smtp …<br>
220-remote.Domain Sendmail 8.6.12/8.5 ready at<br>
Fri, 13 Dec 1996 06:36:12 –0800<br>
220 ESMTP spoken here<br>
>>> EHLO here.us.edu<br>
250-remote.domain Hello here.us.edu,pleased to meet you<br>
250-EXPN<br>
250-SIZE<br>
250 HELP<br>
>>> MAIL From:<you@here.us.edu><br>
250 <you@here.us.edu> … Sender ok<br>
>>> RCPT To:<you@remote.domain><br>
250 <you@remote.domain> … Recipient ok<br>
>>> DATA<br>
354 Enter mail, end with “.” on a line by itself<br>
>>> .<br>
250 GAA20115 Message accepted for delivery<br>
you@remote.domain … Sent (GAA20115 Message accepted for delivery)<br>
Closing connection to remote.domain<br>
>>> QUIT<br>
221 remote.domain closing connection<br>
<br>
以数字开头的行和以字符串“<<<”开头的行组成了SMTP的会话过程。我们马上说谈论一下它们。其它行显示本地sendmail尝试做的操作和成功完成的操作:<br>
<br>
you@remote.domain … Connecting to remote.domain via smtp …<br>
…<br>
you@remote.domain … Sent (GAA20115 Message accepted for delivery)<br>
Closing connection to remote.domain<br>
<br>
第一行显示使用网络发送信件到远程主机remote.domain上。最后两行显示邮件已经发送成功。<br>
<br>
在SMTP会话中,以“<<<”开始的行显示本地机器对远程机器的交谈。而来自远程机器的应答行则以数字开始的行。现在我们来看一下会话过程。<br>
<br>
<br>
220-remote.Domain Sendmail 8.6.12/8.5 ready at<br>
Fri, 13 Dec 1996 06:36:12 –0800<br>
220 ESMTP spoken here<br>
<br>
一旦sendmail与远程机器连接上后,sendmail就等待远程机器初始化会话。远程机器说它准备好发送,详细的主机名。如果远程主机也运行了sendmail,也将说sendmail的名字与版本。还有就是日期与时间。<br>
<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -