Подключаемся к SSH2.0 через PHP.

Рубрики: на PHP  

Возникла недавно такая задача – нужно было подключиться к серверу, где установлен SSH2.0, но не через стандартный клиент (например, какой-нибудь Putty), а через скрипт PHP. Соответственно, на сокетах делать не получилось – разбираться в самом протоколе SSH2.0, это можно свернуть себе мозг. Желательно было найти какой-то стандартный скрипт/класс/модуль. Кстати, нашелся модуль, работающий с SSH1.0 – класс на «pure PHP» (чистом PHP), но он не подошел по понятной причине (на сервере-то SSH2.0). Искал дальше, и вот что вышло.

Недолгие поиски по буржунету привели меня к тому, что был найден дополнительный модуль для PHP, позволяющий работать с SSH2.0. Этот модуль (простите, я обозвал расширение модулем), как и всякий другой копируется в соответствующую директорию PHP, дальше нужно в php.ini прописать его. Кстати, я работаю под Vista, так что извиняйте.

Установка в Windows.

Модуль можно скачать здесь: http://snaps.php.net/, выберите там свою версию PHP и скачайте pecl-пак (в нем содержатся всякие разные прикольные модули).

Действия вполне стандартные и понятные. Брем из скачанного архива файл php_ssh2.dll, копируем его в каталог с расширениями (у меня тут C:/program files/php/exts/). Дальше открываем файл C:/windows/php.ini, находим строчки с подключением модулей, ну и дописываем, понятное дело – extension=php_ssh2.dll.

Обычно я перезапускаю апач, хотя, по идее, это не требуется.

Установка в Unix/Linux.

* я не отвечаю за успешность следующих шагов, т.к. сам под Linux эту библиотеку не компилировал ни разу

Сначала качаем и собираем библиотеку:


cd /usr/src
wget http://surfnet.dl.sourceforge.net/
          sourceforge/libssh2/libssh2-0.14.tar.gz
tar -zxvf libssh2-0.14.tar.gz
cd libssh2-0.14/
./configure
make all install

Дальше связываем PHP и эту новую собранную библиотеку:

pecl install -f ssh2

Дальше опять же – открываем php.ini и дописываем туда extension=ssh2.so

Использование php_ssh2.dll

Сначала код, поясню позже:


$host = "site.ru";
$user = "user";
$pass = "password";

function exec_ssh ($command){
	global $con;
		if (!$stream = ssh2_exec($con, $command)){
			die ("fuck");
		}else{
			stream_set_blocking($stream, true);
			$data = "";
			while($o = fgets($stream)){
				$data .= $o;
			}
			fclose($stream);
        }
		return $data;
}

if (!function_exists("ssh2_connect"))
       die("function ssh2_connect doesn't exist");

if(!($con = ssh2_connect($host, 22))){
    echo "unable to connect\n";
} else {
    if(!ssh2_auth_password($con, $user, $pass)) {
        echo "unable to auth\n";
    } else {
		echo "logged in!\n";
		echo exec_ssh ("ls");
    }
}

echo $data;

Код частично передран с найденных сайтов, некоторые вещи – лично мои. Итак.

Сначала оставим функцию exec_ssh(), пойдем дальше. Для начала скрипт проверяет, существует ли функция ssh2_connect – если ее нет, значит новый модуль не работает или не верно подключился. Дальше скрипт пытается установить соединение с хостом по порту 22 с помощью функции ssh2_connect и сохраняет дескриптор соединения в $con. Если все прошло успешно, мы пытаемся авторизоваться, отсылая в соедниение $con логин и пароль. Если авторизация успешна, пишем, что вошли и можно начинать выполнять команды.

Теперь по функции exec_ssh(); Понятно, эта функция создана специально, чтобы выполнять команды на удаленном сервере. В качестве результата она возвращает то, что выдал ей сервер в ответ. В данном случае она выполняет команду ls и полученный список файлов в текущей директории выводит в браузер.

Как она работает? Для начала, понятно, что нам нужно отдавать команды в определенное соединение (здесь – $con). Я его сделал глобальным, мне так удобнее (можно передавать через параметр, например).  «Родная» функция ssh2_exec выполняет команды, посланные в соединение и возвращает результат. То есть – выполняем ssh2_exec с нужной командой, если она выполнилась успешно, можно начинать ожидать ответа с сервера. Смысл stream_set_blocking в том, чтобы не пытаться забирать данные с сервера, если эти данные еще не поступили – через интернет пакеты летят иногда ощутимо долго. Как только данные поступили, собираем их в переменную $data вполне обычным способом (как чтение из потока, сокета или файла). И возвращает $data, то есть то, что нам отдал сервер.

Вроде бы со свем разобрались. Но я хотел бы акцентировать Ваше внимание еще на одном моменте.

Важно! Почему может не работать ssh2-модуль, хотя все подключено правильно?

Я полчаса мучился, не мог понять в чем дело – вроде бы подключил все верно, а работать отказывается, пишет, что функция не найдена. Причем сам PHP говорит, что модуль подключился и все должно работать. Я не знаю с чем это связано, но у меня этот модуль заработал, ТОЛЬКО в консоли, когда я руками вызывал php.exe. То есть – иду в консоль, захожу в каталог с PHP, пишу там:

> php.exe D:/www/test/www/index.php – все работает. Вывод происходит тоже в консоль, разумеется. Мне даже было местами приятно, вспомнил старое Unix-программирование, да и вообще всякие hello-world’ы.

В общем, я Вас предупредил ;)



Один отзыв на «Подключаемся к SSH2.0 через PHP.»

    Kirill пишет:

    для того что бы все нормально работало и пхп не матерился нужно установить модуль OpenSSL


Оставьте свой комментарий

Теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не спамер и не робот.
Я спамер и робот!

dimoning.ru
SEO и программирование.
  • Рубрики:



  • Рассылка:

  • Дополнительно:

  • По месяцам:

  • Счетчики:

    Яндекс цитирования

  • dimoning.ru © 2008-2011 г.
    Все материалы авторские, но их можно копировать с указанием прямой ссылки на источник.