我正在尝试记录由我们的 RANCID 安装记录的更改,并将其发送到我们拥有的内部通信广播系统。我可以通过 netcat 直接与此对话,例如这将有效:
echo "Hello world" | netcat localhost 12345
RANCID 通过电子邮件发送更改,因此我尝试使用 procmail 拦截这些电子邮件并将它们发送到我们本地的 pastebin,然后将响应(包含 URL)传送到 netcat。
我可以在命令行上复制整个流程,如下所示:
testmail=$(cat testmail.txt)
URL=$(curl --silent -d "text=$testmail" -d "title=Logged Activity" http://paste/api/create) && echo "RANCID logged some changes: $URL" | netcat localhost 12345
这是我目前的.procmailrc:
## store the body in MESSAGE
:0 b
MESSAGE=|
##Send that message to Wirehive pastebin
:0
| URL=$(curl -d "text=$MESSAGE" -d "title=Logged Activity" http://paste/api/create) && echo "RANCID logged some changes: $URL" | netcat localhost 12345
检查邮件日志,邮件路由工作正常。将文件全部注释掉并在 mutt 中检查接收用户的邮箱后,我可以看到邮件进来了。取消注释文件后,邮件不会出现在邮箱中,因此 .procmailrc 正在被处理,邮件正在传递给它。
值得注意的是这是在 Ubuntu 12.04 上。
答案1
作业MESSAGE
没有按照您编写的方式进行。尝试以下操作:
:0b
MESSAGE=| cat
此外,URL=...
赋值不是一个有效的命令;您必须重构变量赋值以使其超出范围:
URL=`curl --silent -d "text=$testmail" -d "title=Logged Activity" http://paste/api/create`
:0
| echo "RANCID logged some changes: $URL" | netcat localhost 12345
...或者您可以通过让它调用 shell 来使其工作,通常通过添加以下之一SHELLMETAS
:
:0 # notice semicolon at end
| URL=$(curl -d "text=$MESSAGE" -d "title=Logged Activity" http://paste/api/create) \
&& echo "RANCID logged some changes: $URL" | netcat localhost 12345 ;
...但我实际上更喜欢前者,更具可读性的替代方案。
如果您可以以某种方式重构curl
命令行以读取标准输入并写入标准输出,那么这可以变得更加优雅,至少可以避免单独的MESSAGE
变量,甚至可能重构为单行。