Telnet smtp命令bash 2.05脚本问题

Telnet smtp命令bash 2.05脚本问题,bash,telnet,Bash,Telnet,逐行运行,但在脚本中不起作用 我想尽了一切办法 这在bash 2.05中不起作用 { sleep 1; echo "helo localhost"; sleep 1; echo "mail from: test@maillinux.net"; sleep 1; echo "rcpt to: user@actualdomain.org"; sleep 1; echo "data"; sleep 1; echo "subject: test"; echo; echo "some text" ;e

逐行运行,但在脚本中不起作用

我想尽了一切办法

这在bash 2.05中不起作用

  { sleep 1; echo "helo localhost"; sleep 1; echo "mail from: test@maillinux.net"; sleep 1; echo "rcpt to: user@actualdomain.org"; sleep 1; echo "data"; sleep 1; echo "subject: test"; echo; echo "some text" ;echo "."; echo "quit"; } | telnet mailserver.actualdomain.org 25
但是如果你一行一行地做

telnet mailserver.actualdomain.org 25
220...
helo localhost
250...ok
mail from: test@maillinux.net
250..ok
rcpt to: user@actualdomain.org
250...ok
data
354 Start mail input; end with <CRLF>.<CRLF>
subject: test

some text
.
quit
telnet mailserver.actualdomain.org 25
220...
helo本地主机
250…好的
邮寄地址:test@maillinux.net
250.好的
rcpt至:user@actualdomain.org
250…好的
数据
354开始邮件输入;以…结束。
主题:测试
一些文本
.
退出
然后它工作了,我收到了邮件。 该脚本在较新的Bash4.4中工作,但我需要它在2.05中工作。 在我看来,它不做回音。et结束了,也没有完成邮件…因此不发送它。 但是为什么

我希望它能发送邮件,但它不能

这可能是telnet版本的不同,而不是bash版本的不同。 在这样的管道中使用网络工具时,一个常见的问题是如何在stdin上处理EOF。你需要的是这样的行为:

{ ...; echo "."; echo "quit"; sleep 2; } | telnet mailserver.actualdomain.org 25
  • 您的输入将写入telnet的stdin
  • …在此过程中,telnet开始将该输入发送到远程服务器
  • Telnet的stdin被赋予一个EOF(文件结束)此时会立即退出一些损坏的telnet版本。
  • …telnet不断将从其stdin读取的所有内容发送到远程服务器
  • …telnet将读取的所有内容发送到远程服务器,然后关闭套接字的发送端(通过FIN数据包)
  • …服务器不断向客户端发送内容,直到发送了需要执行的任何响应,然后服务器通过发送另一个FIN关闭自己的端
  • telnet会在从服务器获取FIN之前打印所有信息当正确写入的telnet实际退出时,完成此步骤。
如上所述,许多实际存在的telnet版本都是假设人类使用而不是脚本来编写的。接收到EOF时,它们不会通过线路发送缓冲内容,也不会在关闭接收端之前等待服务器的任何响应,而是在看到EOF时立即退出


您可以通过在末尾添加延迟来解决此问题。 这是一种丑陋的黑客行为,最好用知道如何正确关闭套接字的工具来代替,但这种廉价而肮脏的方法看起来是这样的:

{ ...; echo "."; echo "quit"; sleep 2; } | telnet mailserver.actualdomain.org 25

对于新的开发,考虑使用一个内置的目标工具,或者是许多实现的一个。
socat
有文件记录的行为明确地让它在退出之前等待完成发送在其stdin上接收到的内容,并打印通过套接字接收到的响应;只要它在等待服务器响应的时间上有一个超时,就可以显式配置该超时。

同意Charles的观点,这必须是不同版本的telnet。还有一些想法

  • 您可以简单地使用expect和send命令来自动执行telnet命令
  • #/用户/bin/expect
    
    spawn telnet localhost 25在
    回显“退出”
    后放置
    睡眠
    是否有任何区别?是的!:)睡到最后…唉,我怎么没想到。谢谢,但是为什么它在bash 4.4中工作呢?如果我用
    sleep 2
    替换每个
    sleep 1
    ,并添加一个
    sleep 2
    echo“quit;”
    之后,它适用于bash2.05和4.3.48。时间问题?是的,也许是时间问题。我现在收到250个回复,邮件正在排队等待投递…在那之前,我没有收到回复。它刚刚退出,外部主机关闭了连接。