scp et SSH en PHP

closeCet article a été publié il y a 8 ans 2 mois 22 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

Hop,
J’ai eu besoin de faire un script un peu évolué pour jouer avec une base Oracle et des fichiers à ramener depuis un serveur distant.
Bref, j’ai pensé au PHP pour faire un truc assez fin, mêlant Oracle et des transferts de fichiers en « scp ».

Seule difficulté, installer le module SSH pour PHP. Ce que je décris ici.
Ensuite, les bouts de codes exemple sont sur la doc de PHP.

Côté serveur Debian

J’étais parti de l’installation PECL directement, ça plante, il manquait des petits bouts côté Debian. Je montre pour l’exemple :

srv:~# pecl install ssh2 "channel://pecl.php.net/ssh2-0.11.2"
Failed to download pecl/ssh2 within preferred state "stable", latest release is version 0.11.2, stability "beta", use "channel://pecl.php.net/ssh2-0.11.2" to install
downloading ssh2-0.11.2.tgz ...
Starting to download ssh2-0.11.2.tgz (22,740 bytes)
........done: 22,740 bytes
[...]
checking for ssh2 files in default path... not found
configure: error: The required libssh2 library was not found.  You can obtain that package from http://sourceforge.net/projects/libssh2/
ERROR: `/tmp/pear/temp/ssh2/configure --with-ssh2' failed

Donc, il faut d’abord installer tout ça :

srv:~# apt-cache search libssh2
libnet-ssh2-perl - Perl module for the SSH 2 protocol
libssh2-1-dbg - SSH2 client-side library (debug package)
libssh2-1-dev - SSH2 client-side library (development headers)
libssh2-1 - SSH2 client-side library
libssh2-php - PHP Bindings for libssh2
python-libssh2 - Python binding for libssh2 library

srv:~# aptitude install libssh2-1-dev libssh2-php

Installation du module avec PECL

On peut donc enfin installer le module :

srv:~# pecl install ssh2 "channel://pecl.php.net/ssh2-0.11.2"
Failed to download pecl/ssh2 within preferred state "stable", latest release is version 0.11.2, stability "beta", use "channel://pecl.php.net/ssh2-0.11.2" to install
[...]
Build process completed successfully
Installing '/usr/lib/php5/20090626+lfs/ssh2.so'
install ok: channel://pecl.php.net/ssh2-0.11.2
configuration option "php_ini" is not set to php.ini location
You should add "extension=ssh2.so" to php.ini
aladdin:~# grep extension /etc/php5 -r
/etc/php5/conf.d/gd.ini:extension=gd.so
/etc/php5/conf.d/ssh2.ini:extension=ssh2.so
/etc/php5/conf.d/snmp.ini:extension=snmp.so

L’installation se charge toute seule d’activer l’extension ssh2.so dans les fichiers de conf PHP.

Exemple de code d’un transfert

define ("SSH_KEY","/path/to/.ssh/id_dsa");
define ("SSH_FINGERPRINT","BXXXXXXXXXXXXXXXXXXXXXX81"); # à récupérer la première fois
...
$ssh = ssh2_connect(SSH_SERVER,SSH_PORT);
if (ssh2_fingerprint ($ssh,SSH2_FINGERPRINT_MD5) != SSH_FINGERPRINT) { # bien penser à contrôler le fingerprint ; c'est dommage de s'en priver !
  echo "c'est mal";
}
if (!ssh2_auth_pubkey_file($ssh, SSH_LOGIN, SSH_KEY.".pub", SSH_KEY, '')) {
  echo "authentif par clef ratée";
}
...
if (@ssh2_scp_recv ($ssh, $fich_src, $fich_dest)) {
  echo "transfert OK";
}
...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.