cron 调用的 Sendmail bash 脚本无法从 stdin 读取

cron 调用的 Sendmail bash 脚本无法从 stdin 读取

我尝试编写一个小脚本来覆盖 nullmailer 的发件人地址。Nullmailer 有一个选项“allmailfrom”,您可以将邮件地址放入 /etc/nullmailer/allmailfrom,并且所有发送的邮件都以该地址作为“Return-Path”,但发件人仍然是发件人的值,因此发送程序如 pi@raspberrypi

因此,我尝试创建一个小脚本来重写发件人地址。基本上,您将 sendmail 移至 sendmail-bin,并将创建的脚本命名为 sendmail。它与命令“mail”配合使用,地址按应有的方式重写。但是,对于 cron,它不起作用。STDIN 为空,因此无法通过电子邮件接收 cron 的输出。Syslogs 写道

 /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 

当 nullmailer 的原始 sendmail 存在时,邮件正文中就会出现“test”,这是理所当然的。那么为什么无法从 stdin 读取此 bash 脚本呢?

答案1

替换行

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

不知道为什么这会产生这么大的差异,重要的是它有效。

相关内容