我正在撰寫一個相當簡單的腳本,以從 keytool 證書中提取到期日期并將其與今天的日期進行比較,然后在該日期少于 30 天時發送郵件。但是,我遇到困難的是如何使用 bash 提取到期日期,我正在運行:
keytool -list -v -keystore /usr/java/jdk1.8.0_301-amd64/jre/lib/security/cacerts -storepass <PWD> | grep "until:"
它將輸出存盤在多行中的所有證書,如下所示:
Valid from: Tue May 26 01:00:00 IST 2015 until: Sun Jan 17 00:00:00 GMT 2038
該計劃是從該行中獲取到期(直到)日期并將其轉換為紀元秒和天以幫助在腳本中進行計算。
請您建議我繼續進行的最佳方式。
uj5u.com熱心網友回復:
首先,您需要將日期提取為字串,這可以使用 awk 完成:
date=$(keytool -list -v -keystore /usr/java/jdk1.8.0_301-amd64/jre/lib/security/cacerts -storepass | grep "until:" | awk -F'until:' '{print $2}')
然后您可以使用 date 命令將字串日期轉換為紀元:
epoch=$(date -d "$date" "%s")
uj5u.com熱心網友回復:
不知道你所說的“天”是什么意思
...并將其轉換為紀元秒和天
但要將其轉換為紀元秒,您可以先洗掉所有內容,直到“直到:”:
UNTIL=$(keytool ... | grep 'until:' | sed 's/^.*until: //')
然后使用date:
date -d "${UNTIL}" %s
編輯
好的,對于密鑰庫中的多個條目,您可以調整以下代碼段。在這里,我們讀取別名和“直到”日期,以便我們可以識別在每次迭代中使用哪個證書。您可以修改它以讀取其他欄位。
KEYSTORE=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts
KEYSTORE_PW=changeit
while read -r ALIAS; do
# ALIAS is in the form: "Alias name: <REST>". We want <REST>.
ALIAS=$(echo ${ALIAS} | cut -d' ' -f3)
# read the next line
read -r UNTIL
# UNTIL is in the form: "Valid from: ... until: <REST>". We want <REST>
UNTIL=$(echo ${UNTIL} | sed 's/^.*until: //')
# convert to epoch
EPOCH=$(date -d "${UNTIL}" %s)
# do something with it
echo "${ALIAS} --> ${EPOCH}"
done < <(keytool -list -v -keystore "${KEYSTORE}" -storepass "${KEYSTORE_PW}" | grep -E '^Alias name:|^Valid from:')
輸出是:
debian:ac_raiz_fnmt-rcm.pem --> 1893456000
debian:accvraiz1.pem --> 1924940257
debian:actalis_authentication_root_ca.pem --> 1916306522
debian:addtrust_external_root.pem --> 1590835718
uj5u.com熱心網友回復:
如果你ruby有空,那么你可以做這樣的事情:
#!/bin/bash
keystore=/usr/java/jdk1.8.0_301-amd64/jre/lib/security/cacerts
storepass='<PWD>'
keytool -list -v -keystore "$keystore" -storepass "$storepass" |
if ! ruby -rdate -e \
'
limit = Date.today 30;
ARGF.grep(/^Valid from:/){ |line|
exit 1 if Date.parse(line.sub(/.*: /,"")) < limit
}
'
then
echo "A certificate will soon expire in $keystore"
fi
備注:我沒有找到任何簡單的方法來做到這一點awkorperl
uj5u.com熱心網友回復:
一個 GNUawk解決方案:
#!/bin/bash
keystore=/usr/java/jdk1.8.0_301-amd64/jre/lib/security/cacerts
storepass='<PWD>'
keytool -list -v -keystore "$keystore" -storepass "$storepass" |
if ! awk \
'
BEGIN { limit = systime() 86400 * 30 }
!/^Valid from:/ { next }
{ sub(/.*: /,"") }
{ $2 = (index("JanFebMarAprMayJunJulAugSepOctNovDec",$2) 2) / 3 }
mktime($6" "$2" "$3" "gensub(/:/," ","g",$4)" "$5) < limit { exit 1 }
'
then
echo "A certificate will soon expire in $keystore"
fi
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/420378.html
標籤:
