Kerberos 티켓 캐시와 같은 항목이 만료되었는지 확인할 수 있는 스크립트를 만들고 있습니다.
만료 날짜/시간을 가져와서 현재 날짜/시간을 가져온 다음 이를 비교하여 첫 번째 날짜/시간이 만료되었는지 확인해야 합니다.
Kerberos 티켓이 아직 유효한지 또는 만료되었는지 확인하는 스크립트를 작성 중입니다.
만료 날짜+시간을 에포크 형식으로 얻을 수 있습니다(이것이 최선이라고 가정).
KRBEXPDATE=$(klist | grep -i krbtgt | awk '{print $3}')
KRBEXPTIME=$(klist | grep -i krbtgt | awk '{print $4}')
CURREPOCH=$(date +%s)
KRBEXPEPOCH=$(date --date="$KRBEXPDATE $KRBEXPTIME" +%s)
if 문에서 kerberos 티켓이 만료되었는지 확인하고 싶고 시간을 처리하는 if 문의 논리에 문제가 있습니다. 여기에서 내 자신의 질문에 대답했을 수도 있지만 CURRENTEPOCH가 KRBEXPEPOCH보다 크면 "티켓이 유효하지 않습니다"라는 메시지가 표시됩니다. 이게 말이 돼?
if [[ "$CURREPOCH" > "$KRBEXPEPOCH" ]] ;
then
echo "Ticket is not valid"
fi
답변1
현재 날짜와 만료 날짜를 비교하여 다음으로 변환합니다.에포크 이후 초, 티켓이 만료되었는지 알 수 있는 좋은 방법입니다. 동일한 호스트에서 티켓을 가져오고 티켓의 현재 상태를 정확하게 알 수 있는 한 CURREPOCH
( KRBEXPEPOCH
동일한 호스트에서 티켓을 가져오지 않는 경우 가져온 날짜가 다른 시간과 관련될 수 있다는 점에 유의하세요) 영역을 적절하게 변경해야 합니다).
그러나 Kamil이 자신의 의견에서 언급했듯이 답변에 사용한 구현에는 중요한 문제가 있습니다. man bash
1753행에서 볼 수 있듯이 ">" 연산자는 문자열을 비교합니다. 이는 일반적으로 애플리케이션에 잘못된 작업입니다. 이유를 알아보려면 다음을 시도해 보세요.
if [[ "1000" > "200" ]]; then
echo "Statement is true"
else
echo "Statement is false"
fi
숫자 1000은 실제로 200보다 크므로 "Statement is true"가 인쇄될 것으로 예상할 수 있지만 대신 "Statement is false"를 얻게 됩니다. 이는 ">"가 strcmp()처럼 작동하여 문자열의 ASCII 코드를 문자별로 비교하기 때문입니다(예: a < b
결과는 true).
당신이 원하는 것은 Kamil이 제안한 것처럼 "-gt" 연산자를 사용하거나 bash의 산술 확장( 라인 if
270 man bash
에 따라 결합 할 수 있음)을 사용하여 비교하는 것입니다. klist 명령의 출력을 올바르게 구문 분석한다고 가정하면 다음 중 하나를 수행할 수 있습니다.
if [[ "$CURREPOCH" -gt "$KRBEXPEPOCH" ]]; then echo "expired"; fi
if (( $CURREPOCH > $KRBEXPEPOCH )); then echo "expired"; fi