我正在尝试确定几天内AWS密钥的使用期限。我正在使用Bash。
我使用以下命令获取AWS密钥的创建日期:
user_key1_date=$(aws iam list-access-keys --user-name "$aws_user_name" --profile "$aws_key" --output text --query 'AccessKeyMetadata[*].[AccessKeyId,CreateDate]' | awk 'NR==1 { print $2 }')
我得到这样的结果:
2018-01-04T20:59:01Z
然后,我试图以天为单位获取密钥的使用期限,并将其分配给以下行中的变量:
key1Age=$(date -d "$user_key1_date" +%j)
然后我尝试通过以下这一行报告密钥的使用期限:
The AWS access key: $user_access_key1 for user name: $aws_user_name was created on $date1. This key is $key1Age days old and needs to be replaced.
但是被报告的密钥的年龄是未知的:
Key AKIAIPSNLEFKBLH2CLOQ is 004 days old. Time to change your key!
我在做什么错了?
答案 0 :(得分:2)
%j
为您提供一年中发生日期的天数。因此,2018年1月4日为4,1998年1月4日也是如此;当您需要进行可以跨越年份界限的比较时,它没有用。
请考虑以下类似内容:
now=$(date +%s) # slow but more reliable way
key1Date=2018-01-04T20:59:01Z
key1TimeSeconds=$(date -d "$key1Date" +%s)
key1AgeSeconds=$(( now - key1TimeSeconds ))
key1AgeDays=$(( key1AgeSeconds / (60 * 60 * 24) ))
echo "Key created on $key1Date. This key is $key1AgeDays days old and needs to be replaced."
...运行时(从今天开始)发出:
Key created on 2018-01-04T20:59:01Z. This key is 188 days old and needs to be replaced.
如果您仅使用bash的新版本,则printf -v now '%(%s)T' -1
是now=$(date +%s)
的更有效替代。
答案 1 :(得分:2)
date命令可能没有给出您想要的答案,但是它为您提出的问题提供了正确的答案。 :)%j给出儒略日,或从年初开始的天数。 1月4日是一年中的第4天。
可能有几种方法可以做您想要的事情。我会给您一种方法,使您朝正确的方向前进。
echo "($(date +%s) - $(date -d "2018-01-04T20:59:01Z" +%s)) / 3600 / 24"|bc
%s将日期转换为从1970年1月1日起的秒数。在这里,我现在采用秒数,并从关键日期中减去秒数。除以3600可得到小时数,然后除以24可得到天数。 bc将数学表达式转换为值。我相信这会被截断,但是您可能想尝试一下。
答案 2 :(得分:0)
我的%j
手册页中的date
格式是指day of year (001..366)
,因此对于1月4日而言,004
是有意义的。
您需要做一些数学运算才能得出差异,为此,有很多答案,例如How to find the difference in days between two dates?