Scripting

“如果”聲明違反了他自己的規則,或者我正在這樣做

  • September 22, 2021

說明: 我正在使用一個腳本來幫助通知使用者 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" mauricio.dummy@url.com < <(./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

任何問題或意見我都會準備好參加。問候!!

這一行:

sendnot=$(echo ... | mail ... < <(./ssl-cert-check ...))

執行命令echomail然後./ssl-cert-check就在那裡,並擷取整個批次的輸出,即 的輸出mail,並將其分配到變數中sendnot。這就是為什麼無論if語句如何都會發送電子郵件的原因。另外,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 ...

引用自:https://unix.stackexchange.com/questions/670047