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

Posted

技术标签:

【中文标题】如何在 bash 脚本中的流水线命令之间插入延迟。例如。猫文件 |远程登录 mail.domain.com 25【英文标题】:How to insert a delay between pipelining commands in a bash script. E.g. cat file | telnet mail.domain.com 25 【发布时间】:2013-10-19 23:01:58 【问题描述】:

我有一个创建文件的 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 设置。

提前感谢您的帮助

【问题讨论】:

【参考方案1】:

你可以试试这样的:

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

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

【讨论】:

echo -n; sleep 5; cat tempfile; | ... 会避免不必要的子shell。 非常感谢您的快速响应:) 这完美无瑕。即使没有 echo -n 它仍然会等待 5 秒,然后再写入其余部分。我从没想过将它包含在()中。我用 尝试过,它仍然有效,所以两个答案都很好。但是对于 我必须使用 echo -n;【参考方案2】:

如何在 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

每秒打印每一行。

您还可以在名为delay-piped-line 的脚本文件中添加 while read l ; do sleep 1; echo $l; done ,以便您像这样使用它:

cat tempfile | delay-piped-line | awk 'print $2'

【讨论】:

以上是关于如何在 bash 脚本中的流水线命令之间插入延迟。例如。猫文件 |远程登录 mail.domain.com 25的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AutoHotkey 中的 SendInput 命令之间添加延迟?

windows怎么提取bash脚本

执行 bash 脚本时隐藏 Gitlab 管道日志中的变量值

解析/传递命令行参数到bash脚本 - “$ @”和“$ *”之间有什么区别?

如何在bash脚本中执行存储在heredoc中的curl命令?

如何在 bash shell 脚本中的 perl 命令调用中使用 shell 变量?