"if" 문은 그 자신의 규칙을 위반합니다. 그렇지 않으면 나는 그렇게 합니다.

"if" 문은 그 자신의 규칙을 위반합니다. 그렇지 않으면 나는 그렇게 합니다.

설명하다: 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 ...))

달리다command 를 실행 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함수의 첫 번째 매개변수가 됩니다.)

또한 명령에는 또 다른 문제가 있습니다. 파이프와 to 를 모두 사용하고 있으므로 mail명령의 표준 입력에 두 가지 다른 항목을 연결할 수 없으므로 하나만 적용됩니다. 리디렉션이 여러 개 있는 경우 파이프 및 리디렉션을 사용하면 유효한 마지막 리디렉션이 됩니다.

따라서 귀하의 명령은 실제로 다음과 같습니다.

mail -s ... < <(./ssl-cert-check ...)

즉, echo실제로 아무것도 하지 않고.

두 명령의 출력을 연결하려면 다음을 수행해야 합니다.

(echo "some message"; ./ssl-cert-check ...) | mail ...

관련 정보