2016-01-23 77 views
0

我有一封邮件,我希望从procmail发送到bash脚本中。我只想要发送身体,没有别的。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

我猜你应该使用$ @而不是$ 0 – nsilent22

+0

那是快...让我做了检查快速... – Danny

+0

都能跟得上......它在做同样的.. – Danny

回答

0

写脚本这样的:(?)

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

我试过你的建议......但仍然没有反应......它看起来好像“tripleee”在正确的轨道上......感谢你的努力。 .. – Danny

+1

这很奇怪。您是否尝试将输出写入某个临时文件而不是/ dev/ttyS1?脚本主体和tripleee的例子完全一样。 – nsilent22

+0

它似乎是这样的...是的,我现在用各种消息测试它... – Danny

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标志。)

而且,备案,$0在Bash是当前运行的脚本的名称(或bash本身,如果没有运行脚本),[email protected]是命令行参数列表。但是,当Procmail将消息传递给脚本时,它们不会使用这两种方法;它只是在标准输入中提供。

如果您想要在外部脚本中执行操作,当然也可以;但像这样的一个简单的动作可能更好地写在内联。如果脚本文件是可执行的并且具有合适的shebang,则不需要或需要明确指定bash;制作剪辑的理由是让剧本自成一体。

作为对评论的回应,下面是一个简单的Perl脚本,用于提取第一个正文部分的第一行,并执行替换。

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

这不会是很难在sed做要么,只要你的sed理解\r

+0

这工作完美...但是...所有的MIME信息与消息ID一起与身体一起发送... --00a113d242456f2d7052a01e4b6 Content-Type:text/plain; charset = UTF-8 来自邮件正文的一行消息 --00a113d242456f2d7052a01e4b6 – Danny

+1

不幸的是,这就是“身体”在这种情况下的含义。如果你知道这只是第一个正文部分的一行,你可以将这个动作改为'sed -n -e'1,/^$/d'-e's /.*/ \ rLT 4>& \ r \ r/p'-eq' - 如果你的'sed'能理解'\ r',你也可以考虑装饰。 – tripleee

+0

好的......请允许我解释它的作用......正文中的消息(最多96个字符的单行消息)必须发送到TNC(可调节节点控制器),该TNC位于/ dev/ttyS1 ...第一个“\ r”在TNC命令行中发送一个换行符到“零”......“LT 4>”告诉TNC必须写入“LT 4”缓冲区在这种情况下,它是邮件正文中的单行消息...最后2个“\ r \ r”只是用换行符重新清除输入缓冲区......理想情况下,我希望将主体发送到bash脚本以允许进一步处理 – Danny

0

formail是你的朋友! 管道进入消息:

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