Linux

cron 呼叫的 Sendmail bash 腳本無法從標準輸入讀取

  • January 27, 2019

我嘗試編寫一個從 nullmailer 的地址覆蓋的小腳本。Nullmailer 有一個選項“allmailfrom”,您可以將郵件地址放入 /etc/nullmailer/allmailfrom,所有發送的郵件都將此地址作為“Return-Path”,但 From 仍然是發送程序的值,例如 pi@raspberrypi

所以我嘗試創建一個小腳本來重寫發件人地址。基本上,您將 sendmail 移動到 sendmail-bin 並將創建的腳本命名為 sendmail。它與命令“mail”一起工作,地址被重寫。但是使用 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_HOST 和 NULLMAILER_FLAGS=f 的 NULLMAILER_USER 告訴 nullmailer 將其用作發件人地址。該部分有效,請參閱http://manpages.ubuntu.com/manpages/trusty/man1/nullmailer-inject.1.html

在 crontab 中只是

*/1 * * * * echo test 

當 nullmailer 的原始 sendmail 存在時,“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

不知道為什麼這會產生如此大的不同,重要的是它有效。

引用自:https://serverfault.com/questions/950999