|
Возникла недавно такая задача – нужно было подключиться к серверу, где установлен 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’ы.
В общем, я Вас предупредил ;)
Оставьте свой комментарий
|
18.02.2009 в 4:09 пп
для того что бы все нормально работало и пхп не матерился нужно установить модуль OpenSSL