3

我正在使用一个脚本,它根据在任何给定的 Kerberos 票证中找到的内容创建两个变量。被称为 $TCACHE 的 kerberos 票证看起来像这样......:

Ticket cache: FILE:/tmp/krb5cc_12345_gbiRMw
Default principal: testuser@TEST.SITE

Valid starting    Expires           Service principal
24/06/2013 11:22  24/06/2013 21:22  krbtgt/TEST.SITE@TEST.SITE
        renew until 01/07/2013 11:22

...以及这样的变量...:

EXPIRE_TIME=$( date -d "$( klist -c $TCACHE | grep -m1 krbtgt | awk '{print $3, $4}' )" +%s )
RENEW_TIME=$( date -d "$( klist -c $TCACHE | grep -m1 "renew until" | awk '{print $3, $4}' )" +%s )

这两个都在 RHEL 5 和 6 下正常工作......:

EXPIRE_TIME

# date -d "$( klist -c $TCACHE | grep -m1 krbtgt | awk '{print $3, $4}' )" +%s             
1372122061
#  date -d "$( klist -c $TCACHE | grep -m1 krbtgt | awk '{print $3, $4}' )"
Mon Jun 24 21:01:01 EDT 2013
# klist -c $TCACHE | grep -m1 krbtgt | awk '{print $3, $4}'             
06/24/13 21:01:01

更新时间

# date -d "$( klist -c $TCACHE | grep -m1 "renew until" | awk '{print $3, $4}' )" +%s 
1372046400
# klist -c $TCACHE | grep -m1 "renew until" | awk '{print $3, $4}'
07/01/13 08:24:15
# klist -c $TCACHE | grep -m1 "renew until" | awk '{print $3, $4}'
07/01/13 08:24:15

然而,在 Debian 7 下,我得到了这个......:

EXPIRE_TIME

# date -d "$( klist -c $TCACHE | grep -m1 krbtgt | awk '{print $3, $4}' )" +%s
date: invalid date `24/06/2013 21:22'
# date -d "$( klist -c $TCACHE | grep -m1 krbtgt | awk '{print $3, $4}' )"
date: invalid date `24/06/2013 21:22'
# klist -c $TCACHE | grep -m1 krbtgt | awk '{print $3, $4}'            
24/06/2013 21:22

更新时间

# date -d "$( klist -c $TCACHE | grep -m1 "renew until" | awk '{print $3, $4}' )" +%s
1357575720
# date -d "$( klist -c $TCACHE | grep -m1 "renew until" | awk '{print $3, $4}' )"      
Mon Jan  7 11:22:00 EST 2013
# klist -c $TCACHE | grep -m1 "renew until" | awk '{print $3, $4}'            
01/07/2013 11:22

作为参考,这里是每个服务器上仅 date 命令的输出......:

RHEL 6

# date
Mon Jun 24 12:29:06 EDT 2013

Debian 7

# date
Mon Jun 24 12:29:18 EDT 2013

谁能解释并帮助我了解如何减轻这种情况?

谢谢。

更新 1:我发现这个错误报告完美地描述了这个问题: http ://bugs.debian.org/cgi-bin/bugreport.cgi?bug=697954

......所以我想我毕竟不会发疯。

更新 2:我从实验中安装了 krb5-user 1.11,正如宣传的那样,问题消失了。

4

1 回答 1

1

这个问题与命令在不同平台上如何date解析日期有关。

  • 在 Debian 中,它被解析为 MM/DD/YYYY。
  • 在 RHEL 中,它被解析为 DD/MM/YYYY。

这是设计使然。如果您想知道,请在源代码中进行硬编码。在parse-datetime.y源代码中,您可以阅读以下内容:

如果第一个值有 4 位或更多位,则解释为 YYYY/MM/DD,否则解释为 MM/DD/YY。识别 YYYY/MM/DD 的目的仅仅是为了支持旧机器生成的日期,例如 RCS 日志列表中的日期。如果您想要可移植性,请使用 ISO 8601 格式。

通常,解析字符串应始终被视为不安全:不能保证这种类型的代码将始终有效。因此,您可以做的最好的事情是在将您读取的日期发送到日期命令之前将其调整为 ISO 8601。这可以通过正则表达式来完成。

所以这是您的可移植代码:

EXPIRE_TIME=$( date -d "$( klist -c $TCACHE | grep -m1 krbtgt | awk '{print $3, $4}' | sed -r 's#([0-9]+)/([0-9]+)/([0-9]+)#\3-\2-\1#g' )" +%s )
RENEW_TIME=$( date -d "$( klist -c $TCACHE | grep -m1 "renew until" | awk '{print $3, $4}' | sed -r 's#([0-9]+)/([0-9]+)/([0-9]+)#\3-\2-\1#g' )" +%s )

如果您有兴趣通过代码检查date您期望的格式,可以使用已知的冲突日期进行测试:

# Try to parse a known conflicting date
date -d "30/01/2010" >/dev/null 2>/dev/null

# Test Exit Code
if [ $? ]; then
  # Returned error, so the expected format is MM/DD/YYYY
else
  # No error, so the expected format is DD/MM/YYYY
fi
于 2013-07-16T18:33:19.040 回答