【问题标题】:Procmail - passing body to bash scriptProcmail - 将正文传递给 bash 脚本
【发布时间】:2016-01-23 11:42:40
【问题描述】:

我有一封希望从 procmail 发送到 bash 脚本的班轮邮件。我只想发送尸体,别无其他。

目前我的.procmailrc 看起来像这样:

:0
  *^ Subject.*Xecute Command$
   {
    :0 bf
    | /bin/bash /path/to/script
   }

我的 Bash 脚本很简单:

#!/bin/bash
echo -e "\rLT 4>$0\r\r" > /dev/ttyS1

我没有从任何地方获得任何输入或输出。

任何指针?

【问题讨论】:

  • 我猜你应该使用 $@ 而不是 $0
  • 那很快……让我快速检查一下……
  • 不......它正在做同样的......
  • 哦,愚蠢的我...当然,您的程序没有收到 参数 中的任何内容($1、$2 或整个 $@ 事物),因为邮件是通过管道传输的到它的标准输入。所以你必须 cat 到 /dev/ttyS1

标签: bash procmail


【解决方案1】:

如果打算为电子邮件添加一些装饰并将其打印到串行端口 (?),请尝试类似的方法

:0b
*^ Subject.*Xecute Command$
| ( printf '\rLT 4>'; cat -; printf '\r\r' ) > /dev/ttyS1

如果条件匹配,b 标志将应用于操作行,因此您不需要大括号和新的无条件配方; the f flag makes no sense at all in this context。 (但如果您想保留消息以供进一步处理,您需要添加 c 标志。)

另外,作为记录,Bash 中的$0 是当前正在运行的脚本的名称(或者bash 本身,如果没有运行脚本),$@ 是命令行参数的列表。但是 Procmail 在将消息通过管道传输到脚本时不会使用其中任何一种。它只是在标准输入上可用。

如果您希望在外部脚本中执行操作,当然也可以;但是像这样的简单动作可能最好内联编写。如果脚本文件是可执行的并且具有适当的 shebang,您不需要或不需要显式指定 bash;有 shebang 的原因是为了让脚本独立。

针对 cme​​ts,这里有一个简单的 Perl 脚本,用于提取第一个正文部分的第一行,并执行替换。

 perl -nle 'next if 1../^$/;
    s/\<foo\>/bar/g;
    print "\rLT 4>$_\r\r"; exit(0)'

这在sed 中也不难做到,只要您的sed 理解\r

【讨论】:

  • 这很好用......但是......所有的mime信息都与正文一起发送,消息ID...... --00a113d242456f2d7052a01e4b6 Content-Type: text/plain; charset=UTF-8 来自邮件正文的一行消息--00a113d242456f2d7052a01e4b6
  • 不幸的是,这就是“身体”在这种情况下的含义。如果您知道它只是第一个正文部分中的一行,您可以将操作更改为 sed -n -e '1,/^$/d' -e 's/.*/\rLT 4&gt;&amp;\r\r/p' -e q 之类的东西——您也可以考虑装饰,前提是您的 sed 理解 \r
  • 好吧...请允许我解释一下它的作用...正文中的消息(最多 96 个字符的单行消息)必须发送到 TNC(可调节点控制器) 位于/dev/ttyS1 ...第一个“\r”将换行符发送到“零”TNC命令行内的所有内容...“LT 4>”告诉TNC必须写入某些内容“LT 4”缓冲区(在这种情况下,它是邮件正文中的一行消息......最后 2 个“\r\r”只是用换行符再次清除输入缓冲区......理想情况下我想要正文发送到 bash 脚本以允许进一步处理
  • 就像答案所说的那样,您甚至可以内联复杂的脚本,或者即使是琐碎的处理也可以使用外部脚本。现在这对您有用吗,还是您需要进一步的帮助?
  • 好的,谢谢...我已经进行了更改,并且效果很好...这似乎是一个合理的答案...但是...有没有办法将身体输送到而是一个 BASH 脚本……只是为了让我对其进行更多处理,例如清除不需要的单词,确保格式可以接受等……
【解决方案2】:

这样写你的脚本:

{
echo -e "\rLT 4>"
cat
echo -e "\r\r"
} > /dev/ttyS1

【讨论】:

  • 我尝试了你的建议......但仍然没有任何反应......看起来“tripleee”似乎在正确的轨道上......谢谢你的努力......
  • 这很奇怪。您是否尝试将输出写入某个临时文件而不是 /dev/ttyS1?脚本正文与 Tripleee 示例中的完全相同。
【解决方案3】:

formail 是你的朋友! 将消息传送到:

:0
*^ Subject.*Xecute Command$
| formail -I "" | your-bash-script

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多