如何在bash脚本中的流水线命令之间插入延迟.例如猫文件| telnet mail.domain.com 25

gab*_*tzi 14 linux email bash telnet

我有一个创建文件的bash脚本,我想通过telnet发送电子邮件.然而,有时它会执行,有时它不会执行.

最后的命令是

cat tempfile | telnet mail.domain.com 25
Run Code Online (Sandbox Code Playgroud)

在接收服务器上,我在mail.log中看到失败时出现以下错误:

improper command pipelining after EHLO from domain.com ....etc
Run Code Online (Sandbox Code Playgroud)

如果不是mail.domain.com,那么相同的脚本可以正常工作.我在localhost中启动telnet会话,所以我很确定文件格式是否正常,其余的bash脚本也正常工作.

我也尝试过使用标准重定向而不是管道

telnet mail.domain.com 25 < tempfile
Run Code Online (Sandbox Code Playgroud)

但有时候结果有时是好的.我认为重定向和telnet会话命令之间需要有一个小的延迟,以便在建立telnet会话并给出响应后给出输入,但我不知道如何做到这一点.我尝试在管道和重定向之间使用sleep命令,它可能无法工作,因为这时输入被重定向到sleep命令.

e.g. cat tempfile | telnet mail.domain.com 25 & sleep 1
Run Code Online (Sandbox Code Playgroud)

限制是我必须在bash脚本中执行此操作.可能吗?此外,我不知道它是否有任何重要性,但脚本用于在debian挤压服务器之间工作与后缀/快递设置,现在接收端设置与debian wheezy和postfix/dovecot.

在此先感谢您的帮助

小智 23

你可以尝试类似的东西:

(echo -n; sleep 5; cat tempfile) | mail.domain.com 25
Run Code Online (Sandbox Code Playgroud)

打开连接并写入任何内容,等待5秒钟然后写下剩下的内容.

  • `{echo -n; 睡5; cat tempfile; } | ......`会避免不必要的子壳. (8认同)
  • 非常感谢快速响应:)这完美无缺.即使没有echo -n,它仍然会等待5秒钟,然后写下其余部分.我从没想过把它包含在()中.我用{}试了一下它仍然有效,所以两个答案都很好.然而,{}我必须使用echo -n; (2认同)