Взаимодействие с несколькими серверами через SSH в PHP - PullRequest
1 голос
/ 19 января 2011

В настоящее время я пишу среду развертывания на PHP.Каркас подключается к серверам и выполняет команды через SSH.Я довольно долго пытался найти способ сделать это лучше в PHP.Вот требования.Техника должна уметь:

  1. Введите пароль SSH программно.Я знаю, что использование SSH-ключей - это то, что нужно, когда вы хотите SSH-вход без пароля, но помните, что это среда развертывания.Это может потенциально быть развертывание на 25 серверах одновременно.Неправильно требовать от пользователя установки ключей SSH для использования инфраструктуры, а кто хочет ввести свой пароль 25 раз?Я использую Capistrano в качестве модели - он запрашивает ваш пароль один раз, а затем использует его для установления SSH-соединений без повторного запроса пользователя.Я не предлагаю сохранять пароли в сценарии развертывания, просто (без вывода сообщений) вводить их один раз и использовать до завершения задач развертывания.

  2. Отправить вывод в сценарий PHP.Я хотел бы иметь возможность перехватывать выходные данные терминала от каждого из сеансов SSH независимо, изменять его, а затем отправлять обратно на терминал для просмотра пользователем.Таким образом, я могу добавить имя сервера в каждой строке вывода, чтобы показать, что происходит.

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

  4. Поддержка 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.

Любая помощь по этому вопросу будет принята с благодарностью - заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 19 января 2011

Считаете ли вы следующее примером доступа к терминалу для записи?:

ssh -t -t -p 12345 user@server.com 'command1; command2;'

Если это так, то вы можете сделать это с помощью чистой PHP-реализации phpseclib .например.

$ssh = new Net_SSH2(...);
$ssh->login(..., ...);
$ssh->exec('command1; command2;');

Если нет, то (1) я бы сказал, что вам лучше использовать phpseclib, чем в текущей реализации, и (2) если вы хотите получить то, что есть у автора phpseclib.называется "интерактивная" поддержка, может быть, вы могли бы попробовать связаться с автором?Возможно предложите заплатить ему немного денег, чтобы стимулировать его развивать особенность.Глядя на форумы поддержки, автор кажется достаточно отзывчивым.

1 голос
/ 19 января 2011

Я не уверен, что php - правильный инструмент здесь. Почему бы не использовать что-то, что ближе к среде оболочки, например скрипт bash?

Единственная причина, по которой я могу представить, что вы хотите использовать PHP, - это то, что вы можете запустить процесс, щелкнув по ссылке на странице где-нибудь, и тем самым пробить большую дыру в безопасности вашей системы. Но если вам действительно нужно, тогда все еще проще написать скрипт на более дружественном к оболочке языке и просто использовать php в качестве шлюза для вызова скрипта.

0 голосов
/ 19 января 2011

Вы можете установить SSH-соединение с расширением PECL в PHP.http://php.net/manual/en/book.ssh2.php

$connection = ssh2_connect('server.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$stream1 = ssh2_exec($connection, $command1);
$stream2 = ssh2_exec($connection, $command2);

Вы также можете создать интерактивную оболочку ssh с помощью ssh2_shell (), если вам нужны более сложные вещи.

...