我正在尝试编写一个脚本来测试来自我运行的各种 Node 服务器的 http 响应,然后如果有来自 Nginx 的 502 错误响应(意味着一台或多台服务器已崩溃),该脚本会向我发送电子邮件。
我的方法是编写一个 shell 脚本并将其作为 cron 作业运行,并且我使用 ssmtp 通过 Gmail 发送消息。这是一个片段:
messageTemplate=`cat /home/sites/mailmsg.txt`
...
email="$messageTemplate One or more sites is down!"
mailCommand=`mail -s [email protected] < $email`
我能够毫无问题地获取 ssmtp 邮件模板的内容(收件人:、发件人:等)。我确信电子邮件行连接得很好。问题是 mailCommand 行失败并显示以下行:
line 31: $email: ambiguous redirect
mail
将本质上是 messageTemplate + 自定义消息的内容通过管道传输到第一个命令(在本例中为)的正确方法是什么?
答案1
我的水晶球认为您的消息文本可能包含以下之一<
或>
。
在我看来就像你的用法
mailCommand=`mail -s [email protected] < $email`
不会执行您想要的操作:这会将 的内容$email
作为文件名(由于$email
包含几个单词而有所失败),尝试读取其内容,将这些内容放入命令中mail
,然后将命令的输出分配mail
给变量mailCommand
。
我的想法是你想要类似的东西
echo "$email" | mail -s [email protected]
即获取变量中的字符串email
并将其提供给邮件程序?
(顺便说一句,现在许多人更喜欢$(foo)
命令替换的表示法,而不是反引号。)
答案2
messageTemplate=`cat /home/sites/mailmsg.txt`
...
mailCommand=`echo "$messageTemplate One or more sites is down"\! | mail -s [email protected]`
或者
email="$messageTemplate One or more sites is down"\!
mailCommand=`echo "$email" | mail -s [email protected]`