
Недавно мне пришлось решать нестандартный случай, когда мне нужно было добавить несколько отпечатков сервера к отпечаткам пользователя known_hosts
(авторизация выполняется с помощью пары ключей). Я подумал, что самым простым решением будет просто позвонить
yes yes | ssh *login@host*
. Удивительно (по крайней мере для меня), но это не работает: ssh
по-прежнему спрашивает, следует ли добавить отпечаток пальца, и требует ручного ввода.
Мой вопрос: почему это так,каков механизм, лежащий в основе этого поведения??
решение1
Для этого запроса ssh
не используетсястандартный ввод&стандартный выводstreams – чтобы избежать путаницы с приглашением и вводом/выводом удаленной команды. (Представьте, что вы запускаете ssh host cat something.tar | tar x
и внезапно получаете tar x
сообщение о мусоре во входных данных.)
Вместо этого ssh
открывает специальное устройство /dev/tty
, которое всегда указывает на свой «контрольный терминал», записывает туда подсказку и считывает с нее ответ.
Конкретно для вашей проблемы OpenSSH поставляется с ssh-keyscan
инструментом для одновременного получения открытых ключей многих серверов.
ssh-keyscan host1 host2 host3 >> ~/.ssh/known_hosts
(Я не уверен, имели ли вы в виду known_hosts
, или это действительно было нужно authorized_keys
здесь.)
В общем случае expect
утилиту можно использовать для автоматизации программ, которые обычно выполняют ввод-вывод через tty.