简体   繁体   中英

Install PECL SSH2 extension for PHP

I am trying to install this http://fr2.php.net/manual/en/book.ssh2.php on a Centos 5 (a fork of RHEL 5).

I installed libssh2 (yum install libssh2) which is located in /usr/lib, and when I install SSH2 extension (via pecl install -f ssh2) I get this message

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/download/ssh2-0.11.0/configure --with-ssh2=/usr' failed

If I set /usr/lib, I get the same message

ERROR: `/tmp/pear/download/ssh2-0.11.0/configure --with-ssh2=/usr/lib' failed

Where is the problem?

Installing libssh2 via tar.gz from http://sourceforge.net/projects/libssh2/ help a lot (--with-ssh2=/usr/local/include/).

But "yum install libssh2-devel" is a better idea.

$ sudo pecl channel-update pecl.php.net
$ sudo apt-get install libssh2-1-dev
$ sudo pecl install -a ssh2-0.12
$ echo 'extension=ssh2.so' | sudo tee /etc/php5/mods-available/ssh2.ini > /dev/null
$ sudo php5enmod ssh2

yum install libssh2-devel didn't work for me:

No package libssh2-devel available.

So I downloaded rpm package from rpmfind and installed with rpm -ivh

After that just added extension=ssh2.so to /etc/php.d/ssh2.ini

This is updated answer from @klay + modification from @avn from comment under working solution for PHP 7.x .

$ sudo pecl channel-update pecl.php.net
$ sudo apt-get install libssh2-1-dev
$ sudo pecl install -a ssh2-1.0
$ echo 'extension=ssh2.so' | sudo tee /etc/php/7.2/mods-available/ssh2.ini > /dev/null
$ sudo phpenmod ssh2

Regarding line:

echo 'extension=ssh2.so' | sudo tee /etc/php/7.2/mods-available/ssh2.ini > /dev/null

Make sure that path /etc/php/7.2/mods-available is valid and there is a match with your php version.

I'm running on Centos, none of these answer were the entire solution for me. I followed these instructions :

$ sudo yum install -y gcc php-devel php-pear libssh2 libssh2-devel

But php-devel would not install, complaining about conflicts. I searched yum to find what php devel packages I had available

$> yum search php|grep devel
...
php55u-devel.x86_64 : Files needed for building PHP extensions
php56u-devel.x86_64 : Files needed for building PHP extensions
php70u-devel.x86_64 : Files needed for building PHP extensions
...

So I ran

$> sudo yum install -y php56u-devel

And it installed cleanly. Then, continuing with the instructions, I ran

$ pecl install -f ssh2

And it compiled. Then I added the extension to php

$ touch /etc/php.d/ssh2.ini
$ echo extension=ssh2.so > /etc/php.d/ssh2.ini

And on my system, instead of

$ /etc/init.d/httpd restart

I had to do

$ sudo /bin/systemctl restart  php-fpm.service 

So that was all the steps to install. And finally to confirm:

$> php -m|grep ssh2
ssh2

I had this problem:

I'm on a Pair.com "Advanced" hosted account, so I'm a little limited on what I'm allowed to do. I don't think I can yum nor aptitude nor any of the other pre-compiled packages.

I've downloaded and compiled libssh2. During the pecl process, it asks where the library is located. It's in "~/usr/local/lib" and I've tried several variations, including fully qualified. But I kept getting the same error.

The error message doesn't spell out precisely which file it's looking for. libssh2.so is in that directory. I know the output is supposed to be ssh2.so. I wondered if there is supposed to be an ss2.something, or libssh.nothing?

I fixed it thus. In my case, after compiling libssh2 I downloaded the PEAR tarball. The trick was:

./configure --with-ssh2=<libssh2 location> --prefix=<libssh2 location>

Another trick is that, since Pair.com is running FreeBSD, I have to do a "cd ." after the ./configure command. Otherwise, make produces a "Permission denied" error. Apparently, this is necessary on all *nix BSD flavors.

The error:

checking for ssh2 files in default path... not found
configure: error: The required libssh2 library was not found.

...can be seen in the source code .

The logic in the code reveals that it will throw this error if it cannot find /include/libssh2.h in either /usr/local , /usr or in the path supplied by the optional --with-ssh2=[DIR] directive. In other words, without customising the directive, it needs to find one of the following:

/usr/local/include/libssh2.h
/usr/include/libssh2.h

If it passes this check, it then assumes it can find the libssh2 lib at /usr/local/lib or /usr/lib .

Hopefully the info above is enough to help someone debug their issue. My own case is fairly specific and unusual (macOS with Homebrew in a custom install path), but in case it helps anyone else, here's my horrifically hacky workaround. Works perfectly lol

In a nutshell I'm creating two temporary symlinks so that pecl can find ssh2 where it expects.

# First check that neither /usr/local/include nor /usr/local/lib exists

sudo ln -s /usr/local/CustomInstallPath/Homebrew/Cellar/libssh2/1.9.0_1/include /usr/local/include
sudo ln -s /usr/local/CustomInstallPath/Homebrew/Cellar/libssh2/1.9.0_1/lib /usr/local/lib
pecl install -a ssh2-1.3.1
sudo rm -rf /usr/local/include
sudo rm -rf /usr/local/lib

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM