Telnet smtp命令bash 2.05脚本问题
逐行运行,但在脚本中不起作用 我想尽了一切办法 这在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
{ 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实际退出时,完成此步骤。
您可以通过在末尾添加延迟来解决此问题。 这是一种丑陋的黑客行为,最好用知道如何正确关闭套接字的工具来代替,但这种廉价而肮脏的方法看起来是这样的:
{ ...; echo "."; echo "quit"; sleep 2; } | telnet mailserver.actualdomain.org 25
对于新的开发,考虑使用一个内置的目标工具,或者是许多实现的一个。
socat
有文件记录的行为明确地让它在退出之前等待完成发送在其stdin上接收到的内容,并打印通过套接字接收到的响应;只要它在等待服务器响应的时间上有一个超时,就可以显式配置该超时。同意Charles的观点,这必须是不同版本的telnet。还有一些想法
#/用户/bin/expect
spawn telnet localhost 25在回显“退出”
后放置睡眠
是否有任何区别?是的!:)睡到最后…唉,我怎么没想到。谢谢,但是为什么它在bash 4.4中工作呢?如果我用sleep 2
替换每个sleep 1
,并添加一个sleep 2代码>在echo“quit;”
之后,它适用于bash2.05和4.3.48。时间问题?是的,也许是时间问题。我现在收到250个回复,邮件正在排队等待投递…在那之前,我没有收到回复。它刚刚退出,外部主机关闭了连接。