□PHPでSSH2したい
Vine5.1な某システムで、PHPでSSH2をしたくなったけど、実際にはSSH2の
ライブラリ(libssh2)とかを入れないといけないので、メモを残しておく、
apt-cache search ssh2
で探してみると、libsshと言うのが見つかるけど、libssh2とかでなくても
大丈夫なんだろうか?と思いつつインストールしてみる。
apt-get install libssh
そしてPECLでssh2関連をインストールしようとするも、まだベータ版らしい
ので
pecl install ssh2-beta
としてインストール…してみると、やっぱり
> configure: error: The required libssh2 library was not found. You can obtain that package from http://sourceforge.net/projects/libssh2/
と言うエラーがでてダメでした。
http://sourceforge.net/projects/libssh2/
にアクセスしてみると、どうやらまだrpmもないらしい。
久しぶりにtar.gzからインストールですね。
cd /usr/src/package/
wget http://www.libssh2.org/download/libssh2-1.2.7.tar.gz
cd /usr/src/
tar xvzf ./package/libssh2-1.2.7.tar.gz
cd libssh2-1.2.7/
で、ためしに ./configure してみると、
> configure: error: cannot find OpenSSL or Libgcrypt,
> try –with-libssl-prefix=PATH or –with-libgcrypt-prefix=PATH
なんてでるので、どうやらこれらのライブラリもいるらしい。
これはapt-getできるかなと探してみると、libsslについては明確にはない
けど、opensslが該当するらしい。
それぞれ、-develをインストールする。
apt-get install openssl-devel
apt-get install libgcrypt-devel
さて、これで./configureしましょう。
./configure –prefix=/usr
とすると、結果が
> version: 1.2.7
> Host type: x86_64-unknown-linux-gnu
> Install prefix: /usr
> Compiler: gcc
> Compiler flags: -g -O2
> Library types: Shared=yes, Static=yes
> Crypto library: openssl: yes (AES-CTR: no) libgcrypt: no
> Debug build: no
> Path to sshd: /usr/sbin/sshd (only for self-tests)
> libz compression: yes
となって、libgcryptがないという。
むー、ldconfig -p | grep libgcrypt するとちゃんと入っているんだ
けどなぁ…というわけで、パスを指定してみます。
./configure \
–prefix=/usr \
–with-libgcrypt-prefix=/usr/lib
とか
./configure \
–prefix=/usr \
–with-libgcrypt-prefix=/usr/lib64
とか、どう指定してもlibgcryptはnoになっちゃうけど、./configure は
正常終了なので、まぁ無視してすすみます。
./configure –prefix=/usr
make
make check
make install
あ、64bitなのに/usr/libに入っちゃった…けどまぁいいか。
pecl install ssh2-beta
…あれ、エラーだ
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:52: error: duplicate ‘static’
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c: In function ‘zif_ssh2_methods_negotiated’:
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:503: 警告: passing argument 4 of ‘add_assoc_string_ex’ discards qualifiers from pointer target type
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:504: 警告: passing argument 4 of ‘add_assoc_string_ex’ discards qualifiers from pointer target type
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:508: 警告: passing argument 4 of ‘add_assoc_string_ex’ discards qualifiers from pointer target type
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:509: 警告: passing argument 4 of ‘add_assoc_string_ex’ discards qualifiers from pointer target type
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:510: 警告: passing argument 4 of ‘add_assoc_string_ex’ discards qualifiers from pointer target type
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:511: 警告: passing argument 4 of ‘add_assoc_string_ex’ discards qualifiers from pointer target type
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:516: 警告: passing argument 4 of ‘add_assoc_string_ex’ discards qualifiers from pointer target type
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:517: 警告: passing argument 4 of ‘add_assoc_string_ex’ discards qualifiers from pointer target type
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:518: 警告: passing argument 4 of ‘add_assoc_string_ex’ discards qualifiers from pointer target type
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:519: 警告: passing argument 4 of ‘add_assoc_string_ex’ discards qualifiers from pointer target type
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c: In function ‘zif_ssh2_publickey_add’:
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:1045: 警告: passing argument 1 of ‘_efree’ discards qualifiers from pointer target type
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c: In function ‘zif_ssh2_publickey_list’:
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:1104: 警告: passing argument 4 of ‘add_assoc_stringl_ex’ discards qualifiers from pointer target type
> /var/cache/php5-pear/ssh2-0.11.0/ssh2.c:1105: 警告: passing argument 4 of ‘add_assoc_stringl_ex’ discards qualifiers from pointer target type
> make: *** [ssh2.lo] エラー 1
> ERROR: `make’ failed
ググって見ると、パッチを当てないといけないらしい。
http://pecl.php.net/bugs/bug.php?id=16727&edit=1
┐(´д`)┌ ヤレヤレ、だいぶ前の話なのだからバージョンアップしてくれよ。
cd /usr/src/package/
wget http://pecl.php.net/get/ssh2-0.11.0.tgz
cd /usr/src/
tar xvfz ./package/ssh2-0.11.0.tgz
cd ./ssh2-0.11.0
cat > ssh2-php53.patch
--ここから------------------------
— ssh2.c.php53 2008-12-14 10:04:22.000000000 +0100
+++ ssh2.c 2008-12-14 10:04:24.000000000 +0100
@@ -48,7 +48,6 @@
#endif
#ifdef ZEND_ENGINE_2
-static
ZEND_BEGIN_ARG_INFO(php_ssh2_first_arg_force_ref, 0)
ZEND_ARG_PASS_INFO(1)
ZEND_END_ARG_INFO()
--ここまで------------------------
で、パッチを当てて
patch -p0 < ssh2-php53.patch
作り直し。(オプションは取っ払う)
rm -f configure
phpize
./configure –with-php-config=/usr/bin/php-config
make
make install
とすると、/usr/lib64/php5/ に
ssh2.so
がインストールされるので、あとは php.ini に追記。
emacs /etc/php5/php.ini
> extension=ssh2.so
さて、phpinfo();でssh2が入ったか見てみるか…あ、
> PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php5/ssh2.so’ – libssh2.so.1: cannot open shared object file: No such file or directory in Unknown on line 0
やっぱり怒られたか。
cd /usr/lib64
ln -s /usr/lib/libssh2.so.1 libssh2.so.1
として回避。(笑)
で、phpinfo();で見てみると、
> ssh2
>
> SSH2 support => enabled
> extension version => 0.11.0-dev
> libssh2 version => 1.2.7
> banner => SSH-2.0-libssh2_1.2.7
> remote forwarding => enabled
> hostbased auth => enabled
> polling support => enabled
> publickey subsystem => enabled
>
と、やっと入りましたとさ。
あとはこんなスクリプトで試すと
<?php
$SCP_HOST = ‘hogehoge.example.com’;
$SCP_PORT = 22;
$SCP_USER = ‘username’;
$SCP_PASS = ‘password’;
$SCP_HOSTKEY = array(‘hostkey’=>’ssh-dss’);
$SCP_PUBKEY = ‘/home/username/.ssh/id_dsa.pub’;
$SCP_SECKEY = ‘/home/username/.ssh/id_dsa’;
$SCP_PASSP = ‘passphrase’;
$SCP_CONN = ssh2_connect($SCP_HOST, $SCP_PORT, $SCP_HOSTKEY);
if (ssh2_auth_pubkey_file($SCP_CONN, $SCP_USER, $SCP_PUBKEY, $SCP_SECKEY, $SCP_PASSP))
{
echo “Public Key Authentication Successful\n”;
}
else
{
die(“Public Key Authentication Failed\n”);
}
?>
うまく認証が通れば
> Public Key Authentication Successful
と表示されるし、だめなら
> PHP Warning: ssh2_auth_pubkey_file(): Authentication failed for root using public key in – on line 14
> Public Key Authentication Failed
みたいになります。
めでたしめでたし!?