2016-01-23 75 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