15

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

最后的命令是

cat tempfile | telnet mail.domain.com 25

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

improper command pipelining after EHLO from domain.com ....etc

如果我在 localhost 中启动 telnet 会话而不是 mail.domain.com,则相同的脚本可以完美运行,因此我很确定文件格式正常,并且 bash 脚本的其余部分也可以正常工作。

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

telnet mail.domain.com 25 < tempfile

但同样的结果有时是好的有时不是。我认为重定向和 telnet session 命令之间需要有一个小的延迟,以便在建立 telnet 会话并给出响应后给出输入,但我不知道该怎么做。我试过在管道和重定向之间使用 sleep 命令,它可能不起作用,因为输入被重定向到 sleep 命令。

e.g. cat tempfile | telnet mail.domain.com 25 & sleep 1

限制是我必须在 bash 脚本中执行此操作。可能吗?另外我不知道它是否重要,但脚本用于在 debian 挤压中的服务器之间使用 postfix/courier 设置工作,现在接收端使用 debian wheezy 和 postfix/dovecot 设置。

在此先感谢您的帮助

4

2 回答 2

26

您可以尝试以下方法:

(echo -n; sleep 5; cat tempfile) | mail.domain.com 25

打开连接并且什么都不写,等待 5 秒然后写剩下的。

于 2013-10-11T19:10:39.417 回答
0

如何在 bash 脚本中的流水线命令之间插入延迟

如果您想延迟每条管道线,请使用:

cat tempfile | { while read l ; do sleep 1; echo $l; done } | awk '{print $2}'

可以说tempfile内容如下:

line1 content1
line2 content2
line3 content3

上面的命令将打印:

line1
line2
line3

每行每秒打印一次。

你也可以在{ while read l ; do sleep 1; echo $l; done }里面添加一个名为的脚本文件delay-piped-line,这样你就可以像这样使用它:

cat tempfile | delay-piped-line | awk '{print $2}'
于 2022-01-08T02:05:09.733 回答