Назад | Перейти на главную страницу

Как использовать procmail для передачи сообщения в переменную

Я пытаюсь получить изменения, зарегистрированные нашей установкой 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.

В 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

... или, возможно, вы могли бы заставить его работать, заставив его вызывать оболочку, обычно добавляя один из 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 переменная и, возможно, даже будет преобразована в однострочную форму.