在 linux 脚本中使用 ssmtp 和 cron
Using ssmtp in linux script with cron
我创建了以下 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 工具在有重要的事情要报告(例如错误)之前是静默的,在这种情况下您希望得到通知。其他工具有一个 'quiet' 标志或类似的标志来减少它们的冗长,可以在这种情况下使用。
如果您根本不想发送任何消息,您可以重定向both stdout 和 stderr:
... >/dev/null 2>&1
这样即使出现问题,cron 也不会发送邮件,因此您应该只在确保工作正常后才发送邮件。
我创建了以下 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 工具在有重要的事情要报告(例如错误)之前是静默的,在这种情况下您希望得到通知。其他工具有一个 'quiet' 标志或类似的标志来减少它们的冗长,可以在这种情况下使用。
如果您根本不想发送任何消息,您可以重定向both stdout 和 stderr:
... >/dev/null 2>&1
这样即使出现问题,cron 也不会发送邮件,因此您应该只在确保工作正常后才发送邮件。