Добавить в корзинуПозвонить
Найти в Дзене

Автоматизация авторизации по SSH

Казалось бы, что сложного? Сформировали на SSH-сервере файл ключа, интегрировали его в свое ПО управления или скрипты и наслаждайтесь. Да, но это подходит для стационарных местных задач автоматизации. А если вам требуется разработать сервисную утилиту для обслуживания оборудования с Embedded Linux, производимого и эксплуатируемого сотнями (коммутаторы, маршрутизаторы, видеорегистраторы и т.п.)? Тут на все варианты файлов ключей не насоздаешь. Задача усложняется еще тем, что начиная с SSH2 основные распространённые клиенты (Plink, OpenSSH) первичную авторизацию (принятие fingerprint'а сервера) можно выполнить только в интерактивном режиме. Да и в принципе отключение интерактивного режима (-batch в варианте plink) резко ограничивает применимость разрабатываемого ПО. Ну-у, слова словами, а дело надо делать. Дабы не изобретать велосипед возьмем за основу обертку Pipes от Russell Libby, updated by Franзois PIETTE (http://francois-piette.blogspot.com/) для работы с нашей ssh-консолью. В ка

Казалось бы, что сложного? Сформировали на SSH-сервере файл ключа, интегрировали его в свое ПО управления или скрипты и наслаждайтесь. Да, но это подходит для стационарных местных задач автоматизации. А если вам требуется разработать сервисную утилиту для обслуживания оборудования с Embedded Linux, производимого и эксплуатируемого сотнями (коммутаторы, маршрутизаторы, видеорегистраторы и т.п.)? Тут на все варианты файлов ключей не насоздаешь. Задача усложняется еще тем, что начиная с SSH2 основные распространённые клиенты (Plink, OpenSSH) первичную авторизацию (принятие fingerprint'а сервера) можно выполнить только в интерактивном режиме. Да и в принципе отключение интерактивного режима (-batch в варианте plink) резко ограничивает применимость разрабатываемого ПО.

Ну-у, слова словами, а дело надо делать.

Дабы не изобретать велосипед возьмем за основу обертку Pipes от Russell Libby, updated by Franзois PIETTE (http://francois-piette.blogspot.com/) для работы с нашей ssh-консолью. В качестве клиента используем Plink. К концу статьи будет понятно, почему используем его.

Тут, собственно, ничего нового, все стандартно. Привожу просто для порядка. Сосредоточимся на вопросах авторизации.

Собственно, ключи серверов Plink по умолчанию сохраняет в \HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys и, если его там нет, то в случае визуальной консоли мы увидим:

-2

А именно запрос на принятие и отклонения ключа. Так как он сугубо интерактивен, то никаких данных в PipeConsoleOutput мы не увидим. И наши попытки ответить на него через Write ни к чему не приведут.

Зная Windows, мы понимаем, что нам нужно взаимодействовать уже не с конвейером pipe, а непосредственно с самой консолью. Как? Естественно через Handle!!!

И тут первый момент: собственно дождаться, когда он у нас появиться...

-3

Второй момент - правильно передать данные на консоль.

-4

Обращаю внимание на то, что вместо привычных в таких случаях WM_KEYDOWN и WM_KEYUP используется WM_CHAR.

В случае использования OpenSSH все будет так же, за исключением того, что ответить одним символом уже не получится ;)

-5