解释: 我正在玩一点脚本,该脚本有助于通知用户有关 SSL 证书过期的信息。如果证书的过期时间不到 30 天,则会通知用户,否则不执行任何操作。
但由于某种奇怪的原因,用更大的常数进行验证,即使电子邮件正在发送,这种情况也不应该发生。
这是代码:
#!/bin/ksh
legend="The next certificate almost expires.\n URL: url.com "
count=30
daysleft=$(./ssl-cert-check -d /etc/ssl/certs/cert.cer | awk '{print $6}' | tail -n 1);
#daysleft=50 #Constant to do some test
sendnot=$(echo $legend | mail -s "url.com SSL cert Expiration" [email protected] < <(./ssl-cert-check -d /etc/ssl/certs/cert.cer))
if [[ $daysleft -lt $count ]];
then
echo "Sending note"
echo $sendnot
else
echo "Doing nothing..."
fi
用常量进行测试daysleft
,声明它有效;但即便如此,无论如何也会将注释发送给用户。
编辑: 输出:
./ssl-cert-check -d /etc/ssl/certs/cert.cer | awk '{print $6}' | tail -n 1
is 9
如有任何问题或意见,我将准备好参加。问候!!
答案1
这行:
sendnot=$(echo ... | mail ... < <(./ssl-cert-check ...))
运行命令echo
,mail
然后./ssl-cert-check
就在那里,捕获整个批次的输出,即 的输出mail
,并将其分配给变量sendnot
。这就是为什么您会收到发送的电子邮件,无论如果-陈述。另外,mail
这里可能输出不多,因此使用命令替换似乎没有必要。
如果您只想存储命令以供进一步使用,请将其设为一个函数。
send_notice() {
local subject=$1
echo "some message" | mail -s "$subject"
}
...
if whatever...; then
send_notice "subject line..."
fi
($1
将是函数的第一个参数。)
此外,该命令还有另一个问题:您同时使用管道和到mail
.您无法将两个不同的事物连接到命令的标准输入,因此只有一个适用。如果有多个重定向,它将是最后一个保持有效的重定向;有了管道和重定向,这就是重定向。
所以你的命令实际上等于:
mail -s ... < <(./ssl-cert-check ...)
即echo
实际上没有做任何事情。
如果你想连接两个命令的输出,你必须这样做:
(echo "some message"; ./ssl-cert-check ...) | mail ...