В настоящее время я пишу среду развертывания на PHP.Каркас подключается к серверам и выполняет команды через SSH.Я довольно долго пытался найти способ сделать это лучше в PHP.Вот требования.Техника должна уметь:
Введите пароль SSH программно.Я знаю, что использование SSH-ключей - это то, что нужно, когда вы хотите SSH-вход без пароля, но помните, что это среда развертывания.Это может потенциально быть развертывание на 25 серверах одновременно.Неправильно требовать от пользователя установки ключей SSH для использования инфраструктуры, а кто хочет ввести свой пароль 25 раз?Я использую Capistrano в качестве модели - он запрашивает ваш пароль один раз, а затем использует его для установления SSH-соединений без повторного запроса пользователя.Я не предлагаю сохранять пароли в сценарии развертывания, просто (без вывода сообщений) вводить их один раз и использовать до завершения задач развертывания.
Отправить вывод в сценарий PHP.Я хотел бы иметь возможность перехватывать выходные данные терминала от каждого из сеансов SSH независимо, изменять его, а затем отправлять обратно на терминал для просмотра пользователем.Таким образом, я могу добавить имя сервера в каждой строке вывода, чтобы показать, что происходит.
Обеспечить доступ для записи (а также чтения) к терминалу.Важно, чтобы пользователь (или сценарий) мог вводить в терминал другую информацию, кроме пароля SSH.
Поддержка SSH v2.
В настоящее время мой фреймворк «компилирует» команды из сценария развертывания в одну гигантскую строку и выполняет их с помощью команды SSH.Каждая последняя команда развертывания выглядит примерно так:
ssh -t -t -p 12345 user@server.com 'command1; command2;'
Каждая из этих команд SSH выполняется с помощью встроенной в PHP функции passthru
:
<?php passthru("ssh -t -t -p 12345 user@server.com 'command1; command2;'"); ?>
Я пытался использовать proc_open и почти все другие функции выполнения команд PHP, но безрезультатно - ни одна из них не обеспечивает всех функций, перечисленных выше.Кроме того, я пробовал несколько чистых реализаций PHP SSH, но безрезультатно.Библиотеки либо не предоставляют доступ для записи в терминал, либо не поддерживают SSH v2.
Любая помощь по этому вопросу будет принята с благодарностью - заранее спасибо!