gpt4 book ai didi

linux - 在带有 cron 的 linux 脚本中使用 ssmtp

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:04 25 4
gpt4 key购买 nike

我创建了以下 linux 脚本:

#!/bin/sh

tempfront=27
tempreartop=60
temprearbottom=65


if [ "$tempfront" -gt 26 ] || [ "$tempreartop" -gt 70 ] || [ "$temprearbottom" -gt 70 ]; then

echo "To: myemail@mail.com
From: myotheremail@gmail.com
Subject: Test Alert

ALERT
Front temp: $tempfront oC
Back temp up: $tempreartop oC
Back temp down: $temprearbottom oC" > /home/odroid/alerts.txt

ssmtp myemail@mail.com < /home/odroid/alerts.txt

fi

我手动执行此脚本并且工作正常,它会将电子邮件警报发送到 myemail@mail.com。以下是 gmail 发送的内容:

    Return-Path: <myotheremail@gmail.com>
Received: from myotheremail@gmail.com
(ppp046177171064.abcs.fe. [xx.xx.xx.xx])
by mx.google.com with ESMTPSA id k2sm8590878wix.4.2015.04.26.12.54.57
for <myemail@mail.com>
(version=TLSv1 cipher=RC4-SHA bits=128/128);
Sun, 26 Apr 2015 12:54:59 -0700 (PDT)
Message-ID: <d04e@mx.google.com>
Received: by myotheremail@gmail.com (sSMTP sendmail emulation); Sun, 26 Apr 2015 22:54:56 +0300
Date: Sun, 26 Apr 2015 22:54:56 +0300
To: myemail@mail.com
From: myotheremail@gmail.com
Subject: Test Alert

ALERT
Front temp: 27 oC
Back temp up: 60 oC
Back temp down: 65 oC

但是当我将它设置为在 cron 作业中运行时,电子邮件会像这样损坏:

.....
From: root <myotheremail@gmail.com>
X-Google-Original-From: root (Cron Daemon)
Received: by myotheremail@gmail.com (sSMTP sendmail emulation); Sun, 26 Apr 2015 23:00:01 +0300
Date: Sun, 26 Apr 2015 23:00:01 +0300
To: root
Subject: Cron <root@odroid> /home/odroid/testalert.sh >/dev/null
Content-Type: text/plain; charset=ANSI_X3.4-1968
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>

/home/odroid/testalert.sh: 19: /home/odroid/testalert.sh: ssmtp: not found

并且 myemail@mail.com 也没有收到它。有人可以解释一下吗?为什么 cron 搞砸了?

更新:我注意到其他一些 cron 作业也输出到电子邮件!

...
Date: Mon, 27 Apr 2015 06:30:01 +0300
From: Cron Daemon <myotheremail@gmail.com>
To: root
Subject: Cron <root@odroid> /home/odroid/motion_day.sh >/dev/null
Content-Type: text/plain; charset=ANSI_X3.4-1968
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>

[0] Processing thread 0 - config file /etc/motion/motion.conf
[0] Motion 3.2.12 Started
[0] Motion going to daemon mode

这只是一个监控网络摄像头的脚本,与电子邮件无关!的 cron 条目是

30 6 * * * /home/odroid/motion_day.sh >/dev/null

最佳答案

Cron 不会在这里搞砸任何事情。默认情况下,当安装本地 MTA 时,cron 会将作业的输出(stderr 和 stdout)邮寄给拥有作业的用户,这就是这里发生的事情。

您执行的脚本失败,因为在 PATH 中找不到 ssmtp 程序(如 header 中所示指向 /usr/bin:/bin ).

调用 ssmtp 时只需使用完整的绝对路径,它就可以工作。

编辑:在您的 crontab 中,您将 stdout 重定向到/dev/null,但是如果脚本在 stderr 上产生输出,那么仍然会随该输出发送一条消息。通常这是合理的,因为许多标准的 unix 工具在有重要的事情要报告(例如错误)之前是静默的,在这种情况下您希望得到通知。其他工具有一个“安静”标志或类似的标志来减少它们的冗长,可以在这种情况下使用。

如果您根本不想发送任何消息,您可以重定向 stdout 和 stderr:

... >/dev/null 2>&1

这样 cron 就不会发送邮件,即使出现问题,所以你应该只在确保你的工作正常后才这样做。

关于linux - 在带有 cron 的 linux 脚本中使用 ssmtp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29882937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com