SSH запрашивает фразу-пароль, хотя ssh-agent / keychain работает

Отказ от ответственности:

Было бы очень хорошо внимательно прочитать этот вопрос, прежде чем пометить его как дубликат. Я прочитал десятки других вопросов (здесь, на superuser.com, serverfault.com и т. Д.), Все из которых касаются SSH, но не находят / dev / tty, но ни один из них не связан с цепочкой для keychain , которая фактически должна предотвратить эту проблему.

Сказав это:

У меня есть Linux (Debian stretch) роутер, который подключен к Интернету через pppoe . Мой провайдер дает мне динамический IP-адрес, который время от времени меняется. Всякий раз, когда это происходит, маршрутизатор должен запускать скрипт на другом хосте через SSH.

Я правильно настроил SSH на маршрутизаторе и другом хосте, используя аутентификацию с открытым ключом. Ключи SSH защищены парольной фразой.

Кроме того, я настроил keychain как рекомендовано здесь . Согласно моему пониманию этой страницы (и других), keychain «предоставляет» один и тот же процесс ssh-agent любому SSH-клиенту; когда я вхожу в систему, он запускает ssh-agent (если он еще не запущен) и запрашивает (или делает ssh ask) парольную фразу (и); с этого момента ключи SSH находятся в памяти ssh-agent и легко доступны для других процессов.

Это работает со следующим исключением:

Я поместил скрипт в /etc/ppp/ip-up.d ; этот скрипт содержит (среди прочего) следующие строки:

 eval `/usr/bin/keychain --noask --agents ssh --eval id_rsa_ipupdate` ssh -i /root/.ssh/id_rsa_ipupdate root@re.mo.te.ip '/path/to/remote/command' 

Хотя сам скрипт выполняется так, как ожидается, каждый раз, когда провайдер назначает новый IP-адрес, команда SSH не выполняется, т. Е. Скрипт на удаленном хосте не выполняется. Мне потребовалось некоторое время, чтобы отладить это, но после того, как pppd свои отладочные сообщения в отдельный файл, я наконец нашел причину. Некоторые соответствующие строки из отладочных сообщений pppd:

 debug1: Server accepts key: pkalg ssh-rsa blen 535 debug2: input_userauth_pk_ok: fp SHA256:BZSkP9mMIB+cCi5WfgYnqT2QmskTgsKHsWuNXHxIQu0 debug3: sign_and_send_pubkey: RSA SHA256:BZSkP9mMIB+cCi5WfgYnqT2QmskTgsKHsWuNXHxIQu0 debug1: read_passphrase: can't open /dev/tty: No such device or address debug2: no passphrase given, try next key debug2: we did not send a packet, disable method debug1: No more authentication methods to try. Permission denied (publickey). 

Поэтому SSH не находит / dev / tty, что, вероятно, нормально, учитывая, что в этом случае он выполняется из pppd и, следовательно, не может прочитать фразу-пароль с клавиатуры. Все идет нормально.

Но ключевой момент заключается в следующем: почему SSH (очевидно) хочет считывать парольную фразу с клавиатуры, несмотря на то, что ssh-agent работает, управляется keychain и имеет ansible ключ?

Обратите внимание на первую строку в fragmentе скрипта выше. Следует убедиться, что SSH_AUTH_SOCK и SSH_AGENT_PID установлены и экспортированы правильно.

Обратите также внимание, что скрипт работает отлично (без запроса пароля), когда я запускаю его из командной строки.

Чтобы все было совершенно ясно: я сначала захожу в роутер. Так как я установил keychain в соответствии с рекомендациями на ее домашней странице, меня сразу же просят ввести парольную фразу (ы) при входе в систему. Когда затем вызывается мой скрипт из командной строки, он работает, как и ожидалось, без запроса парольной фразы. Но когда скрипт вызывается pppd , строка SSH завершается неудачно.

Кто-нибудь может объяснить, почему SSH хочет / dev / tty, хотя он может загрузить ключи из ssh-agent, и как обойти эту проблему?

PS Да, я могу смириться с тем, что скрипт неизбежно потерпит неудачу после перезагрузки маршрутизатора, пока я не войду хотя бы один раз 🙂

РЕДАКТИРОВАТЬ 1

Я сделал дальнейшее исследование и заметил следующее: линия

 eval `/usr/bin/keychain --noask --agents ssh --eval id_rsa_ipupdate` 

из приведенного выше сценария определенно создает второй процесс ssh-agent когда сценарий выполняется pppd из-за изменения общедоступного IP-адреса. Это означает, что keychain ключей по какой-то странной причине не находит первую (в которой есть ключи SSH).

Опять же, это происходит только тогда, когда скрипт выполняется pppd ; когда я вызываю скрипт из командной строки, все нормально.

Сейчас я думаю об открытии отчета об ошибке или что-то в этом роде. Кстати, моя версия keychain 2.8.2 .