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

Сценарий sendmail bash, вызываемый cron, не может читать из stdin

Я пытаюсь написать небольшой скрипт, который перезаписывается с адреса nullmailer. У Nullmailer есть опция «allmailfrom», вы можете поместить адрес электронной почты в / etc / nullmailer / allmailfrom, и все отправленные письма будут иметь этот адрес как «Return-Path», но From по-прежнему является значением, поэтому отправляющая программа, такая как pi @ raspberrypi

Итак, я попытался создать небольшой скрипт, чтобы переписать адрес from. Обычно вы перемещаете sendmail в sendmail-bin и называете созданный скрипт sendmail. Работает с командой "почта", адрес переписывается как надо. Однако с cron это не работает. STDIN пуст, поэтому выходные данные cron не принимаются по электронной почте. Системные журналы пишет

 /usr/sbin/sendmail: line 11: /dev/stdin: permission denied

Вот сценарий.

#!/bin/bash
#########################################
#Beginn change here
export NULLMAILER_USER=user
export NULLMAILER_HOST=somedomain.com
#Ende change here
#############################################

export NULLMAILER_FLAGS=ft

stdin=$(</dev/stdin)

optPosition=0 #defaultvalue when not found

while getopts ":f:" from; do
    case $from in
        f) optPosition=$OPTIND
           break
           ;;
    esac
done


arguments=($@)

if (($optPosition != 0)); then #-f Option was used
 arguments[(($optPosition-2))]=$NULLMAILER_USER@$NULLMAILER_HOST
 set -- "${arguments[@]}"
fi



echo "$stdin" | /usr/sbin/sendmail-bin "$@"   

NULLMAILER_USER с NULLMAILER_HOST и NULLMAILER_FLAGS = f говорят nullmailer использовать это как адрес отправителя. Эта часть работает, см. http://manpages.ubuntu.com/manpages/trusty/man1/nullmailer-inject.1.html

В crontab просто

*/1 * * * * echo test 

Когда присутствует исходный sendmail nullmailer, тогда "test" находится в теле письма, как и должно быть. Так почему же нельзя прочитать этот сценарий bash из стандартного ввода-вывода?

заменить строку

stdin=$(</dev/stdin)

с участием

stdin=`cat`

и это работает. Ответ был вдохновлен https://stackoverflow.com/questions/212965/how-to-read-mutliline-input-from-stdin-into-variable-and-how-to-print-one-out-in

Не знаю, почему это так важно, важно, что это работает.