Как избежать kinit, когда в кэше все еще есть учетные данные - PullRequest
0 голосов
/ 27 марта 2019

У меня есть служба 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, если это необходимо.есть идеи?

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Изучив немного больше, я понял, что логика в обслуживании 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

0 голосов
/ 27 марта 2019

Попробуйте HTTP-запрос и используйте код состояния, чтобы решить, нужно ли вам попробовать kinit. Вы можете получить вывод 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

Первый - начальный вызов с сервера; второй - окончательный код ответа.

...