当缓存仍有凭据时避免 kinit
Avoiding kinit when cache still has credentials
我有一个 systemd
服务调用网络服务来定期(每分钟)执行一些维护。该服务如下所示:
[Service]
Type=oneshot
ExecStart=/usr/bin/kinit -kt user.keytab user@DOMAIN
ExecStart=/usr/bin/curl --tlsv1.2 --cacert cert.pem --negotiate --user user: --url https://website/maintenance
现在每次都会销毁并重新初始化我的 kerberos 票证。
kinit 最多可能需要 2-3 分钟。
我想避免这一步,只在需要时才 kinit
。有什么想法吗?
尝试HTTP请求,根据状态码决定是否需要尝试kinit。你可以像这样 grep curl 的输出:
curl -s -i http://www.example.com | grep "HTTP/" | tail -1
如果是"HTTP/1.1 401 Unauthorized",运行 kinit 并重试。 (如果您愿意,请参阅 了解如何仅解析响应的数字部分)
"tail -1"部分是为了确保您只获得最后一个代码;由于协商协议,您通常会从 grep 命令中获得多行,如下所示:
HTTP/1.1 401 Unauthorized
HTTP/1.1 200 OK
第一个是来自服务器的初始挑战;第二个是最终响应代码。
经过更多研究后,我意识到在 systemd 服务中包含逻辑似乎不是一个好主意。所以我决定采纳 Elliott Frisch 的建议并为其创建一个脚本:
#!/bin/bash
# check if ticket is present and not expired
if [[ $(klist -l | awk 'tolower([=10=]) ~ /user/ && tolower([=10=]) !~ /expired/') ]]; then
echo "using ticket cache"
else
echo "no cache authentication for user, kinit needed"
/usr/bin/kinit -kt /user.keytab user@DOMAIN
fi
/usr/bin/curl --tlsv1.2 --cacert cert.pem --negotiate --user user: --url https://website/maintenance
然后我在我的 systemd 服务中调用这个脚本
我有一个 systemd
服务调用网络服务来定期(每分钟)执行一些维护。该服务如下所示:
[Service]
Type=oneshot
ExecStart=/usr/bin/kinit -kt user.keytab user@DOMAIN
ExecStart=/usr/bin/curl --tlsv1.2 --cacert cert.pem --negotiate --user user: --url https://website/maintenance
现在每次都会销毁并重新初始化我的 kerberos 票证。 kinit 最多可能需要 2-3 分钟。
我想避免这一步,只在需要时才 kinit
。有什么想法吗?
尝试HTTP请求,根据状态码决定是否需要尝试kinit。你可以像这样 grep curl 的输出:
curl -s -i http://www.example.com | grep "HTTP/" | tail -1
如果是"HTTP/1.1 401 Unauthorized",运行 kinit 并重试。 (如果您愿意,请参阅
"tail -1"部分是为了确保您只获得最后一个代码;由于协商协议,您通常会从 grep 命令中获得多行,如下所示:
HTTP/1.1 401 Unauthorized
HTTP/1.1 200 OK
第一个是来自服务器的初始挑战;第二个是最终响应代码。
经过更多研究后,我意识到在 systemd 服务中包含逻辑似乎不是一个好主意。所以我决定采纳 Elliott Frisch 的建议并为其创建一个脚本:
#!/bin/bash
# check if ticket is present and not expired
if [[ $(klist -l | awk 'tolower([=10=]) ~ /user/ && tolower([=10=]) !~ /expired/') ]]; then
echo "using ticket cache"
else
echo "no cache authentication for user, kinit needed"
/usr/bin/kinit -kt /user.keytab user@DOMAIN
fi
/usr/bin/curl --tlsv1.2 --cacert cert.pem --negotiate --user user: --url https://website/maintenance
然后我在我的 systemd 服务中调用这个脚本