Posted on by

0 comment

Une extension PHP nommé ssh2, que l'on peut retrouver dans le dépôt pecl permet de se connecter à un serveur SSH depuis un script PHP à l'aide de plusieurs fonctions. Plus particulièrement, la fonction ssh2_shell qui retourne un flux de données, ou stream, nous permet de mettre en place entre le script PHP et le serveur SSH un vrai échange complet. L'intérêt d'avoir un flux de données pour converser avec un serveur SSH est que l'on peut manipuler assez facilement à l'aide de toutes les fonctions stream_* ces flux. Ça, c'est la théorie.

En pratique, il s'avère que l'utilisation d'un flux SSH2 Channel (retourné par ssh2_shell) avec la fonction stream_select qui permet d'attendre que le flux "change" - c'est-à-dire qu'une donnée arrive - est impossible. En effet, pour utiliser le flux avec stream_select, il faut pouvoir transformer ce flux en une donnée utilisable par la fonction C select(). C'est ce que l'on appelle "caster un stream" en franglais et "to cast a stream" en anglais. Le problème, c'est que la librairie pecl/ssh2 (basée sur libssh2) n'implémente pas cette fonctionnalité, ce qui nous donne droit à un magnifique:

Warning: stream_select() [function.stream-select]: cannot represent a stream of type SSH2 Channel as a select()able descriptor in /path/to/file.php on line XX

Nous allons donc voir comment ajouter cette fonctionnalité simplement, à l'aide de patchs développés par mes soins.

Pour commencer, nous allons ajouter une nouvelle fonction à la librairie libssh2, la fonction libssh2_channel_socket_fd, qui va retourner le socket presque prêt à être utilisé par select(). Ensuite, nous allons ajouter la possibilité de caster un SSH2 Channel dans le code de l'extension pecl/ssh2.

Note: Il n'y a même pas besoin de modifier le code de PHP ! :-)

Une nouvelle fonction dans libssh2

Si vous avez déjà installer l'extension pecl/ssh2, vous devez déjà avoir télécharger, compiler et installer libssh2. Il vous suffira donc de patcher le code de libssh2 et de re-compiler pour ajouter cette nouvelle version.

Admettons /usr/src/libssh2 comme répertoire des sources de votre librairie libssh2 déjà compilée et installée.

cd /usr/src/libssh2
wget http://www.sroze.io/uploads/2009/12/libssh2_channel_socket_fd.patch
patch -p0 < libssh2_channel_socket_fd.patch
make
make install

Note: Faites attention à bien exécuter ces commandes avec les droits nécessaires.

Ajout du cast de SSH2 Channel dans pecl/ssh2

Vous avez probablement installer votre extension pecl/ssh2 à l'aide de la simple commande pecl install ssh2, si c'est le cas, supprimez là avec pecl remove ssh2.

Maintenant, nous allons télécharger la dernière version, la configurer, la patcher et l'installer.

Admettons /usr/src/ssh2 le répertoire dans lequel nous allons placer les sources de l'extension ssh2 et /etc/php-5.3 le répertoire d'installation de PHP et /etc/libssh2 le répertoire d'installation de libssh2.

cd /usr/src/
wget http://pecl.php.net/get/ssh2
tar -xzf ssh2
cd ssh2-0.11.0

Nous allons maintenant télécharger le patch et l'appliquer.

wget http://www.sroze.io/uploads/2009/12/php_ssh2_channel_stream_cast.patch
patch -p0 < php_ssh2_channel_stream_cast.patch

Puis, nous allons configurer ssh2 avec l'installation de PHP et l'installation de libssh2 puis compiler et installer.

./configure --with-phpèconfig=/etc/php-5.3/bin/php-config --with-ssh2=/etc/libssh2
make
make install

Maintenant, redémarrez Apache si vous utilisez apache. Dorénavant, stream_select marchera ! ;-)

Comments