我正在尝试对异构服务器池中使用的 smtp 服务器进行分类,到目前为止我正在执行以下操作:
echo "HELO localhost" | telnet localhost 25 2>/dev/null | grep 220
#process the output of command
我的问题是服务器在套接字关闭之前并不总是有时间回答“220 ...”。
因此,我正在寻找一个相对较短、基于 bash 且更可靠的脚本。我找不到一种简单的方法让命令在关闭 TCP 连接之前等待几秒钟。
我尝试过expect
,但无法让它工作,因为这需要一个外部文件,而该文件并不真正适合我的审计套件,而且我不能确定它是否可以在所有服务器上使用。
有什么简单的想法吗?
编辑:版本(是的,我知道,很老了):
- 更新:
- coreutils-4.5.3-28.1
- linux-2.4.21
答案1
使用nmap(1)
指纹识别功能,来自手册页:
SERVICE/VERSION DETECTION:
-sV: Probe open ports to determine service/version info
一个例子:
$ nmap -sV some.mail.server.biz -p 25
Starting Nmap 6.40 ( http://nmap.org ) at 2013-09-17 17:50 CEST
Nmap scan report for some.mail.server.biz (10.0.0.135)
Host is up (0.0052s latency).
PORT STATE SERVICE VERSION
25/tcp open smtp MailEnable smptd 7.08--7.08
Service Info: Host: some.domain.com; OS: Windows; CPE: cpe:/o:microsoft:windows
Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 13.67 seconds
我不知道它对你是否有用,但输出使用持续教育。
答案2
聊天中的 Bob 建议使用子外壳,包括在两个回显之间进行睡眠。
这很有魅力:
( echo "EHLO `hostname`"; sleep 1; echo "QUIT" ) | telnet `hostname` 25
我grep 220
现在可以,并且我很确定能在一秒的范围内得到答案。