为什么将命令管道化到 telnet 会导致间歇性连接失败?

为什么将命令管道化到 telnet 会导致间歇性连接失败?

作为对许多没有该mail命令的服务器的一种廉价的黑客解决方法,编写了一个脚本,将 SMTP 命令回显到 telnet 会话中。脚本的相关部分如下所示

telnet mailserver 25 << EOF
EHLO $HOST
MAIL FROM: root@$HOST
(and so on)
EOF

这会间歇性地失败,并显示“远程主机关闭连接”。tcpdump失败会话的 A 确认 Postfix 邮件服务器正在关闭连接立即地发送220欢迎消息后。也就是说,输入重定向尚未通过网络完成。

到目前为止,我还不能确定失败的情况,但我可以确认nc每次使用(netcat)都能顺利运行。

该网站和 Stack Overflow 上的许多问题都坚信这nc是完成这项工作的正确工具。我感兴趣的是为什么事实就是如此。

  • 为何故障是间歇性的?
  • 为什么在重定向的单行输入通过网络发送之前邮件服务器就挂断了?
  • 为何telnet断而不netcat破?

答案1

这种情况很可能是因为邮件主机的延迟被忽略了。发送电子邮件需要先建立连接,然后才能收到响应。如果在服务器响应之前发出 MAIL FROM,则发送将失败。事实上,一些服务器依靠稍微延迟此 HELO 响应来停止此泵并关闭连接行为,就像垃圾邮件发送者经常做的那样。

有办法解决这个问题(最好不要使用 Telnet),否则可以使用某种聊天脚本。如果您无法使用,手动添加延迟不会解决问题,但可以大大限制问题。

由于您似乎正在使用某种 Linux 环境,因此使用 nc (netcat) 而不是 Telnet 被认为是最佳实践。链接展示了如何使用 netcat 和“expect”更好地发送电子邮件并正确处理时间。

相关内容