-1

我有一个systemd服务,它调用一个 web 服务来定期(每分钟)执行一些维护。该服务如下所示:

[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在需要时。有任何想法吗?

4

2 回答 2

0

尝试 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

第一个是来自服务器的初始挑战;第二个是最终响应代码。

于 2019-03-27T01:55:44.013 回答
0

在进行了更多研究之后,我意识到在 systemd 服务中使用逻辑似乎不是一个好主意。所以我决定接受Elliott Frisch的建议并为它创建一个脚本:

#!/bin/bash
# check if ticket is present and not expired
if [[ $(klist -l | awk 'tolower($0) ~ /user/ && tolower($0) !~ /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 服务中调用这个脚本

于 2019-03-27T02:11:21.773 回答