kvz.io
Published on

Make SSH Connections With PHP

Authors
  • avatar
    Name
    Kevin van Zonneveld
    Twitter
    @kvz

ssh phpNot everyone knows about PHP's capabilities of making SSH connections and executing remote commands, but it can be very useful. I've been using it a lot in PHP CLI applications that I run from cronjobs, but initially it was a pain to get it to work. The PHP manual on Secure Shell2 Functions is not very practical or thorough for that matter, so I would like to share my knowledge in this how to, to make it a little less time consuming setting this up.

In this article I'm going to assume that:

  • You're running Debian / Ubuntu If not, you will have to substitute the package manager aptitude with whatever your distribution provides
  • You're running PHP 5 If not, just replace php5 with php4 everywhere
  • You have basic knowledge of PHP & server administration
  • You already have PHP installed

Update

On recent Ubuntu machines, there's no need to do any compiling anymore:

$ aptitude install libssh2-1-dev libssh2-php

You can now test if PHP recognizes its new ssh2 extension by running:

$ php -m |grep ssh2

It should return: ssh2

If the above works for you (you should see also: "Build process completed successfully"), you can skip to: Great! PHP supports SSH - time to code.

Otherwise we need to compile manually, continue reading here.

Prerequisites

Packages

First let's install the following packages:

$ aptitude install php5-dev php5-cli php-pear build-essential openssl-dev zlib1g-dev

That should set us up alright.

libssh2

We need libssh2 from SourceForge. We have to compile this, but no worries, this is all you need to do:

$ cd /usr/src \
 && wget https://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

That's it! Easy right?

  • Update: since December 26th 2008, libssh2 has reached version 1.0. Though I have not tested it: it has been reported to work. So you may want to check sf.net and download the latest stable version.

Installation

ssh2.so

Next we need to link libssh & PHP together. There's a PECL module for this so let's install using:

$ pecl install -f ssh2

The -f makes sure ssh2 is installed even though there's not a stable candidate. You could also use the package name: ssh2-beta to overrule this.

Now you need to make sure our new ssh2.so module is loaded by PHP. Edit a php.ini file (I'd recommend a separate one: /etc/php5/conf.d/ssh2.ini). Make sure it reads:

extension=ssh2.so

Great! PHP Supports SSH - Time to Code

You've just enabled ssh2 support in PHP. Now how can we make use of this? There are 2 options. SSH supports the:

  • Execute method This tells the server's operating system to execute something and pipe the output back to your script. (recommended)
  • Shell method This opens an actual shell to the operating system, just as you would normally when logging in with your terminal application. Some routers that don't have a full POSIX compliant implementation, but run their own application as soon as you login, require this. (advanced)

Method 1: Execute

Best would be to create functions or even a class for the following code, but this is the basic idea and will definitely get you started:

<?php
if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");
// log in at server1.example.com on port 22
if(!($con = ssh2_connect("server1.example.com", 22))){
    echo "fail: unable to establish connection\n";
} else {
    // try to authenticate with username root, password secretpassword
    if(!ssh2_auth_password($con, "root", "secretpassword")) {
        echo "fail: unable to authenticate\n";
    } else {
        // allright, we're in!
        echo "okay: logged in...\n";

        // execute a command
        if (!($stream = ssh2_exec($con, "ls -al" ))) {
            echo "fail: unable to execute command\n";
        } else {
            // collect returning data from command
            stream_set_blocking($stream, true);
            $data = "";
            while ($buf = fread($stream,4096)) {
                $data .= $buf;
            }
            fclose($stream);
        }
    }
}
?>

Method 2: Shell

Best would be to create functions or even a class for the following code, but this is the basic idea and will definitely get you started:

<?php
if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");
// log in at server1.example.com on port 22
if (!($con = ssh2_connect("server1.example.com", 22))) {
    echo "fail: unable to establish connection\n";
} else {
    // try to authenticate with username root, password secretpassword
    if (!ssh2_auth_password($con, "root", "secretpassword")) {
        echo "fail: unable to authenticate\n";
    } else {
        // allright, we're in!
        echo "okay: logged in...\n";

        // create a shell
        if (!($shell = ssh2_shell($con, 'vt102', null, 80, 40, SSH2_TERM_UNIT_CHARS))) {
            echo "fail: unable to establish shell\n";
        } else {
            stream_set_blocking($shell, true);
            // send a command
            fwrite($shell, "ls -al\n");
            sleep(1);

            // & collect returning data
            $data = "";
            while ($buf = fread($shell,4096)) {
                $data .= $buf;
            }
            fclose($shell);
        }
    }
}
?>

Tips

Sometimes when a server is busy, or a connection is buggy, the buffer may run dry, and the PHP script stops collecting data from a command output (even though the command hasn't completed yet!). There are a couple of things you could do about that:

<?php
ssh2_exec($con, 'ls -al; echo "__COMMAND_FINISHED__"' );
?>

Now, in the loop where you keep checking for the buffer, just see if the COMMAND_FINISHED line is coming by. Because then you know you have all the data. To avoid infinite loops, just limit the loop with a timeout of 10 seconds or so:

<?php
$time_start = time();
$data       = "";
while (true){
    $data .= fread($stream, 4096);
    if (strpos($data,"__COMMAND_FINISHED__") !== false) {
        echo "okay: command finished\n";
        break;
    }
    if ((time()-$time_start) > 10 ) {
        echo "fail: timeout of 10 seconds has been reached\n";
        break;
    }
}
?>

In the example above, you'd better set stream_set_blocking to false.

Can't get enough?

PHP can send files over ssh!

<?php
ssh2_scp_send($con, "/tmp/source.dat", "/tmp/dest.dat", 0644);
?>

Doesn't work?

Check the following:

  • Did you follow every step of the prerequisites & installation how to in this article?
  • On the serverside, 'PasswordAuthentication yes' must be enabled in the sshd_config. Default is yes on most servers, but in some cases you will have to turn this on yourself by making sure the following line is in place in the file: /etc/ssh/sshd_config: PasswordAuthentication yes

If you've made any changes, ssh needs a restart

$ /etc/init.d/ssh restart

Post a comment here if it's still failing. Don't forget to paste the error that you're getting.

make: *** [ssh2.lo] Error 1

If you get the error:

/usr/include/php5/Zend/zend_API.h:361: note: expected char * but argument is of type const unsigned char *
make: *** [ssh2.lo] Error 1

that's because of PHP 5.3 incompatibility. Try this patch:

$ mkdir -p /usr/src \
 && cd /usr/src \
 && wget https://pecl.php.net/get/ssh2-0.11.0.tgz \
 && tar xvfz ssh2-0.11.0.tgz \
 && cd ssh2-0.11.0 \
 && wget https://remi.fedorapeople.org/ssh2-php53.patch \
 && patch -p0 < ssh2-php53.patch \
 && phpize && ./configure --with-ssh2 \
 && make

make: *** [ssh2_fopen_wrappers.lo] Error 1

If you get the error:

/tmp/pear/download/ssh2-0.11.0/ssh2_fopen_wrappers.c:49: error: for each function it appears IN.)
make: *** [ssh2_fopen_wrappers.lo] Error 1
ERROR: `make' failed

This is the reported fix (thanks to BuNker).

Alternatives

There have been some additional developments since the writing of this article. Checkout:

  • Net_SSH2, PEAR's SSH wrapper (driver based to support multiple ways of establishing the connection)
  • SSH2, another wrapper by Jaimie Sirovich
  • phpseclib, a pure PHP implementation - no additional libraries, binaries, bindings required (against all odds, still pretty fast with mcrypt installed)

Legacy Comments (342)

These comments were imported from the previous blog system (Disqus).

Sara Golemon
Sara Golemon·

Glad you like PECL/ssh2 and libssh2! :)

A few notes:

Yes, 0.15 is out, with several refactoring points and I need to get around to updating the PHP extension to take advantage of new stuff in the library.

Part of the reason for the refactorings is that some of the cURL developers have gotten involved in its development and wanted to make it better before building support for it into cURL (which...by the way, cURL now supports SFTP via libssh2).

SCP doesn\'t work entirely right. I recommend SFTP to anyone who has it available. It\'s a much more robust protocol and libssh2\'s implementation of it works much more solidly than it\'s implementation of SCP. (If ANYONE has a spec document describing SCP or RCP, I\'d love to get a link...)

As to docs... Yeah... they could definately stand to be better... You\'re welcome to contribute directly to the PHP manual. CVS repository can be browsed at http://cvs.php.net/phpdoc/e... , anonymous CVS access instructions are at http://php.net/anoncvs.php, and instructions for getting your own cvs account can be found at http://php.net/cvs-php.php . You can also, of course, just send diffs (unified) to the phpdoc mailing list and ask someone politely to commit it for you.

Kevin
Kevin·

Hi Sara, nice to know that improvements are on it\'s way. And I\'d just like to say you did a great job on integrating ssh into php. It really made my life easier (it definitely beats making system calls and parsing output ;)

And as for the PHP manual, maybe I will contribute directly to it. Not a bad idea. Thanks for your comment!

NiKo
NiKo·

Great article, thanks.

Will
Will·

First of all, great article. Second I\'m having an error I was wondering if you had any thoughts on. I\'ve been following the instructions pretty closely and all seems to have gone well up until the ssh2.so portion. Here is the error that I get when trying to run pear....

No releases available for package \"pear.php.net/ssh2\" - package pecl/ssh2 can be installed with \"pecl install ssh2\"
Cannot initialize \'ssh2\', invalid or missing package file
Package \"ssh2\" is not valid
install failed

Any help would be great. Thanks...

Kevin
Kevin·

Did you type \'-f\' ?

tr
tr·

Instead of \'pear install -f ssh2\' try with \'pecl install -f ssh2\'.

Peter
Peter·

Great tutorial; now to make it work. ;-)

When I run \'pecl install -f ssh2-beta\' I get this error:

configure: error: The required libssh2 library was not found. You can obtain that package from http://sourceforge.net/proj...

Any suggestions?

Peter
Peter·

Never mind, my mistake. I forgot to run \'make all install\'. Duh!

jan
jan·

i get this ...

/tmp/pear/cache/ssh2-0.10/ssh2.c: In function \'zif_ssh2_methods_negotiated\':
/tmp/pear/cache/ssh2-0.10/ssh2.c:481: warning: passing argument 2 of \'libssh2_session_methods\' makes integer from pointer without a cast
/tmp/pear/cache/ssh2-0.10/ssh2.c:481: error: too many arguments to function \'libssh2_session_methods\'
/tmp/pear/cache/ssh2-0.10/ssh2.c: In function \'zif_ssh2_fingerprint\':
/tmp/pear/cache/ssh2-0.10/ssh2.c:536: warning: assignment discards qualifiers from pointer target type
/tmp/pear/cache/ssh2-0.10/ssh2.c: In function \'zif_ssh2_publickey_add\':
/tmp/pear/cache/ssh2-0.10/ssh2.c:1038: warning: passing argument 1 of \'_efree\' discards qualifiers from pointer target type
/tmp/pear/cache/ssh2-0.10/ssh2.c: In function \'zif_ssh2_publickey_list\':
/tmp/pear/cache/ssh2-0.10/ssh2.c:1097: warning: passing argument 4 of \'add_assoc_stringl_ex\' discards qualifiers from pointer target type
/tmp/pear/cache/ssh2-0.10/ssh2.c:1098: warning: passing argument 4 of \'add_assoc_stringl_ex\' discards qualifiers from pointer target type
/tmp/pear/cache/ssh2-0.10/ssh2.c:1106: warning: initialization discards qualifiers from pointer target type
/tmp/pear/cache/ssh2-0.10/ssh2.c:1107: warning: passing argument 2 of \'_zend_hash_add_or_update\' discards qualifiers from pointer target type
make: *** [ssh2.lo] Error 1

makes me sad :(

Kevin
Kevin·

@ Jan: When I install I get similar warnings like:
/tmp/pear/cache/ssh2-0.10/ssh2.c: In function \'zif_ssh2_methods_negotiated\':
/tmp/pear/cache/ssh2-0.10/ssh2.c:483: warning: assignment discards qualifiers from pointer target type

However the building just continues and so they can be ignored. But in your case the \'make\' exits with an error before it can run: /bin/bash /var/tmp/pear-build-root/ssh2-0.10/libtool

Can it be that you ran into this bug?
http://pecl.php.net/bugs/bu...

trume
trume·

hi,kevin,i wander if i can run the ssh connection once and get all infomation in that way.

i need to get the infomation realtime remote in ssh2,and now i need some advise if i can do it with php.

i will very glad if you can send a email, ^_^ my email is aquajamy@gmail.com.

thanks.

Kevin
Kevin·

@ trume: sorry dude I don\'t have email ;)

Anyhow, you might want to concatenate all of your commands with semicolons like this:
ls -al; echo \"!BREAK!\"; cat /proc/cpuinfo; echo \"!BREAK!\"; cat /proc/loadavg; echo \"!BREAK!\"; df -h

The shell on the other side will just run every command and give one big output.

Then just parse the output in PHP by exploding on \"!BREAK!\" (see \'explode\' function in PHP manual)

Jason
Jason·

Hi Kevin,

Do you have any idea about SSH Tunneling? I tried the following code but don\'t work:

$connection = ssh2_connect($SSH_HOST, $SSH_PORT);
ssh2_auth_password($connection, $SSH_LOGIN, $SSH_PASSWORD);
$tunnel = ssh2_tunnel($connection, $REMOTE_HOST.\":\".$REMOTE_PORT, $LOCAL_PORT);

Could you please help me?

ServerChief
ServerChief·

Hi,

Just wanted to say thank you for this tutorial. I\'m writting an application for VmWare ESX Updater Services, this tutorial, without a doubt will help me do it more efficiently.

Thanks,

ServerChief

http://www.serverchief.com

Oriol
Oriol·

I\'m using Ubuntu dapper 6.06 LTS in my servers. When I try to install openssl-dev I don\'t found it. But, the correct package for me is libssl-dev.

Tancks for your guide is very useful for me.

Joo
Joo·

I just copied your php script and then run it on my server. (Before doing that, I followed all your instruction and installed everything) However, I met a following message.

- [root@localhost htdocs]# php -f ssh2.php
function ssh2_connect doesn\'t exist[

What happened in my php?

Thanks in advance.

Kevin
Kevin·

@Joo: The module ssh2.so isn\'t loaded in PHP. This could mean you have to double check the Installation Step, and see if extension=ssh2.so is added to the correct php.ini

I see you\'re using commandline so probably something like /etc/php5/cli/php.ini

Joo
Joo·

Thank you for your advice, Kevin.

However, I can use ssh2* functions in php web page but I can\'t use them in CLI. I created /etc/php5/cli/php.ini already.

Kevin
Kevin·

@ Joo: You shouldn\'t have to create the php.ini yourself. It should already be installed if php-cli is succesfully installed. That\'s probably why it isn\'t working.

try:
updatedb && locate php.ini |egrep \'^/etc/.*\\.ini$\'

To find all the valid php.ini\'s on your system. If there isn\'t a cli version (either 4 or 5) maybe you will have to reinstall:
aptitude reinstall php5-cli
or
aptitude reinstall php4-cli

depending on the version you prefer.

Stefan Ideler
Stefan Ideler·

For people getting the make 1 error, I\\\'ve found the following 2 diff files to solve the problem for me.

(Compiling it on suse 10.2, 64 bit).

http://svn.mandriva.com/cgi...

Download the tar, patch the 2 files with the diff files, then install it using phpize && ./configure --with-ssh2 && make && make install

On another note, if you have PEAR installed but not the pecl package, try an pear upgrade-all .
Appearently a number of older versions of PEAR do not include the pecl package.

Regards,

stefan at i3d dot nl

Edi
Edi·

Very nice tutorial, thanx,

Question: Is there a way holding ssh session, in order to execute number of commands, chosen by the user, and not to create ssh connection (reload the page) again each time, to execute another command?

Kevin
Kevin·

@ Edi: Sure, after you\'ve used ssh2_connect & ssh2_auth_password you can use as many ssh2_execs as you want.

Edi
Edi·

Ok, thanks, I\'ve got it,
but the situation is more complicated:
user can selects which commands to execute from the select list, then the
ssh conection created and the commands are executed, output is presented to the user, and after that, depends on the output, user should select other commands to be executed by the same ssh connection, (I don\'t know which commands).
I\'m using post method and submit the commands that are chosen each time (reloading the same page), so ssh_connect() and auth....should be executed each time and the commands are executed, and it\'s quite slow.
maybe this is wrong method , but if there is some way to hold the ssh2 connection (session) each time the page is reloaded, without connecting to remote host again, then it should work well.

thanks in advance for any suggestions.

prasanna
prasanna·

I got the error

I had installed pecl, openssl.

I found no useful results while googling with the below error.

No releases available for package \"pecl.php.net/ssh\"
Cannot initialize \'pecl/ssh\', invalid or missing package file
Package \"Array\" is not valid
install failed

How to resolve it, please help me.
prasanna

Kevin
Kevin·

@ Edi: Oh I see, I haven\'t used it like that. Only from CLI actually. I don\'t think you can store the connection resource in the $_SESSION variable so maybe you should write a CLI daemon in PHP that can accept commands as it keeps a connection open. Or just connect for every command you send.
You should really ask yourself if this technology belongs in a web app b.t.w. And if it does.. Please sanitize your input :)

Kevin
Kevin·

@ prasanna:

I believe you\'ve typed:
pecl install ssh

instead of:
pecl install ssh2

prasanna
prasanna·

i created the ssh2.so using
phpize && ./configure --with-ssh2 && make.
I run the above command under PECL/SSH directory.

But i have a doubt and i explained it below.

Hi,

I am trying to add SSH2 support in my product. I am using Apache 2.0.4.7 with PHP 5.2.4.

For SSH2 support, i had compiled PECL/SSH2 package and created ssh2.so.

I used to run PHP using libphp5.so through httpd.conf. I struck at the creation of libphp5.so file.

<LoadModule php5_module /home/nprasanna/test/modules/libphp5.so>

I downloaded the latest PHP 5.2.4 and install it and got the libphp5.so, but i dont know how to include the ssh2.so while creating libphp5.so.

Please let me know, whether it is possible to create libphp5.so with ssh2.so support and make it work using Apache.

Also i tried by compiling PHP with a custom_php.ini file, (--with-config-file-path). In that custom_php.ini, i specified the ssh2.so as extension=ssh2.so, with the correct path of extension_dir value, failed that case too.

Please guide me how to use shh2.so in libphp5.so. whether we need to specify this at the creation of libphp5.so or we can make this possible by custom php.ini file.

Please suggest me a solution for this.
My email id: prasankn@gmail.com

Thanks,
prasanna

Kevin
Kevin·

@ prasanna: I\'m not familiar with the libphp5.so configuration and so I do not have a way to reproduce your errors. I always just include the ssh2.so file as an extension in the php.ini (either cli, or apache, depending on the intended use). So unfortunately I can\'t help you with this.

Patrick
Patrick·

Ok, first of all, this is some awesome tutorial!. I hope i can get this working!

Below my full report on what went wrong.

Today: 23-10-2007 i followed the instructions on:
http://kevin.vanzonneveld.n...

However, i failed to sucessfully get libssh2-0.14 working.
It gave an error on the command \'./configure\' at about 90%.
Also the command \'make all install\' failed at about 40%.

Next i tried to get libssh2-0.17 working.
I sucessfully ran \'./configure\' and \'make all install\'.

Proceeding i executed: pecl install -f ssh2
This seemed to work, but failed at...

running: make
/bin/sh /tmp/pear-build-root/ssh2-0.10/libtool --mode=compile gcc -I. -I/tmp/pear/download/ssh2-0.10 -DPHP_ATOM_INC -I/tmp/pear-build-root/ssh2-0.10/include -I/tmp/pear-build-root/ssh2-0.10/main -I/tmp/pear/download/ssh2-0.10 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include -DHAVE_CONFIG_H -g -O2 -c /tmp/pear/download/ssh2-0.10/ssh2.c -o ssh2.lo
gcc -I. -I/tmp/pear/download/ssh2-0.10 -DPHP_ATOM_INC -I/tmp/pear-build-root/ssh2-0.10/include -I/tmp/pear-build-root/ssh2-0.10/main -I/tmp/pear/download/ssh2-0.10 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include -DHAVE_CONFIG_H -g -O2 -c /tmp/pear/download/ssh2-0.10/ssh2.c -fPIC -DPIC -o ssh2.lo
/tmp/pear/download/ssh2-0.10/ssh2.c: In function `zif_ssh2_methods_negotiated\':
/tmp/pear/download/ssh2-0.10/ssh2.c:481: warning: passing arg 2 of `libssh2_session_methods\' makes integer from pointer without a cast
/tmp/pear/download/ssh2-0.10/ssh2.c:481: error: too many arguments to function `libssh2_session_methods\'
/tmp/pear/download/ssh2-0.10/ssh2.c: In function `zif_ssh2_fingerprint\':
/tmp/pear/download/ssh2-0.10/ssh2.c:536: warning: assignment discards qualifiers from pointer target type
/tmp/pear/download/ssh2-0.10/ssh2.c: In function `zif_ssh2_publickey_add\':
/tmp/pear/download/ssh2-0.10/ssh2.c:1038: warning: passing arg 1 of `_efree\' discards qualifiers from pointer target type
/tmp/pear/download/ssh2-0.10/ssh2.c: In function `zif_ssh2_publickey_list\':
/tmp/pear/download/ssh2-0.10/ssh2.c:1097: warning: passing arg 4 of `add_assoc_stringl_ex\' discards qualifiers from pointer target type
/tmp/pear/download/ssh2-0.10/ssh2.c:1098: warning: passing arg 4 of `add_assoc_stringl_ex\' discards qualifiers from pointer target type
/tmp/pear/download/ssh2-0.10/ssh2.c:1106: warning: initialization discards qualifiers from pointer target type
/tmp/pear/download/ssh2-0.10/ssh2.c:1107: warning: passing arg 2 of `zend_hash_add_or_update\' discards qualifiers from pointer target type
make: *** [ssh2.lo] Error 1
ERROR: `make\' failed

Here i have ceased to continue installing SSH2 for PHP.
I am unsure if the system has been badly effected by this partial installation.

JavieL
JavieL·

Some example for view?¿

Kevin
Kevin·

@ Patrick. I\'m not certain if the pecl module supports the newer version (0.17). So maybe we can figure out what went wrong with 0.14? That way we can be certain that it can work.

@ JavieL: I\'m sorry what do you mean exactly?

vezzo
vezzo·

hey, kevin, why i can execute a lot of command but, I can\'t change directory with \"cd Desktop\" for example????

Kevin
Kevin·

@ vezzo: If your really want an \'interactive\' session with the remote server, you cannot use the exec function. You will have to use the shell function instead. Hope it helps. K

Bryan
Bryan·

Thank you! I\'m so glad I found this article, or I may have not been able to get this working.

I initially tried the 0.17 version of libssh, and I got the \"make 1\" error from PECL. When I installed 0.14, everything became peachy.

Kevin
Kevin·

Thanks for sharing that information Bryan! I hadn\'t tried 0.17 yet, seems more people are running into problems with it.

Nigel
Nigel·

Hi Kevin, looks like you\'ve done some really good work here, problem is I am stuck at first base with windows.
I want to start doing some ssh2 from my php scripts. Followed the instructions from php.net, i.e. got the PECL zip\'s, unzipped to c:\\php5\\exts
then added to php.ini: -
extension_dir=c:/php5/exts/
extension=php_ssh2.dll

then restarted apache (and the server to be sure on the next attempts!)
...Code 500! aaaarrrggghhhh

Log file below, any ideas please??
have installed openssl.exe and made sure in path. php.ini file must be ok as it calls in the errors below but then errors. Anyone got any advise please!!! Stupidly told company that I can get this done next week :(

[Mon Dec 03 20:07:47 2007] [warn] pid file C:/Program Files/Apache Software Foundation/Apache2.2/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
PHP Warning: PHP Startup: Unable to load dynamic library \'c:/php5/exts/php_ssh2.dll\' - The operating system cannot run %1.\\r\\n in Unknown on line 0
[Mon Dec 03 20:07:49 2007] [notice] Apache/2.2.4 (Win32) PHP/5.2.4 configured -- resuming normal operations
[Mon Dec 03 20:07:49 2007] [notice] Server built: Jan 9 2007 23:17:20
[Mon Dec 03 20:07:49 2007] [notice] Parent: Created child process 1072
PHP Warning: PHP Startup: Unable to load dynamic library \'c:/php5/exts/php_ssh2.dll\' - The operating system cannot run %1.\\r\\n in Unknown on line 0
[Mon Dec 03 20:07:49 2007] [notice] Child 1072: Child process is running
[Mon Dec 03 20:07:49 2007] [notice] Child 1072: Acquired the start mutex.
[Mon Dec 03 20:07:49 2007] [notice] Child 1072: Starting 250 worker threads.
[Mon Dec 03 20:07:49 2007] [notice] Child 1072: Starting thread to listen on port 80.
[Mon Dec 03 20:11:09 2007] [error] [client 172.30.1.78] PHP Fatal error: Call to undefined function ssh2_connect() in C:\\\\Program Files\\\\Apache Software Foundation\\\\Apache2.2\\\\htdocs\\\\ssh.php on line 3
[Mon Dec 03 20:19:12 2007] [error] [client 172.30.1.78] PHP Fatal error: Call to undefined function ssh2_connect() in C:\\\\Program Files\\\\Apache Software Foundation\\\\Apache2.2\\\\htdocs\\\\ssh.php on line 3

Kevin
Kevin·

@ Nigel: I\'ve never used PHP on Windows, but this is what I Can tell you: The PECL module acts as an interface between PHP & libssh2, and it seems to me you\'ve totally skipped the libssh2 part. I wonder if this is even available on windows?

Pimmy
Pimmy·

I got stuck from the beginning compiling libssh2..

----------------------------------------------------
root@tangra:libssh2-0.14>make all install
make[1]: Entering directory `/space/installs/libssh2-0.14/src\'
gcc -o channel.o channel.c -c -g -O2 /usr/include -I/usr/local/include -Wall -I../include/ -fPIC
gcc: cannot specify -o with -c or -S and multiple compilations
make[1]: *** [channel.o] Error 1
make[1]: Leaving directory `/space/installs/libssh2-0.14/src\'
make: *** [all] Error 1
root@tangra:libssh2-0.14>gcc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2.3/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux
Thread model: posix
gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-59)
----------------------------------------------------

This seems to be a \'minor\' bug in version 0.14 which can be fixed by removing the \'-o\' option from the Makefile.in file (line 23).

It might be fixed in later versions of libssh2, but as you notice there are other bugs in the newer versions.

I would really like to know if anyone managed to successfully use the patest versions of libssh2.

Thanks for the tutorial

Hiren Thakkar
Hiren Thakkar·

Thanks .. This may be helpful to me.

Pimmy
Pimmy·

Now I am stuck with another problem. In my error_log I have the following line:

--------------------------------------------------------
PHP Warning: PHP Startup: U\\x89\\xe5VS\\x8bu\\x0c\\xe8: Unable to initialize module\\nModule compiled with module API=20020429, debug=0, thread-safety=
0\\nPHP compiled with module API=20060613, debug=0, thread-safety=0\\nThese options need to match\\n in Unknown on line 0
--------------------------------------------------------

I\'ve recompiled both libssh2-0.14 and ssh2-0.10 several times in different ways but no joy.

Have you got any suggestions?

Pimmy
Pimmy·

I knew it - I\'ve posted the previous msg too soon.. But anyway, the problem was that for some reason, (from somewhere - clean tesing server) the compiler was referring to an old version of PHP. Still cant figure out where is the old libraries.

So I fixed the problem by pointing to my real PHP:

root@tangra:ssh2-0.10>phpize
root@tangra:ssh2-0.10>./configure \\
> --with-php-config=/usr/local/php/bin/php-config \\
> --with-ssh2=/usr/local
root@tangra:ssh2-0.10>make clean
root@tangra:ssh2-0.10>make

Then everything went smooth.

Cheers.

Kevin
Kevin·

@ Pimmy: Thank you for sharing!

Emanuel
Emanuel·

hi, congratulations for the article! It wanted to know if you it would have some tip of as I can make this installation of slackware 11.0? I made you vary attempts and in all I did not get success. It wanted to know if it can give some tip to me.

Kevin
Kevin·

@ Emanuel: Haven\'t used it since version 7, but isn\'t there something like slapt-get, or swaret that can (kind of) replace the package management tool aptitude?

If that doesn\'t work, let me know where you got stuck. what errors do you get. Thanks!

Emanuel
Emanuel·

1º - I followed its tutorial one using the version libssh2-0.14.
./configure = OK
make all install =
root@servidor: /temp/libssh2-0.14# make all install
make [1]: Entering in the directory “/temp/libssh2-0.14/src”
GCC - channel.o channel.c - c - g - O2 /usr/include - I/usr/include - Wall - I. /include/ - fPIC
GCC: /usr/include: to linker input file unused because linking not done
channel.c: 1253: 10: /usr/include: Archive or directory not found
channel.c: 71: internal to compiler error: Imperfection of Please
segmentation submit full bug report,
with preprocessed source if appropriate.
See <URL: http://gcc.gnu.org/bugs.html > will be instructions.
make [1]: ** [channel.o] Error 1
make [1]: Leaving the directory “/temp/libssh2-0.14/src”
make: ** [all] Error 1

2º - As it did not give certain in 1a, I tried using the version libssh2-0.18 that it compiled normally, to put I was to look lib ssh2.so and I did not find, what I found was libssh2.so, from there I configured php.ini with the following parameter:
extension=libssh2.so
I restarted the apache and in log of error vi the following one:
PHP Warning: Unknown (): Invalid library (maybe not the PHP library) “libssh2.so” in Unknown on line 0.

Debtor for helps me!

Kevin
Kevin·

The binding between libssh2 and php is ssh2.so, and last time I checked it wasn\'t availble for versions higher than 0.14.

But if I would have to guess, I would say that it\'s got something todo with not having a /usr/include available. Could that be?

Emanuel
Emanuel·

yes, the place /usr/include vi exists inside that another folder exists…
/usr/include/libssh
and inside of it exists these archives:
config.h crypto.h libssh.h server.h sftp.h ssh1.h ssh2.h
to put ssh2.so not you.

Kevin
Kevin·

@ Emanuel: Then I\'m sorry Emanuel, I don\'t know slackware good enough to help you any further. But maybe the slackware forums are a good place to ask for further assistance as this seems to be distro related. Good luck anyway, too bad it doesn\'t work \'out of the box\'.

Pimmy
Pimmy·

I have the case where I create an SSH2 session to a server and from there I execute a script which will copy some files back to the original server via SCP (This is done like that for security reasons).

The problem I see is that after everything completes there is a hanging ssh session left running on the server.

Has anyone experienced something similar or anyone with any ideas?

Thanks,

Pimmy

Kevin
Kevin·

@ Pimmy: I can\'t say I have. I did experience similar hanging sessions when connecting to (Force10) routers though. Implementing a lot of timeouts, double checks, and retries added some stability.

I finally came to the conclusion that the router had a different buffer or timing mechanism. Cause when reading the buffer:

[CODE=\"Javascript\"]
while( $buf = fread($shell,4096) ){
$data .= $buf;
}
fclose($shell);
[/CODE]

It was suddenly empty. Thus breaking the while and then closing the shell. But the router was just busy filling a new buffer and so the ssh session hang.

But I doubt your problem is the same.

Emanuel
Emanuel·

Hi, finally I obtained to install lib ssh2.so. to put when I go to twirl the test function that exists in its wiki:
[CODE="php"]if (!function_exists(\"ssh2_connect\")) die(\"function ssh2_connect doesn\'t exist\")
// log in at server1.example.com on port 22
if(!($con = ssh2_connect(\"server1.example.com\", 22))){
echo \"fail: unable to establish connection\\n\";
} else {
// try to authenticate with username root, password secretpassword
if(!ssh2_auth_password($con, \"root\", \"secretpassword\")) {
echo \"fail: unable to authenticate\\n\";
} else {
// allright, we\'re in!
echo \"okay: logged in...\\n\";

// execute a command
if(!($stream = ssh2_exec($con, \"ls -al\" )) ){
echo \"fail: unable to execute command\\n\";
} else{
// collect returning data from command
stream_set_blocking( $stream, true );
$data = \"\";
while( $buf = fread($stream,4096) ){
$data .= $buf;
}
fclose($stream);
}
}
\"][/CODE]
e in log of the apache returns me the following error:
[CODE=\"[ error ] PHP error Parse: syntax error, unexpected T_IF in /var/www/htdocs/a.php on line 4[/CODE]
wanted to know if it would have as to help to decide this problem me

Kevin
Kevin·

@ Emanuel: My bad, the example code was missing a: \';\'

so:
[CODE=\"php\"]
die(\"function ssh2_connect doesn\'t exist\")
[/CODE]

needed to be:
[CODE=\"php\"]
die(\"function ssh2_connect doesn\'t exist\");
[/CODE]

I\'ve updated the article accordingly. btw, you were using the CODE tags incorrectly but I\'ve editted your comment for better readability.

Emanuel
Emanuel·

Very obliged for its aid. The example executed! Where I can find more functions of this I modulate? I intend to use it, to connect itself in the Mikrotik it saw ssh and to twirl rules

youme
youme·

i have my own php script, no need to install on server, just upload php file on your server, and you have full access you server root, including system commands, exec commands, shell , SSH and lot more

if you want buy price is 150$ USD

email me mscmsc@brain.com.pk

XSchne2036
XSchne2036·

hi,

I followed your instructions
and ...

zirkonia:/var/www/apache2-default/libssh2-0.18/src/.libs# pecl install -f ssh2 WARNING: failed to download pecl.php.net/ssh2 within preferred state \"stable\", will instead download version 0.10, stability \"beta\"
downloading ssh2-0.10.tgz ...
Starting to download ssh2-0.10.tgz (22,187 bytes)
........done: 22,187 bytes
5 source files, building
running: phpize
sh: phpize: command not found
ERROR: `phpize\' failed

apt-cache search phpize has no results too...

please... what am I doing wrong ?

Kevin
Kevin·

@ XSchne2036: You don\'t have phpize which is part of the php5-dev package. So it seems to me you skipped a step. Try (re)installing the requirements.

Sebastian
Sebastian·

Hey Kevin,
thanks for the tutorial. Installation and configuration works nicly on SLES 10.

But I have the problem, that Method 1 oder 2 doesn\'t get any result back.
No errors in apache2 log.
On echo\'ing $stream, I get \"Resource id#3\" back.
Any ideas?
Thanks a bunch

Kevin
Kevin·

@ Sebastian: Strange. Not a lot to go on either. If a step fails you should get an error. How about turning on all error reports?
[CODE=\"PHP\"]
<?php
$old_level = error_reporting( E_ALL );
?>
[/CODE]
Does this tell you anything?

Sebastian
Sebastian·

No changes in behavior. No errors. No hints.
connection establishes successfully, but no response.
I stripped the code for only connecting, executing, streaming, output. But nothing.

The /var/log/messages on the remote system sais:
[code]
Apr 8 04:21:13 cme1 sshd[21681]: Accepted password for rts from 10.34.2.9 port 51653 ssh2
Apr 8 04:21:13 cme1 sshd[21683]: Received disconnect from 10.34.2.9: 11: PECL/ssh2 (http://pecl.php.net/package...
[/code]
Any ideas?
Thanks

Kevin
Kevin·

The disconnect is logged the same second the connect is. I guess therein lays your problem?

What about building a 5 second sleep. Executing a command (maybe a command that touches a file on the remote system?), validate the results and then disconnect, for testing purposes?

Sebastian
Sebastian·

That works, five seconds sleep in the script, results in 5 sec timedifference in the logfile. I was able to touch a file on the remote system and echo some data in it.
But cat\'ing the file to have some data back doesn\'t work.
Crazy!

Thats the codesnipped I\'m working with:
[CODE=\"php\"]
<?php
error_reporting( E_ALL );
$con = ssh2_connect(\"cme1\", 22);
ssh2_auth_password($con, \"rts\", \"thesecret\");
// execute a command
$stream = ssh2_exec($con, \"touch /tmp/file.txt; echo \\\"My Test\\\" >> /tmp/file.txt; sleep 5; cat /tmp/file.txt\");
// collect returning data from command
stream_set_blocking($stream, true);
$data = \"\";
while( $buf = fread($stream,4096) ){
$data .= $buf;
}
fclose($stream);
?>
[/CODE]

Kevin
Kevin·

@ Sebastian: Hm, you stripped out all of the checks. Might that be one reason it did not echo anything? Furthermore, have you tried my second \'tip\'?

Sebastian
Sebastian·

Hey Kevin,
1st: The initial script works, too. It echos: okay: logged in...
2nd: the connection establishes fine. otherwise I could not have touched a file.
I stripped the code to exclude other errors (typos, etc)
Which second tip? Have I missed anything?
You mean about valitading the results?
How shall I test?
We can switch over to email conversation, not to \"spam\" your commments. Drop a mail to s(dot)waitz(at)rtsgroup(dot)net.
Thanks a lot.

Kevin
Kevin·

@ Sebastian: Yeah I meant the tip of running an echo \'__COMMAND_FINISHED__\', setting blocking to false, etc. The one from the header \'tips\'.

Sebastian
Sebastian·

Ahhh,
ok, I tried the first variant of __command finished__.
I suppose this should be displayed in the browser when the script is executed.
But that was not the case.
On forwarding this echo to a textfile
[CODE=\"php\"]
ssh2_exec($con, \'ls -al >> /tmp/file.txt; echo \"--command finished--\" >> /tmp/file.txt\');
[/CODE]
works as expected. The stout was directed into the file, and can be read by loggin in on console.
hrrghh.

Kevin
Kevin·

@ Sebastian: I see. If you change the command like this it will probably work:
[CODE=\"Javascript\"]
ssh2_exec($con, \'ls -al >> /tmp/file.txt; echo \"--command finished--\"\');
[/CODE]

Sebastian
Sebastian·

Kevin,
does \"I see\" mean you were able to reproduce the behavior?

Unfortunatly, your idea doesn\'t work on my system.
The echo command will not be displayed on the webpage. But the first part can be seen in the local file.

What type of connection is opend to transfer the data back?
Can I presume, when a regular ssh connection from console works, that the ssh2_exec() should work too?
Any ideas? The server to reach is in the same network, so there shouldn\'t be any routing/firewalling problem.
rgds,

Wes
Wes·

Thanks a lot Kevin, I found your tutorial in the time I needed something like it the most. Thanks much.

I want to run some commands as root, but I can\'t login as root, is there away that I can su into root after logging into server as normal user?

Sebastian
Sebastian·

Hey Wes,
if you have root access on that box, configure sudo and put that in your script (e.g. sudu rcapache2 reload).
rgds,

Kevin
Kevin·

@ Wes: It might work if you open a shell instead of using the \'exec\' method. One way to find out :) Let me know alright?

few bugs when setting up ssh2
few bugs when setting up ssh2·

I had a few bugs when trying to get ssh2 to work, such as an error in the pelc and libssh2 not working inside a chroot.... fixes can be found here <a href=\"http://programming.has.no.c...\">http://programming.has.no.c...

few bugs when setting up ssh2
few bugs when setting up ssh2·
shinta
shinta·

hi kevin i\'have something problem with
command:

--------------------------------------------------------
pecl install -f ssh2
--------------------------------------------------------

and i got :

--------------------------------------------------------
No releases available for package \"pecl.php.net/ssh2\"
Cannot initialize \'ssh2\', invalid or missing package file
Package \"ssh2\" is not valid
install failed
--------------------------------------------------------

whether i do connect to internet? to execute \"pecl install -f ssh2\"?

and i download some pakcage from http://pecl.php.net/package...

and i try to execute

--------------------------------------------------------
pecl install -f /home/user/ssh2-0.10.tgz
--------------------------------------------------------

and it\'s running some script / something compile,but i got some error

--------------------------------------------------------
make: *** [ssh2.lo] Error 1
ERROR: `make\' failed
--------------------------------------------------------

what\'s wrong in my command?
i use ubuntu feisty?

Kevin
Kevin·

@ shinta: Hi,

[CODE=\"bash\"]
make: *** [ssh2.lo] Error 1
ERROR: `make\' failed
[/CODE]

Is just the conclusion. Best is to find the first thing (not the last) that goes wrong in the text you get.

And what about
[CODE=\"bash\"]
pear install -f ssh2
[/CODE]
? Some people for some weird reason can\'t use pecl on their system, though ssh2 definitely is a pecl package...

shinta
shinta·

oh i\'m sorry i didn\'t see #29. Patrick on 23 October 2007 comment
i\'ts doesn\'t work in newes libssh2

i trying libssh2-0.14 and everything ok

thank u kevin for your article
GBU

Kevin
Kevin·

@ shinta: No problem, glad it works!

Wes
Wes·

Thanks Kevin, I found the easiest way is to enable sudo user from running commands without being asked for a password

[code=\"test\"]%admin ALL=NOPASSWD: ALL[/code]

But after all that i cant pass variables to the shell, for example:

[code=\"php\"] if(!($stream = ssh2_exec($con, \"/home/user/ls /home/user/$v1\" )) )[/code]

Wes
Wes·

Correction

[code=\"php\"] if(!($stream = ssh2_exec($con, \"ls /home/user/$v1\" )) )[/code]

Kevin
Kevin·

@ Wes: Can\'t reproduce easily, but 2 tips:
- concatenate the var
- when sudoing it is probably better use a shell instead of exec

Wes
Wes·

I found what was the problem. a space in the var that I was using. I used trim and that took care of it.

Thanks a lot for all your help.

Excellent tutorial indeed

cartmanf
cartmanf·

Thank you kindly for the extensive tutorial. I found it extremely useful.

Hope you post some more advanced tutorials soon.

Regards,
Reinhard

NJ
NJ·

Thanks a ton!! I was trying to resolve this problem from a long time. It really helped.

nunu
nunu·

hei, i got this error :

Warning: ssh2_connect() [function.ssh2-connect]: Unable to connect to 10.128.16.19 on port 22 in /var/www/html/oned/ssh.php on line 2

Warning: ssh2_connect() [function.ssh2-connect]: Unable to connect to 10.128.16.19 in /var/www/html/oned/ssh.php on line 2

can you tell me what\'s wrong?

i\'m using :

libssh2 version 0.12
banner SSH-2.0-libssh2_0.12

Thankyou

Kevin
Kevin·

@ nunu: Seem\'s to me you can\'t connect. Can you connect to that same IP using regular console SSH?

MianoSM
MianoSM·

I\'m following the prerequisites, as well as the steps with copy and paste (with a few sudo\'s beforehand on some of them), on a 6.06 Ubuntu system.

I get install ok: channel://pear.php.net/ssh2...

I have also restarted sshd after ensuring:
passwordauthentication yes

Now, when I use the block for Method 1, I\'m seeing:

\"function ssh2_connect doesn\'t exist\"

Any pointers on this would be greatly appreciated. Thank you.

Kevin
Kevin·

@ MianoSM: My guess would be that the module has not been loaded. Did you include the
extension=ssh2.so

MianoSM
MianoSM·

Thank you, I went back and double checked my extensions and had mistakenly commented out my own additions. Thank you for your rapid response. : )

UnrealComps
UnrealComps·

I have followed all the steps above but it still says \"function ssh2_connect doesn\'t exist\". Any ideas? Thanks

Kevin
Kevin·

@ UnrealComps: My guess would be that the module has not been loaded. Did you include the
extension=ssh2.so

Shoaibi
Shoaibi·

Great article indeed...

Peter
Peter·

When i use ssh2_scp_send() to copy files it show me a warning saying that the file wasn\'t copied and the return value of the function is false but the file is truly copied. I tested if the file was really well
copied by verifying his md5 hash code and the copy was successful, the file was well copied. Can you help me?

Ho Wai Keong
Ho Wai Keong·

This article has helped me solved installation of ssh2 to my php on my server. I guess those who have difficulties to compile or make the ssh2.so, u should download the ssh2 tarball from this link http://svn.mandriva.com/cgi...

this definitely fixes it!

Ross
Ross·

Hi,

I\'m trying to install this on a machine running CentOS. However I am hitting this error when trying to run the \"make all install\" command for libssh2

[code=text]make[1]: Entering directory `/usr/src/libssh2-0.14/src\'
gcc -o channel.o channel.c -c -g -O2 /usr/include -I/usr/include -Wall -I../include/ -fPIC
gcc: /usr/include: linker input file unused because linking not done
channel.c:1253:10: /usr/include: No such file or directory
channel.c:71: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://bugzilla.redhat.com/... for instructions.
make[1]: *** [channel.o] Error 1
make[1]: Leaving directory `/usr/src/libssh2-0.14/src\'
make: *** [all] Error 1[/code]

Tim
Tim·

Hey, just wanted to tell you, this article has been really helpful. We just moved an account management webapp from one server to another, and couldn\'t figure why it didn\'t work, until we found that it required ssh access to get to our ldap on another server, and apparently we forgot to link this module when we moved over. Thanks for this information!

Kevin
Kevin·

@ Peter: I believe I\'ve read somewhere that ssh2_scp_send isn\'t that reliable. What kind of file are you trying to submit? Because there may be ways to implement a more reliable system using ordinary commands.

@ Ho Wai Keong: Thank you for sharing!

@ Ross: Please request support from a CentOS related forum/community.

@ Tim: Thank you Tim

Han
Han·

After installing libssh2 and trying to install ssh2 i get :

Aphrodite:~ # pear install ssh2
No releases available for package \"pear.php.net/ssh2\" - package pecl/ssh2 can be installed with \"pecl install ssh2\"
Cannot initialize \'channel://pear.php.net/ssh2\', invalid or missing package file
Package \"channel://pear.php.net/ssh2\" is not valid
install failed

However, when trying pecl install ssh2, i get, command pecl not found ... ?

Kevin
Kevin·

@ Han: Please follow the tutorial closely. It says \'-f\' and explains why that is needed.

Han
Han·

kevin, i appreciate ur comment and help, but eh, pecl command not found means pecl does not exist on my system to be honest ... Does -f also work with pear ?

Like pear -f install ssh2 ?

Han
Han·

Kevin, i have fixed the pecl problem, i was missing some packages, sorry for my latest comment !

Altough now, i have a new problem, please find the output here :
http://rafb.net/p/YiZQBj72....

Kevin
Kevin·

@ Han: OK, the output is cut at (I think) 80 characters or so, so I can\'t fully read it.

But could it be you use the latest libssh version and not the 0.14? Cause some people have reported similar problems with that.

Also, check under \'Packages\' to see what packages are required (also dev packages & build tools).

Han
Han·

kevin, i have all packages needed.
And installed libssh2v16, because i was not able to install v18 (latest ) and v14 because of other issues ( regarding ld -lz or something )

Pls note that im on Suse x64 10.2

Help is much appreciated :(

Kevin
Kevin·

@ Han: I still use v14 and have no issues with it. People have reported similar issues with later versions. It works on debian & ubuntu 64bits systems. I\'m unable to test on suse 64bits.

Han
Han·

Kevin, if ur fine with it, ill post the output when compiling v 14 ...

but still, i do not think that my pear / pecl problem is related to the version of libssh i have installed ...

Kevin
Kevin·

@ Han: Can\'t really tell based on the output given. Maybe post the next failures on pastebin.org

Han
Han·

Posted the whole stuff again on pastebin:

http://pastebin.org/55011

Kevin
Kevin·

@ Han: Warnings can usually be ignored. Errors not. The error I saw in your output was: \"too many arguments to function libssh2_session_methods\"

I ran it through google and this was the first hit:
http://pecl.php.net/bugs/bu...

Looks like your problem so it might help you

Han
Han·

Kevin, ik snap niet heel goed wat ik precies moet doen ...

Kan jij me ff op weg helpen ?

Thx

Kevin
Kevin·

@ Han: English please. I think I\'m not the right person to support that package or it\'s bugs/patches for that matter. Maybe you need to ask on your distro\'s forum.

Han
Han·

Sorry for the dutch there, i has fixed it and now i hs a .so file, thanks a lot for pointing me in the right direction !

ken@ghx
ken@ghx·

has anyone tested this with ssh keys? Would it be possible to authenticate via LDAP, then ssh to a server and execute a command via an identity file? Or is there a better way to do this? I am trying to write an central application control app.

Kevin
Kevin·

@ ken@ghx: So far I\'ve only tested it by supplying username & passwords. Think it may be faster to try it yourself than to wait for someone else to reply here.

Could you share your findings though?

David Merel
David Merel·

I am getting the following, SSH2 is howing up in PHPinfo and I was able to get libssh2 .18 version going with 2.0.10, however I keep getting these errors below. I have also tried 2.0.11 as well as 2.0.10 with Libssh2 .14 version which they say is more compatible but still same results. It doesnt happen on my other servers, the only difference is that this is on FC4 (Fedora Core 4)

Any ideas?

Warning: ssh2_connect() [function.ssh2-connect]: Unable to connect to 192.168.1.116 on port 22 in /var/www/html/send.php on line 3

Warning: ssh2_connect() [function.ssh2-connect]: Unable to connect to 192.168.1.116 in /var/www/html/send.php on line 3

Warning: ssh2_auth_password() expects parameter 1 to be resource, boolean given in /var/www/html/send.php on line 4

Warning: ssh2_scp_send() expects parameter 1 to be resource, boolean given in /var/www/html/send.php on line 6
finished

Kevin
Kevin·

@ David Merel: Seems like connectivity issues to me. From that server can you telnet 192.168.1.116 on port 22 and get a connection?

Han
Han·

I need urgent help with PHP & SSH2 ...
All of a sudden, in my error_log file in /var/log/apache2/error_log i get spammed with the following messages :
sh: load: command not found

What is it ,and how do i fix it. I get spammed whenever i load a php file that has ssh2 stuff in it :/

Kevin
Kevin·

@ Han: I would only use this method from PHP-CLI utilities, Han. But can you paste a more detailed log over at pastebin.org or something? That would greatly help solving the problem.

bvidinli
bvidinli·

to reader:
build-essential
not buid-essential
fix that in your codes..

Kev van Zonneveld
Kev van Zonneveld·

@ bvidinli: Thank you for noticing! I\'ve updated the article.

Shane
Shane·

Kevin... I am also getting the \"PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) \'libssh2.so\' in Unknown on line 0\" error when I run
[code]
[root@apollo lib]# php -r \"echo (int)function_exists(\'ssh2_exec\');\"
[/code]

Any ideas?

Kev van Zonneveld
Kev van Zonneveld·

@ Shane: What version are you using? I still use v14 and have no issues with it. People have reported similar issues with later versions of libssh.

Shane
Shane·

@ Kevin: Yeah. I had to use 0.14 also. I found out that the later versions don\'t work because the ssh2.c file for pecl. They haven\'t work on a fix fo 0.18 yet.

That\'s the deal. I posted something about what I was using it for on my blog.

Kev van Zonneveld
Kev van Zonneveld·

@ Shane: Yeah I noticed you\'ve copied parts of my tutorial to your blog. I would appreciate some kind of backlink for that.

Shane
Shane·

It\'s at the bottom of the post.

Kev van Zonneveld
Kev van Zonneveld·

@ Shane: OK thanks a lot!

Daniele Siddi
Daniele Siddi·

OK, Thank you for your guide, it helped me very much.

Neil
Neil·

I was not able to get \'pecl\' to automatically build and install the ssh2-beta on my Linux distro. \'pecl\' would always exit after running \'configure\' on the ssh2-beta package, even though (as far as I can tell) \'configure\' exited cleanly for the package.

So, I just manually built ssh2.so after \'pecl\' had downloaded the package, using:

[CODE=\"text\"]
cd /tmp/pear/cache/ssh2-0.10
[/CODE]

(added fixes to ssh2.c from http://pecl.php.net/bugs/bu... just in case -- doesn\'t hurt)

[CODE=\"text\"]
./configure
make all
make install
[/CODE]

The ssh2.so library is placed into /usr/lib/extensions/no-debug-non-zts-20020429 by default after the \'make install\'. I copied ssh2.so from there to /opt/lampp/lib/php/extensions/no-debug-non-zts-20020429 since I use the XAMPP PHP install. From there, I could pick up again with your Installation instructions above to add the extension to my /opt/lampp/etc/php.ini file. I was able to see the library being loaded in phpinfo() after that, so now I\'m off to try out the new library in my code....

Hope that helps someone else. :)

Kev van Zonneveld
Kev van Zonneveld·

@ Neil: Thanks for sharing!

chris
chris·

I\'ve successfully connected and authenticated to a remote server via SSH. However, I don\'t know who how to get a stream going because the remote server is not another UNIX box, its a system running a custom CLI.

Using: ssh2_shell() won\'t work, nor does ssh2_exec(). The latter will give me the following warning:

Warning: ssh2_exec() [function.ssh2-exec]: Unable to request command execution on remote host in ...

Can anyone help?

Kev van Zonneveld
Kev van Zonneveld·

@ chris: I had the same problem trying to connect to network routers running their own CLI instead of POSIX compliant SSH.

Working with ssh2_shell instead of exec was the solution though.. I figured, if I can get ssh to interface with the device, it should be possible for libssh to do so as well. And eventually it was.

The only problem left were timing issues. As mentioned in the Tips chapter.

faizal
faizal·

Great article...I\'ve searched this topic for a long time. But thx God I found it here...Thx to Mr. Kevin

Kev van Zonneveld
Kev van Zonneveld·

@ faizal: My pleasure!

Eugene van der Merwe
Eugene van der Merwe·

Thank you for this routine.

Our our system it hangs when we do it on a web page. If I run it from the command line it works 100% every time.

The funny thing is it only sometimes hangs when you do it in a web page. I have not been able to spot the pattern.

Please assist.

Kev van Zonneveld
Kev van Zonneveld·

@ Eugene van der Merwe: That\'s not really specific enough to help. But what I can say is this:
Don\'t do it from webpages. This can only lead to problems. If you really need a webinterface for this module. Create an interface that inserts jobs into a table.
This table can be read from a PHP program (using PEAR\'s System_Daemon), and can then from the commandline execute the ssh commands.

This would be the clean way.

slak
slak·

Thanks for the tutorial. When I pecl install -f ssh2 under Debian Etch I get:
...
/root/ssh2-0.10/ssh2.c:1107: warning: passing argument 2 of
\'_zend_hash_add_or_update\' discards qualifiers from pointer target type
make: *** [ssh2.lo] Error 1

I had to get the patch from: http://www.billpitz.com/how...

cd /tmp/pear/cache/ssh2-0.10
patch < php-libssh2.diff
phpize && ./configure --with-ssh2 && make

Hope that helps someone.

Marek
Marek·

Hello,
First, thanks for tutorial - it\'s very good :).
Second, does anyone tried to run interactive commands using this library, eg. \'passwd\'... My question is: is it possible to enter some value when console prompt for it?

Kev van Zonneveld
Kev van Zonneveld·

@ Marek: I have not. But for your specific case, you might want to consider using:

[CODE=\"bash\"]
echo \"user:pass\" | chpasswd
[/CODE]

Kev van Zonneveld
Kev van Zonneveld·

@ slak: Thanks for sharing.

Han
Han·

Dear Kevin,

You have been a great help in the past, but now im having difficulties all over again.

I recently moved server host and instead of Suse 10.2 , i now have Suse 11 ( x64 as well )

And the error im getting on all versions is :

checking for OpenSSL... configure: error: Cannot find OpenSSL\'s libcrypto
Artemis:~/libssh2-0.16 # locate libcrypto
/usr/lib64/libcrypto.so.0.9.8

Altough as u can see, its there ...

Any suggestions ? :s

Regards,

Kev van Zonneveld
Kev van Zonneveld·

@ Han: If I remember correctly you fixed some issues on version libssh2-0.14, and that worked better?

Han
Han·

Well, i cant remember which version i used.

Looking at my earlier posts, i used version 16 , but version 16 and 14 are both giving me the same problem, and i have no idea anymore how i fixed it :(

Han
Han·

PS: if i copy the so files from my other box ( suse 10.2 ) to the same directories, would this work or does the install of libssh do other stuff as well ?

Regards,

Kev van Zonneveld
Kev van Zonneveld·

@ Han: Could work I suppose, if the so is binary compatible that is (other machine also 64bits? etc).

Han
Han·

UPDATE: i has fixed the problem, for other 64bitters out there :

in the configure file, locate libcrypto
and change the following :
[code=\"text\"] if test -r $i/lib/libcrypto.a -o -r $i/lib/libcrypto.$SHLIB_SUFFIX_NAME; then
OPENSSL_LIBLINE=\"-L$i/lib -lcrypto\"
[/code]

change that into :
[code=\"text\"]
if test -r /usr/lib64/libcrypto.a -o -r /usr/lib64/libcrypto.$SHLIB_SUFFIX_NAME; then
OPENSSL_LIBLINE=\"-L/usr/lib64 -lcrypto\"
[/code]

Kev van Zonneveld
Kev van Zonneveld·

@ Han: Awesome man. Good job & thanks for sharing.

Han
Han·

No prob ! :)

Glad that its actually working ;-)

Sander
Sander·

Hi, I installed ssh2.so this works fine but when i create a cronjob to receive some files from an sFTP server the function does not excist :( is there an problem to use the function ssh2_connect() in combination with a cronjob?

Thanks

Kev van Zonneveld
Kev van Zonneveld·

@ Sander: And running it from the commandline otherwise goes fine? A common reason for things not to work from crontab, is that some environment variables like PATH are not set. Could this be your problem as well? Are you making any additional system calls?

Sander
Sander·

Hi Kevin,
When I run the script with my browser there is no problem, but in the cronjob the function ssh2_connect() is unknown.
Other \"normal\" functions are working fine like ftp_connect(), ftp_login(), microtime().... The systemmanager is now checking whats wrong because he installed ssh2 functions on my server (i can\'t do that). I\'m searching also for some solutions :)
Thanks

Kev van Zonneveld
Kev van Zonneveld·

@ Sander: There are two php.ini\'s. One for CLI & one for Apache. Maybe you need to enable your so in your CLI\'s php.ini?

Sean
Sean·

If anyone encounters an memory allocation error when intalling ssh2 via PECL.

Add the following at the top of /usr/share/pear/pearcmd.php:

ini_set(\'memory_limit\',\'32M\');

Sander
Sander·

We figured it out:
The command for the cronjob:
wget -q http://www.xxxxxx.xxx/getfi...

Bob Likes Your Tutorial
Bob Likes Your Tutorial·

Great tutorial but it didn\'t work for me. In my case, the script just returned \"logged in\".. but never seemed to move on to the next stage. I had to change the part about reading the buffer to:

[CODE=\"php\"]
stream_set_blocking( $stream, true );
$output = stream_get_contents($stream);
echo $output;
fclose($stream);
[/CODE]
I\'m not sure if I\'ll discover hidden consequences though. I\'m too new at this to know.

Thanks again for this though. I would never have know about this function without this tutorial.

Kev van Zonneveld
Kev van Zonneveld·

@ Bob: It also depends what device you are talking to. I found that a couple of network routers have to be treated differently from debian servers. This had to do with the ssh implementation on the other side. You have to play around with the settings to make it solid for your environment. Thanks for sharing though.

@ Sander: that way you go around the problem, but if it works your you and you can live with the security implications, that\'s good!

@ Sean: Thanks for sharing!

Trenton
Trenton·

I am trying to follow this but the pecl build is erroring out.. @ ssh2.lo. Can you possibly provide some assistance?

\"make: *** [ssh2.lo] Error 1\" feel free to email me.

Caesonia
Caesonia·

As usual I appreciate the guide and time, but as usual, it doesn\'t work. I am using Ubuntu, and apparently openssl-dev is not available, though several with it in the package name are. I\'ve tried several different locations. Additionally PECL fails to install. Wow, big surprise there.

So one more big waste of time in the Linux world. It\'s this sort of thing that really keeps prince of darkness MS in the game. We can;t get our acts together to have stuff that is consistently available and workable. And SSH2 is not exactly some strange out there sort of geek thing so it should be available easily across the makes.

I need to write scripts to monitor my server load on several different systems, and I really get tweaked at wasting my time instead going down dead paths to finding I can;t write those scripts to begin with, because its not possible to compile whatever the platform you need.

What a fricken joke.

Kev van Zonneveld
Kev van Zonneveld·

@ Trenton & Caesonia: I can only help you if you paste the full output/log of what\'s hapening. Maybe pastebin.org is a good place for that, and then paste the link to it here?

@ Caesonia: I can see how that\'s frustrating, but there have been 153 comments before you, and a lot of people have got it to work.

If my article has become outdated, I will update it, but as for now, the information to get it working on ubuntu; should be here. If not let me know.

Also, you might want to try to CTRL+F through the comments to see if your problem was already solved.

Alf Marius
Alf Marius·

Great guide, thanks! :)

Søren Jensen
Søren Jensen·

Thanks for the guide.
It somewhat worked for me - I mean it really pointed me in the right direction and got me started.
I think I had the same error as Caesonia, tho not much information was provided.
I had to modify the ssh2.c file according to the commenst on this link: http://dk2.php.net/manual/e...
Then it seemed to work out fine. It shows up in a phpinfo() now.

Søren Jensen
Søren Jensen·

My bad... I see #133 already found that solution.
Reading comments do pay off, heh :-)

Karol
Karol·

It would awesome to see this integrated with something like phpterm:
http://phpterm.sourceforge....

Kev van Zonneveld
Kev van Zonneveld·

@ Karol: I have enough hobbies as it is ;) but feel free man!

Allie
Allie·

I had problems using ssh2 on Mac OS X. Everything compiled fine for both libssh 0.18 and ssh2.0.10. However, when I try to run my php script on the commandline, I keep getting the error \"PHP Warning: PHP Startup: Unable to load dynamic library \'/usr/local/php5/lib/modules/ssh2.so\' - (null) in Unknown on line 0\". I tried everything but nothing works until I reconfigure ssh2 again using the following :-
./configure --with-ssh2=/usr/local/lib --with-php-config=/usr/local/php5/bin/php-config && make install
Hope this will hope someone

Kev van Zonneveld
Kev van Zonneveld·

@ Allie: Great that you share that with us. Thanks

Nicolas
Nicolas·

hi, i run :
pecl install -f ssh2-beta
and get this error
make: *** [ssh2_fopen_wrappers.lo] Error 1
ERROR: `make\' failed

helpmeeeee!!
tanks

Kev van Zonneveld
Kev van Zonneveld·

@ Nicolas: Need. More. Output :) Check below.

Jamie
Jamie·

I have been having problems installing this on Ubuntu 8.10 also. I finally got it working. It appears the latest version of the PECL SSH2 package is the problem, so the solution is to manually install it.

Go to:
http://pecl.php.net/package...
And download 0.10.0. Then:

tar -zxf ssh2-0.10.tgz
cd ssh2-0.10
phpize
./configure
make

After that add the extension=ssh2.so in your php.ini file and you are up and working.

The problem with the current version (0.11.0) seems to be this:

ssh2_fopen_wrappers.c:49: error: `LIBSSH2_ERROR_EAGAIN\' undeclared (first use in this function)

Hope this helps out!

Virg
Virg·

Just want to say thanks for this article. It was super helpful. =)

Jaimie Sirovich
Jaimie Sirovich·

The wrappers below may help you a little more ... for most common tasks. If anyone has any input on them (or bugfixes!), let me know.

The article above was helpful when I was trying to figure out heads from tails with ssh_*; thanks Kevin!

http://www.seoegghead.com/s...

Kev van Zonneveld
Kev van Zonneveld·

@ Jamie: Thanks for sharing

@ Jaimie Sirovich: You may even concider contributing such a class to PEAR. That will guarantee solid testing, ideas for improvement & feature requests & bug reports.

ian
ian·

ssh2 is now upto v1.

everything works nicely, remember to apt-get make for ubuntu.

Kev van Zonneveld
Kev van Zonneveld·

@ ian: Thanks for the heads up! I\'ve updated the article

Shizuka
Shizuka·

Thank you so much for this article, and especially for the additional help at comment #165! I\'ve been banging my head against a wall for about five hours trying to get this working for a WordPress installation.

John
John·

Thanks for good tutorial.

Not sure if this is covered in previous comments:

On Ubuntu Gutsy I had to use the ssh2 0.10.0 version as the 0.11.0 would not build - there is already a bug written...

Once built, I had to manually add an ssh2.ini file in /etc/php5/apache2/conf.d-
\"# configuration for php SSH2 module
extension=ssh2.so\"
PHP wouldn\'t use the module until I did, though phpinfo and the error log made it look as though it was loading.

hope this helps somebody
John

Kev van Zonneveld
Kev van Zonneveld·

@ John: Thank you for sharing!

Daisy
Daisy·

Hello kevin.

Well I\'ve very basic knowledge in this area, so please, you can be very specific in your answer :)

I was having some problem with the command:

pecl install -f ssh2
wich I could fix thanks to the comment #165

Everything worked fine with the installation now,
but it is still not recognized when I run the php script in my webpage:

function ssh2_connect doesn\'t exist

I\'ve seen a lot in the comments that you say it\'s probably that the extension is not in the php.ini file.
I don\'t know if I put it in the right place, so I\'m posting where I did put it:

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
;
; If you wish to have an extension loaded automatically, use the following
; syntax:
;
; extension=modulename.extension
;
; For example, on Windows:
;
; extension=msql.dll
;
; ... or under UNIX:
;
; extension=msql.so
;
; Note that it should be the name of the module only; no directory information
; needs to go here. Specify the location of the extension with the
; extension_dir directive above.

extension=ssh2.so

Right there below the comments. I guess that is right, how can I test what else can be happening?

Thanx in advance,

Daisy.

Kev van Zonneveld
Kev van Zonneveld·

@ Daisy: What you did all looks okay. Exactly which php.ini did you change it in? And are you trying to run this from commandline or apache?

purelife
purelife·

if you can\'t get php_ssh2.dll working, you might have better luck with a pure-PHP implementation of ssh:

http://phpseclib.sourceforg...

Kev van Zonneveld
Kev van Zonneveld·

@ purelife: That looks amazing!

redux
redux·

Can you use ssh2_exec and write to STDIN? I have a program that reads input for STDIN, but I am unable to write to the stream. I\'ve tried a bunch of stuff, even adding a CTL-D, but it just hangs as if it is waiting for input.

Thanks,

Kristjan Adojaan
Kristjan Adojaan·

In manual there is refferred to libssh2-0.14. I was not able to use it (pecl install did not compile). With version libssh2-0.18 or libssh2-1.0 it was OK. Get latest version from http://sourceforge.net/proj...

Kev van Zonneveld
Kev van Zonneveld·

@ redux: Sounds like you need shell, as is explained in the article.

@ Kristjan Adojaan: Thanks for sharing!

stef
stef·

Yeah, great article ! ! Just want to let people now, in the examples , output is returned in $data variables. I was stumped on this one for a few minutes, staring at a blank page before I found the jackpot.

Mike
Mike·

I am able to get the ssh function working and connect, but having authentication issues. I can use ssh through cygwin and connect fine with the same username and password. When I enter the servername, username and password with the code above it doesnt authenticate. Are there any concerns I should be aware of in regards to php authenticating vs cygwin or bash? Im running this on a SUSE 11 box.

Mike
Mike·

To clarify my web page pulls up:

fail: unable to authenticate

echos straight from the code.

Mike
Mike·

scratch that last comment, I figured out by enabling clear text passwords in the sshd_config and restarting ssh, like it said in the instructions! Thanks for the article its been very helpful

Kev van Zonneveld
Kev van Zonneveld·

@ Mike: very well!

Janckos
Janckos·

Great!

Albert
Albert·

Warning: ssh2_connect() [function.ssh2-connect]: Error starting up SSH connection(-3): Error sending banner to remote host in /var/www/test/classes/ssh.php on line 27

Warning: ssh2_connect() [function.ssh2-connect]: Unable to connect to 10.0.0.22 in /var/www/test/classes/ssh.php on line 27

I know that the server is running I use your code.

Ed
Ed·

I have an installtion questions.
I\'m running on CentOS 5 Final, PHP5.
all packages installed, libssh2 installed, but when i go to install ssh2 - pecl install ssh2-beta, i get the following(only the last few lines):
***************************
/usr/include/ctype.h:105: error: declaration for parameter \'isdigit\' but no such parameter
/usr/include/ctype.h:104: error: declaration for parameter \'iscntrl\' but no such parameter
/usr/include/ctype.h:103: error: declaration for parameter \'isalpha\' but no such parameter
/usr/include/ctype.h:102: error: declaration for parameter \'isalnum\' but no such parameter
/usr/include/ctype.h:86: error: declaration for parameter \'__ctype_toupper_loc\' but no such parameter
/usr/include/ctype.h:84: error: declaration for parameter \'__ctype_tolower_loc\' but no such parameter
/usr/include/ctype.h:82: error: declaration for parameter \'__ctype_b_loc\' but no such parameter
/usr/include/php/main/php.h:127: error: declaration for parameter \'php_strlcpy\' but no such parameter
make: *** [ssh2.lo] Error 1
ERROR: `make\' failed

*******************

I\'ve spent a few days on this and i\'m at my wits end. any suggestions would be great.

thanks,

Ed

Kev van Zonneveld
Kev van Zonneveld·

@ Albert: I haven\'t seen that before so this is not enough for me to go on. Does it work to other servers?

@ Ed: Sorry Ed, this doesn\'t ring any bells. Have you tried both the version 0.14 and the latest stable one of libssh?

stmn
stmn·

Hi,
thanks for this tutoturial, but I have some problem. Commands work fine but it doesn\'t return data.

Am I doing something wrong?

Kev van Zonneveld
Kev van Zonneveld·

@ estus: Yes maybe you\'re doing something wrong. But for me there\'s no way to tell if you don\'t show me how you\'re doing it.

So please provide the source code and set error_reporting to E_ALL and show all output and what goes wrong.

stmn
stmn·

I\'m using source code from your article.

[CODE=\"php\"]
error_reporting(E_ALL);
// ini_set(\'display_errors\', 1);

if (!function_exists(\"ssh2_connect\")) die(\"Error #0: Nie wykryto ssh2 na serwerze.\");
if(!($con = ssh2_connect(\"xxx\", 27))){
echo \"Error #1: Nie moge sie polaczyc z serwerem.\\n\";
} else {
if(!ssh2_auth_password($con, \"xxx\", \"xxx\")) {
echo \"Error #2: Bledny login lub haslo.\\n\";
} else {

echo \"Wszystko dziala.\\n\";

if(!($stream=ssh2_exec($con, \"whoami\" ))){
echo \"Error #3: Komenda nie moze zostac wykonana.\\n\";
} else {
// zwraca wynik
stream_set_blocking($stream, true);
$data = \"\";
echo\"0\"; // helps
while($buf=fread($stream,4096)){
$data .= $buf;
echo $data;
echo\"1\"; // helps
}
fclose($stream);
}
}
}
[/CODE]

Commands works good, I know cause I can create directory. Error reporting doesn\'t shows any errors. :d It shows only number \"0\" but no \"1\". I was try with fgets or stream_gets_content but it doesn\'t works too.

Kev van Zonneveld
Kev van Zonneveld·

@ estus: Ok that\'s strange. What kind of device are you connecting to? Sometimes the shell method works better.

What version of PHP are you using?
Maybe setting blocking to 0 helps:
[CODE=\"php\"]
stream_set_blocking($stream, 0);
[/CODE]

Try to echo debug information inside the while loop like:
[CODE=\"php\"]
var_dump($buf);
[/CODE]

Cause it must return something, as echo \"1\" is never reached, hence $buf contains something that evaluates to true I suppose.

stmn
stmn·

I know it\'s strange. I\'m using PHP Version 5.1.6, with default php.ini. I was nothing changing. Maybe check my phpinfo: http://195.85.230.135/~gameone/phpinfo.php

[CODE=\"php\"]
stream_set_blocking($stream, 0);
[/CODE]

no change

[CODE=\"php\"]
var_dump($buf);
[/CODE]

no change and nothing return, really :/ this while loop is not perform.

stmn
stmn·

When I use shell method site/script is loading, loading... and loading and nothing happens. I don\'t have any ideas whats wrong... ;/

Kev van Zonneveld
Kev van Zonneveld·

@ estus: Sorry estus, I don\'t know what else to do, I find it kind of hard debugging this remotely. Could it be the PHP version that ships with redhat? I\'m on the PEAR mailing list & I heard a LOT of complaints & bugs with that version..

Daisy
Daisy·

The libssh2-1.1is the latest stable version and I have tried the method mentioned in this post and it works successfully. However, when I try to install this in another Debian Server, it gives me the following error. I am very new to Debian, hence, any help is welcome :

I get this when I put the ./configure :

checking host system type... (cached) x86_64-unknown-linux-gnu
checking for style of include used by make... GNU
checking for gcc... gcc
checking for C compiler default output file name...
configure: error: in `/usr/src/libssh2-1.1\':
configure: error: C compiler cannot create executables

Rachid
Rachid·

I am trying to connect to a system which requires some extra code.
When connecting with a regular SSH client, I get the following message once.

\"The authenticity of host \'192.168.255.9 (192.168.255.9)\' can\'t be established.
RSA key fingerprint is 64:bd:4e:94:a5:da:50:30:a8:67:71:7e:f0:19:1a:b7.
Are you sure you want to continue connecting (yes/no)?\"

I can bypass this by pressing Yes on the SSH client.
But how can I bypass this with PHP ?

Kev van Zonneveld
Kev van Zonneveld·

@ Daisy: Hm, could it be that you don\'t have enough rights to create the files? Try running the commands prefixed with sudo (or as root) for once.

@ Rachid: The PHP implementation doesn\'t generate dialogs that block further processing. It\'s a warning, not an error.

shaunah
shaunah·

my host doesn\'t support let me install pecl modules. can i still do ssh2?

Kev van Zonneveld
Kev van Zonneveld·

@ shaunah: That kind of depends how they blocked it. Can you run pear?

shaunah
shaunah·

pear isn\'t a problem - it\'s pecl that is.

some pear stuff may be a problem, too, if they use pecl extensions, but i haven\'t come across such packages, yet.

Han
Han·

Kevin, i hope you remember me.
I have a new problem... ive been trying to make v2.0 of a project i made some months ago.

And i notice that for some reason the following does not do anything:

[code=\"php\"]
if(ssh2_auth_password($connection,$user,$pwd)){
$stream=ssh2_scp_send($connection,\'/srv/www/htdocs/point/server.tmp\',\'/home/point/etmain/server.cfg\',0644);
}else{
echo \"No ballzzz...\";
}
[/code]
if i put an echo before and after the $stream line, it gets echoed, but for some reason the scp send command doesnt do bullshit ...

Any idea ?

Alan Choyna
Alan Choyna·

I have a Centos 5.3 64 bit OS that I\'m building as a Scalr management station manage our Amazon Ec2 cloud instances, and am caught trying get the \"pecl install -f ssh2\" to work.

Scaltr requires pretty much the latest PHP (at least 5.2.9, I\'ve installed 5.3.0).

I\'ve updated the libssh2 as you\'ve documented, but the \"pecl install -f ssh2\" command fails with a
\": Function eregi() is deprecated in PEAR/Registry.php on line 735. Error make failed\".

I\'m not sure what to do to debug this issue. Any advice?

Thanks in advance,

Alan

purelife
purelife·

@shaunah and @Alan Choyna:

Try this:

http://phpseclib.sourceforg...

Since it\'s pure-PHP, you don\'t have to bother with any PECL nonsense.

Kev van Zonneveld
Kev van Zonneveld·

@ shaunah: Well I mentioned PEAR cause if pear works chances are you can install pecl using pear just like:
[CODE=\"BASH\"]
pear install -f ssh2
[/CODE]

instead of:

[CODE=\"BASH\"]
pecl install -f ssh2
[/CODE]

@ purelife: Yeah that sure looks like a good option too!

@ Alan Choyna: I think our issue is a bit beyond the scope of this article and if you\'re still choosing libssh instead of purelife\'s suggestion it might be best to create a bug report with the authors of the software to help you troubleshoot.

@ Han: Do other commands work with libssh? You might test something like the following:

$str = file_get_contents(\'/srv/www/htdocs/point/server.tmp\')

remotely execute:
\"echo \'{$str}\' > /home/point/etmain/server.cfg\"

Which could also get your config file across. At least you isolate any permission related issues that way.

shaunah
shaunah·

i don\'t install pear like that - i usually take the individual components i need and their dependencies and put them in a directory in the include path.

i\'ve done go-pear, before, as well, but all trying to do it via the command line results in are errors. i\'m on a shared host and it seems like it would be a rather big oversight on their part if they let me install arbitrary extensions on their server.

Stephen
Stephen·

This is exactly what I\'m looking for, as Ubuntu didn\'t have it installed. Went through the step-by-step instructions and managed to get it to work.

However, ONLY for the first demo.

I changed the credentials, server, and command to execute, and with an additional line of
[code=\"php\"]
echo \"<pre>\".$data.\"</pre>\";
[/code]
right at the end of the file. Perfect, I get the results I expected.

However, if I copy/paste the line to check if the ssh2_connect function exists into my own code, first line, nothing else, it bombs saying that the function doesn\'t exist.

The unique thing about this particular PHP file I\'m fighting with is that its actually \"CALLED\" via exec. The actual command line is

[code=text]php comparefile.php file1 file2[/code]

It fails with \"function ssh2_connect doesn\'t exist\".

I drop to the command prompt, run code posted above, and it fails as well.

So why would it be that I can execute the PHP code directly from a web browser, it works perfectly as expected, but, when I run it at a command prompt, or shell out, I\'m failing?

Stephen
Stephen·

I figured out the problem.

It dawned at me (At 4am) that the change to the php.ini as documented here affected just Apache. However, what I\'m doing is calling php via a shell, so Apache doesn\'t come into play. What had to be done was go into the /var/php5/cli/php.ini and add the appropriate extension entry. No restart of services, or anything, and POOF, it worked.

Thanks for this!

Fatima
Fatima·

Hi Kevin,

When i execute the command

pecl install -f ssh2,

it produces the following error,

/tmp/pear/cache/ssh2-0.11.0/ssh2.c: In function \'zif_ssh2_fingerprint\':
/tmp/pear/cache/ssh2-0.11.0/ssh2.c:558: warning: initialization discards qualifiers from pointer target type
/bin/bash /var/tmp/pear-build-root/ssh2-0.11.0/libtool --mode=compile gcc -I. -I/tmp/pear/cache/ssh2-0.11.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/ssh2-0.11.0/include -I/var/tmp/pear-build-root/ssh2-0.11.0/main -I/tmp/pear/cache/ssh2-0.11.0 -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -I/usr/local/include -DHAVE_CONFIG_H -g -O2 -c /tmp/pear/cache/ssh2-0.11.0/ssh2_fopen_wrappers.c -o ssh2_fopen_wrappers.lo
gcc -I. -I/tmp/pear/cache/ssh2-0.11.0 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/ssh2-0.11.0/include -I/var/tmp/pear-build-root/ssh2-0.11.0/main -I/tmp/pear/cache/ssh2-0.11.0 -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -I/usr/local/include -DHAVE_CONFIG_H -g -O2 -c /tmp/pear/cache/ssh2-0.11.0/ssh2_fopen_wrappers.c -fPIC -DPIC -o .libs/ssh2_fopen_wrappers.o
/tmp/pear/cache/ssh2-0.11.0/ssh2_fopen_wrappers.c: In function \'php_ssh2_channel_stream_read\':
/tmp/pear/cache/ssh2-0.11.0/ssh2_fopen_wrappers.c:49: error: \'LIBSSH2_ERROR_EAGAIN\' undeclared (first use in this function)
/tmp/pear/cache/ssh2-0.11.0/ssh2_fopen_wrappers.c:49: error: (Each undeclared identifier is reported only once
/tmp/pear/cache/ssh2-0.11.0/ssh2_fopen_wrappers.c:49: error: for each function it appears in.)
make: *** [ssh2_fopen_wrappers.lo] Error 1
ERROR: `make\' failed

What should i do with this. Hope you can help me. Thanks

Kev van Zonneveld
Kev van Zonneveld·

@ shaunah: I obviously have no insight in your hosting situation. anyway, looks like you want to try the pure php implementation.

@ Stephen: Glad you to get it to work!

@ Fatima: I think you\'d best report this with the authors. You can find their contact data at

http://pecl.php.net/package...

Stephen
Stephen·

@Kevin: I KNOW you\'re not the developer behind the SSH code, but maybe you\'ve experienced this if you use this part of PHP.

What my project entails is taking some information from a database, formatting it very specifically, putting it into a string or file, then shove it over to a series of servers in one particular location. I `sometimes` do not successfully transfer the file in its entirety when using the following code:

[code=\"php\"]
// $UploadToServer is an array of server names created by explode
foreach($UploadToServer as $Server){
$DestFile=\"/tmp/somefile.txt\";
echo \"Transferring to $Server...\";
// Force a cache flush
ob_flush();
flush();

$con=ssh2_connect($Server,22);
ssh2_auth_password($con,\"user\",\"password\");
ssh2_scp_send($con,\"cache/somefile.txt\",\"$DestFile\") or die(\"Could not transfer to $Server - Operation aborted.\");

// Force a cache flush again
echo \"OK.\\n\";
ob_flush();
flush();
}
[/code]

The file that is to be transferred is about 40k in size. However, what gets to the server is about 16k in size. I\'ve found this to be an extremely random event. I\'m also seeing that this code is sent successfully, however, the file sizes are a serious mismatch.

The other thing I\'m seeing is on a failed transmit, the recipients /var/log/secure log shows this:

[code=\"text\"]
Jul 1 01:57:18 hsNavYyzComm2 sshd[29549]: Accepted password for foms from ::ffff:10.12.5.71 port 59937 ssh2
Jul 1 01:57:18 hsNavYyzComm2 sshd[29551]: Disconnecting: Corrupted MAC on input.
[/code]

Whats interesting is that I get a few KB of data TO the recipient machine before failure. It may be a streaming issue, I don\'t know.

Now, the thing that I KNOW is working is that if I log into the source machine, I can SCP the file directly to any of those servers and it works every-single-time-without-a-hitch.

Any ideas what I can peek at?

Stephen
Stephen·

It seems through some trials and a lot of swearing, I managed to figure out a method to get the file to the recipient server, but its not relying on the ssh2_scp_send routine.

In place of the ssh_scp_send line, I replaced with the following:
[code=\"php\"]
$sftp=ssh2_sftp($con);
$stream=fopen(\"ssh2.sftp://{$sftp}{$DestFile}\",\"w\");
fwrite($stream,$GeneratedNavb_live);
fclose($stream);
[/code]

That got the files to their destination.

How I found this was from one resource on two pages:

http://ca2.php.net/manual/e...
http://ca2.php.net/manual/e...

Since I had already established a successful link with the recipient server, all I had to do was open an SFTP session, write the file out (Binary safe), and everything worked as expected. No cut offs, although I am hammering the machines just to make sure this works.

Kev van Zonneveld
Kev van Zonneveld·

@ Stephen: OK Stephen, I\'m glad you got it working man. And thanks for sharing.

Santosh
Santosh·

php ssh1.php
okay: logged in...

\"NO OUTPUT\"

Kev van Zonneveld
Kev van Zonneveld·

@ Santosh: Please provide me with more details. This is impossible to debug for me, please understand.

Charlie
Charlie·

When executing ssh_exec() with stream_set_blocking false, I get this:
Warning: ssh2_exec(): Unable to request a channel from remote host in /script.php line 111

If set blocking to true, it works... what gives? Does it work fine for you?

Also, I\'m using the latest releases... thanks for any response. Great post btw.

Charlie
Charlie·

Should also mention this occurs on the 2nd ssh_exec() call. The first works fine.

Kev van Zonneveld
Kev van Zonneveld·

@ Charlie: No sorry I have never seen that. Do you really need blocking = false?

Also, I think the auth.log on the remote side may show you a clue as to why a channel could not be made. If not, try having ssh log debug messages and try & review logs again.

Llorca
Llorca·

This is fantastic. I\'m building this out into a PHP class for use on an automation project. I\'ll link back to this post for proper recognition :)

Thanks for sharing this, its awesomely useful

Eugene van der Merwe
Eugene van der Merwe·

#210. Fatima, if you get error LIBSSH2_ERROR_EAGAIN use the latest version of libssh2 (I used libssh2-1.1.tar.gz). Kevin refers to an old version here.

Eugene van der Merwe
Eugene van der Merwe·

#217. Charlie,

I have the same problem as you. What I am trying to achieve is make one connection but send multiple commands. The first command works, but on second try I also get \"Unable to request a channel from remote host.\".

Googling this didn\'t produce much results, except someone who insinuates this does not happen in libssh 0.13 (see http://www.mail-archive.com....

So I suppose my question is, how to I open one connection and run multiple commands without getting any errors? :-)

Brian
Brian·

Hello,

Im having some issues with outputting the results of the command, sometimes it works, other times it doesnt.

I cannot return the output for something as simple as \'pwd\', other times it will return the output of /etc/init.d/mysqld status, other times it wont.

The command seems to complete because i can do something like:

cat /etc/php.ini >> test.txt

sure enough the file is there, but if i tried to cat a small file with 1 word in it, no output.

i thought maybe it was the length on fopen, increasing it didnt make a difference,

oddly sometimes I can output the status of httpd or mysql, then other times it just wont do it..

any ideas?

1oBuZ
1oBuZ·

I have got the same problem wehn u will find a solution please tell here :)

Kev van Zonneveld
Kev van Zonneveld·

@ Eugene van der Merwe & Brian & 1oBuZ: If using a different version doesn\'t work, you could try using a different method: Try switching from blocking <> nonblocking. Or try using a shell instead of execute. If that doesn\'t help start working with sleep and see if the problem is caused by buffers being too lazy, finally if it\'s a couple of commands you could try to concatenate them with the \';\' sign or the \'&&\' signs (in case you want to build a chain: if one fails, all following fail as well). This can actually save you some exectuion time as well.

@ Llorca: Be sure to check out:
http://www.seoegghead.com/s...

Reinard
Reinard·

If you are having problems sending multiple commands you\'re likely forgetting to close the stream inbetween sending individual commands.

Try doing an fclose() on the stream resource between the ssh2_exec() calls.

Kev van Zonneveld
Kev van Zonneveld·

@ Reinard: Thanks for sharing!

Derak
Derak·

I am having trouble with this.

I am running php entropy (php5-5.2.5-6-beta) on Mac OSX Serve 10.5.8. And I successfully installed libssh2-1.1 and did a pecl -f ssh2 successfully.
I go through all the steps without problem, but ssh2 is never activated. ssh2.so gets created and put into \"/usr/lib/php/extensions/no-debug-non-zts-20060613/\"

and my php.ini file has:
extension_dir = \"/usr/lib/php/extensions/no-debug-non-zts-20060613/\"
extensions=ssh2.so

Here is a php_info() page for everything on my server:
http://studentdev.jour.unr....

ssh2 should be showing up in my \"Registered PHP Streams\" section, but it is not.

Any ideas? I feel like I\'ve tried everything here.

Kev van Zonneveld
Kev van Zonneveld·

@ Derak: Do a find on php.ini and try to see if Maybe a different php.ini is used?

Alfredo Rivera
Alfredo Rivera·

I Have tried so many times to install this on a Centos 5 Server, but for some reason it couldnt be installed, I had 2 shell experts working for 4 hours and none of both could successfully install this function, Does anyone hear about this isue?

Llorca
Llorca·

Kevin,

Thanks for the link to the SSH2 Wrapper, that looks like an excellent base for me to start with.

Much appreciated. I\'ve got some minor configuration issues too where PHP is barking about some stuff, but I\'m sure I\'ll get it sorted soon enough.

nathan
nathan·

very nice examples,
haven\'t tried them yet,
but i\'m going to in a sec.

will probably use your tips to create an ssh class.

wonder if it\'ll work on my wamp as well.

thanks for the help in getting me started.

Nathan.

macrocode
macrocode·

2 words: THANK YOU!

nebj00la
nebj00la·

Kevin,

Great article. The code works great against a linux server, but when I try to run it against a router I get the following repetitive output:

return rc = -1
return rc = -1
return rc = -1
return rc = -1
etc. etc.

Please advise,

Thanks,
John

nebj00la
nebj00la·

Kevin,

Here\'s the SSH daemon running on the remote device:

SSH-2.0-RomSShell_4.31

Thanks,
John

Kev van Zonneveld
Kev van Zonneveld·

@ nebj00la: Using shell & many sleeps helped me when talking to routers.

@ nathan: Before writing a class, checkout:
http://www.seoegghead.com/b...
(Jaimie Sirovich already did it)

and
http://pear.php.net/pepr/pe...
A PEAR class in the making

Jafar
Jafar·

Hi, great doc. I have followed the steps. And, I am able to connect but I am not able to send a file. I do not get any error messages either. Any thoughts? I am running, RHent5.4 and Zend Server CE (apache 2.x, php 5.2.6).

Mike
Mike·

I found a great SSH2 client at: http://verticalevolution.co...

It has an easy interface and a good wrapper.

Kev van Zonneveld
Kev van Zonneveld·

@ Jafar: That\'s not enough to go on sorry, I also don\'t run your OS so can\'t test anything. Maybe you have more luck with the pure PHP implementation found here:
http://phpseclib.sourceforg...

Manoj
Manoj·

Thank you for this wonderful documentation! :)

Kev van Zonneveld
Kev van Zonneveld·

@ Manoj: You\'re welcome!

Guest
Guest·

Until the buggy 0.11.0 c code is fixed, I recommend using the Pure PHP implementation. I wont bother posting the link as others already have. (hint: it is called phpseclib at sourceforge)

the PECL ssh2 php ext is full of so many problems, I highly recommend not using it... really. It SEEMs to work for one off trivial remote commands, but as soon as you start using it for a lot of server management and a lot of various types of Commands and reacting on the Output, you will find nightmares.

Most try, as I did, using a command terminator like \'@end@\' or similar. At first this seems to solve the non blocking issues, but again, I saw output where it was returned corrupted when simply altering the LENGTH of the command!

Example:
cat /etc/issue;echo \'@end@\';

Will send me OK output, but if I adjust the command length as follows

cat /etc/issue; echo \'@12321121331_some_length@\';

I get garbage along with the contents of the /etc/issue file...

I got fed up, so now am watching the phpseclib (pure php implementation and using it)

Alfredo Rivera
Alfredo Rivera·

Hello Kevin, I have Been Writing a CodeIgniter Library For The SSH2 Extension and I\'m Encountering some troubles.
[CODE=\"php\"]
<?php

class Ssh2
{

function __construct()
{
$this->ci =& get_instance();
}

function conect($server,$port,$muser,$mpass)
{
if(!($con = ssh2_connect($server,$port))){
echo \"<font color=\'red\'><b>Failure: Unable To Connect</b></font>\";
} else {
// try to authenticate with username root, password secretpassword
if(!ssh2_auth_password($con,$muser,$mpass)) {
echo \"<font color=\'red\'><b>Failure: Unable To Authenticate</b></font>\";
} else {
// allright, we\'re in!
echo \"<font color=\'green\'><b>Success: Logged In, Connected At \".$server.\" With User \".$muser.\" And Password \".$mpass.\"</b></font>\";
}
}
}

function execute($server,$port,$command)
{
$con = ssh2_connect($server,$port);
if(!($stream = ssh2_exec($con,$command)) ){
echo \"<font color=\'red\'><b>Failure: Unable To Execute Command</b></font>\";
} else{
// collect returning data from command
/*stream_set_blocking($stream);*/
$data = \"\";
while( $buf = fread($stream,4096) ){
$data .= $buf;
}
fclose($stream);
}
}

}
[/CODE]

The error I Get Is:
A PHP Error was encountered

Severity: Warning

Message: ssh2_exec() [function.ssh2-exec]: Unable to request a channel from remote host

Filename: libraries/Ssh2.php

Line Number: 30

Failure: Unable To Execute Command

This Have Something To Be With the stream_set_blocking function but no matter how I set it I still get the same error. I\'m working on Ubuntu PHP 5.2 Any Idea?

Kev van Zonneveld
Kev van Zonneveld·

@ Matt Kukowski: I didn\'t like the idea of a pure PHP implementation, but like you god fed up with breakage and am actually quite happy with it : )

@ Alfredo Rivera: Seems like you\'re mixing stream & exec methods.

Alfredo Rivera
Alfredo Rivera·

Any Idea On How To Solve It?

Derak
Derak·

I\'m working with Mac OS X. I can install everything fine with no errors. When I type php -i | grep ssh2 I see ssh2 in my Registered PHP Streams. But with I go to my phpinfo() page in my browser ssh2 does not show up in my Registered PHP Streams. Any ideas?

David
David·

Unfortunately this process no longer works on Ubuntu. \"pecl install -f ssh2\" fails to make. Sounds like a recurring problem over the course of years.

khalid
khalid·

hello

ssh2_auth_password doesn\'t work,

i do this :
PasswordAuthentication yes
and
/etc/init.d/ssh restart

and it works perfect.

thanks

Kev van Zonneveld
Kev van Zonneveld·

@ Derak: May be that you didn\'t enable it in the right php.ini. You may have several.

@ David: Try the pure php implementation, you\'d be surprised how good it works :)

@ khalid: Thanks but the article already mentions that

Jared
Jared·

Awesome page! Just got this working on an 8.04 server, and thought I\'d give you some feedback.

Here\'s all I had to do to get it working
apt-get install php5-dev php5-cli php-pear build-essential libssh2-1
pecl install -f ssh2
edit php.ini
/etc/init.d/apache2 restart
That\'s it!

I couldn\'t find a package named libssl2-php, but that didn\'t seem to matter.
I had previously installed a package named libssh-2 - I\'m not sure if that made any difference.
You need to mention that apache needs to be restarted after modifying the php.ini file.
You might suggest creating a php file with the the first line of your method 1 script to test and see if everything is working.

Kev van Zonneveld
Kev van Zonneveld·

@ Jared: Thanks for sharing!

Kyle
Kyle·

Hey Kevin, great blog, I enjoy reading it. One quick question, I\'m trying to output the data of a simple \"whoami\" execution, but it\'s just blank. All I see is: \"okay: logged in\" and that\'s it. Here\'s my code:

[CODE] <?php
error_reporting(E_ALL);
if (!function_exists(\"ssh2_connect\")) die(\"function ssh2_connect doesn\'t exist\");
// log in at server1.example.com on port 22
if(!($con = ssh2_connect(\"myserver.com\", 22))){
echo \"fail: unable to establish connection\\n\";
} else {
// try to authenticate with username root, password secretpassword
if(!ssh2_auth_password($con, \"username\", \"password\")) {
echo \"fail: unable to authenticate\\n\";
} else {
// allright, we\'re in!
echo \"okay: logged in...\\n\";

// execute a command
if(!($stream = ssh2_exec($con, \"whoami\" )) ){
echo \"fail: unable to execute command\\n\";
} else{
// collect returning data from command
stream_set_blocking( $stream, true );
$data = \"\";
while( $buf = fread($stream,4096) ){
$data .= $buf;
}
echo $data;
fclose($stream);
}
}
}
?> [/CODE]

John
John·

Hi Kevin,

\"Method 1: Execute\" script seems to be working fine for me. But the \"Method 2: Shell\" is not working, meaning when i executed the php script via browser, the browser keeps on loading.

I have a requirement where I wanted to get a file (3.5 GB) from external server. This can be done only via SSH, i.e. using SSH connect the external server via FTP and download the file.

Note: I could not use wget command to download the file, as the file cannot be accessed via URL. So the only options is via FTP.

Please let me know your thoughts.

//John

urdd
urdd·

[code=\"php\"]<?php
include(\'Net/SFTP.php\');
$sftp = new Net_SFTP(\'www.domain.tld\', 22);
$sftp->login(\'user\', \'pass\');
$start = microtime(true);
$sftp->put(\'test\', str_repeat(\'a\', 256 * 1024));
$elapsed = microtime(true) - $start;
echo \"took $elapsed seconds\\r\\n\";

$connection = ssh2_connect(\'www.domain.tld\', 22);
ssh2_auth_password($connection, \'user\', \'pass\');
$sftp = ssh2_sftp($connection);
$start = microtime(true);
$stream = fopen(\"ssh2.sftp://$sftp/home/user/test\", \'w\');
fputs($stream, str_repeat(\'a\', 256 * 1024));
fclose($stream);
$elapsed = microtime(true) - $start;
echo \"took $elapsed seconds\\r\\n\";
?>[/code]
Per that, it looks like phpseclib is faster? Here\'s what I get when running that:

phpseclib: took 4.4995489120483 seconds
libssh2: took 5.706494808197 seconds

That\'s with the mcrypt and gmp extensions, but still... it doesn\'t speak very highly of libssh2 that it\'s bested by a pure-PHP implementation.

Kev van Zonneveld
Kev van Zonneveld·

@ Kyle: You should debug it by adding echo\'s & dumping variables inside the while loop, see what really is the show-stopper.

@ John: You could use the sftp_ functions to download files over ssh. Although it seems that these kind of tasks belong more in CLI scripts than web interfaces. You could schedule them from web interfaces though.

@ urdd: Very interesting indeed. I think I\'d have to agree with your conclusion. The fact is I\'ve personally switched to phpseclib a few months ago, and though it feels incredibly dirty, I must say it\'s been working reliably since. Thanks a lot for sharing this!

bedong
bedong·

It is a great post. I can successfully create a ssh connection within my php code by following your instruction. But when I try to create a web service by using the same code, I got \"fail: unable to establish connection\" error. In other words, if I run the command \"php index.php\" under shell prompt, it works perfectly; but if I request the same file through my Web browser (http://mydomain/index.php), I got an unable to connect error. Do you have any idea about that. Thanks a lot for your help.

Kev van Zonneveld
Kev van Zonneveld·

@ bedong: Could be differences between your php.inis or your server preventing you to open specific ports.

You could try the native php implementation to determine what\'s wrong.

Brian Ellis
Brian Ellis·

I\'m successfully using this to connect to a remote server via SSH. It runs a ssh_exec ok, but the stream that I get back appears to be encrypted somehow.

$stream = ssh2_exec($connection, \'/usr/bin/uptime\', \'vt100\');
if ($stream == FALSE)
{
$message = \"ERROR: Cannot execute remote command.\";
return(FALSE);
}

$message = stream_get_line($stream, 1024);

I get back something that looks like this:

Message is �( �(�Prr^H��<MA�k�l��rr^��M<�n�8��rr^� �Rc�lE��<RA�k���rr^�x�<RA�k�l�rr^���R<�k�P�Z�k�P�~�k�P���k�P���k�PMessage is �( �(�PH�V�]�ݐRLą��ߟ�6���߉G��F������q�7z�u���l�z�v\"8�>��E8N-�@ ]�W݄G�Qd�J�m���\'����<;�CQ}��*����(*�1�(��A�F�y��?�`�38�=�p��vy��� 9ːD��&y|���t9����������]�

Kev van Zonneveld
Kev van Zonneveld·

@ Brian Ellis: Have you tried playing around with the options a bit? e.g.: vt100?
Also, why are you only getting the first 1024 bytes?

kmasiak
kmasiak·

very nice sample codes, works perfectely on linux.

but doesnt do the thing on netscreen - you know the junipier routers.

It connects perfectely, but command exec doesnt work... this difficulity may be provided by netscreen\'s shell... cant get *any* ssh lib to execute command.

i\'ve just found one way to send command to this os by sharpssh (C# .net library).

however it would be pretty nice if somebody found any solution fetching shell_exec result from netscreen box, pls msg me. for now, it simply loops the page and nothing happens till timeout - no php errors even.

cheers.

Kev van Zonneveld
Kev van Zonneveld·

@ kmasiak: You need the shell method for most routers as I explain in the article.

kmasiak
kmasiak·

@Kevin

I\'ve tried it before, but with no luck. It looped the page, with simple command with just a little characters of result.

But after your point i gave it a closer look, i\'ve erased the while() {} and did just a simple test like:

$buf = fread($shell,8096); and now it reads me all the output i need. I\'m just curious why it makes infinite loop for me.

Thanks!

Kev van Zonneveld
Kev van Zonneveld·

@ kmasiak: If you pastebin the full code we may be able to establish why. Or not. But glad it works anyway now :)

hi1278
hi1278·

Hi Kevin,

Thanks for the detailed steps. I am facing an issue in the installation. \"pecl install -f ssh2\" failed with the following make error. ( I am running this in Debian). All the previous steps went fine. I would really appreciate
any help.

/tmp/pear/download/ssh2-0.11.0/ssh2_fopen_wrappers.c: In function \'php_ssh2_channel_stream_read\':
/tmp/pear/download/ssh2-0.11.0/ssh2_fopen_wrappers.c:49: error: \'LIBSSH2_ERROR_EAGAIN\' undeclared (first use in this function)
/tmp/pear/download/ssh2-0.11.0/ssh2_fopen_wrappers.c:49: error: (Each undeclared identifier is reported only once
/tmp/pear/download/ssh2-0.11.0/ssh2_fopen_wrappers.c:49: error: for each function it appears in.)
make: *** [ssh2_fopen_wrappers.lo] Error 1
ERROR: `make\' failed

jjzd2w
jjzd2w·

Coleages :
in tried briged to web app using ssh2 lib an ifound a library write in pure php implent a ssh2 conector \" phpseclib\" well in tried unsing with the brigdge in ssh2.so but not works the phpseclib works fine
Good luck!

Asim Zeeshan
Asim Zeeshan·

[b]Thanks a lot mate! you are a life saver[/b]. I will be blogging about this article very soon :)

Thanks once again

BuNker
BuNker·

hey, im probleme...

http://pastebin.com/uj0bj0wE

Kev van Zonneveld
Kev van Zonneveld·

@ hi1278 & BuNker: If you have apt, try to not to compile. Otherwise try a different version of libssh.
If all else fails: move to phpseclib, I personally think it\'s pretty good.

BuNker
BuNker·

hey, fix it! complited make configure.

cvs fix(path) \"ssh2_fopen_wrappers.c\" file, \"ssh2-0.11.0.tgz\"

http://cvs.php.net/viewvc.c...

If this is done

[code]phpize && ./configure --with-ssh2 && make[/code]

martin
martin·

thanx alot man....your tutorial works great.
but in my case,there\'s several adjustment.
here\'s my version:

-i use the latest version of libssh2 to works with command pecl install -f ssh2 (didnt work well with libssh2 0.14)
-dont forget to install openssl-dev

Christina
Christina·

I am so new with this stuff but I need some help! I am okay until I get to \"Great! PHP supports SSH - time to code\"
Am i sopose to create a new php file? or is this something I write in terminal? Im sorry if that is a dumb question but I really need to figure out a solution for this because I cant update my wordpress...

Kev van Zonneveld
Kev van Zonneveld·

@ BuNker: Ok thanks for sharing!

Kev van Zonneveld
Kev van Zonneveld·

@ Christina: You should probably go to a wordpress forum. You don\'t need php-ssh stuff to just upgrade wordpress.

Rick
Rick·

I try to connect with this...
the 192.168.1.13 is alive and open for ssh

<?php
$con = ssh2_connect(\"192.168.1.13\",22)
//echo $con;
?>

but i got this :
[Fri May 07 04:41:42 2010] [error] [client 192.168.1.3] PHP Warning: ssh2_connect(): Unable to connect to 192.168.1.13 in /var/www/html/test.php on line 2

anybody can help me ?
thx a lot

Christina
Christina·

@kevin Every time I try to upgrade wordpress it doesn\'t give me the option to select sftp to update wordpress is just gives FTP FTPS (SSL) connection type. I havent been able to update...

Kev van Zonneveld
Kev van Zonneveld·

@ Rick: Not enough data to debug anything, sorry.

@ Christina: Wow, you\'re really lost here :) Try a wordpress support forum or something. I have nothing to do with that software.

Rick
Rick·

@ Rick: Not enough data to debug anything, sorry.
=============
Kevin,
What datas do you need?

if

i use shell :
==================
[root@localhost html]# php ssh2.php
PHP Warning: Module \'ssh2\' already loaded in Unknown on line 0
okay: logged in...ntotal 2768
==================

it works....
confuse me.....

Thanks for the reply...
=====

rachael
rachael·

This is a great piece of writing!! totally worked for my wp install. You\'re a legend!

Rick
Rick·

i saw this when i tried to run the script above..

Anyone know how to change this ?
======
May 25 15:16:49 localhost setroubleshoot: SELinux is preventing the http daemon from connecting to network port 22 For complete SELinux messages. run sealert -l 6f69fd46-929a-439a-b8de-13129b92496f

Rob
Rob·

Great article - really is and it\'s referenced all over the web; however I don\'t use Apache, I use nginx instead so want to get some form of confirmation that using the above would work exactly the same for me since I\'m relatively new to unmanaged VPS solutions.

Cheers!

Kev van Zonneveld
Kev van Zonneveld·

@ Rick: Try SELinux related forums, or a distro that comes without SELinux.

@ Rob: Nginx probably uses php-cgi, so it could be a different ini file to load the ssh2.so. Otherwise: no difference

Josh
Josh·

When I type
[CODE=\"text\"]
pecl install -f ssh2
[/CODE]
I get the error...
[CODE=\"text\"]
/usr/include/php5/Zend/zend_API.h:360: note: expected ‘char *’ but argument is of type ‘const char *’
make: *** [ssh2.lo] Error 1
ERROR: `make\' failed
[/CODE]
I saw that there is a patch for this error but it did not seem to work. I did notice that there is a difference between my error and the example error. Mine says ...
[CODE=\"text\"]
/usr/include/php5/Zend/zend_API.h:360...
[/CODE]
While the example says...
[CODE=\"text\"]
/usr/include/php5/Zend/zend_API.h:361...
[/CODE]
Would that make a difference?

Rutvij Clerk
Rutvij Clerk·

Hi Kevin,

I am using the execute method code to connect to a mysql server after I login using ssh. It works perfectly except for a slight glitch. After I ssh into the server, I want to use the mysql client to issue a couple of commands. Here in this example only one command is executed. How do i execute multiple commands? I am fairly new to PHP.

Kev van Zonneveld
Kev van Zonneveld·

@ Josh: Try patching the file by hand, or obtaining a version that\'s compatible with the patch.

@ Rutvij Clerk: You could use the shell method to interact with a shell, or execute multiple mysql commands like: mysq --defaults-file=/etc/mysql/debian.cfn -e \'use db; select * from xyz;\'

Abdullah
Abdullah·

Shell method is not working for me.
when i press the connect button, the page just keeps on looking for localhost.
but when i use execute method the command executes perfectly.

Debbie D
Debbie D·

What if the server has FTP OFF by defualt, will this method still work to upgrade WP??

andi
andi·

ist works fine for me!
thank your for your instruction.
best references on the internet! great

best regards from germany
andi

chakan
chakan·

It\'s work for me too.
Thank you :)

Harleyquine
Harleyquine·

I was scouring the web looking for the right way to get SFTP working with my PHP and it just wasn\'t working.. till I found this. Thanks very much :)

Kev van Zonneveld
Kev van Zonneveld·

@ Abdullah: Can\'t debug without actual code & output.

@ andi, chakan, Harleyquine: Thanks : )

@ Debbie D: Don\'t know about Wordpress. But you can use this method to connect to SSH without FTP enabled.

dusinnhht
dusinnhht·

Hi everybody!
I\'m pretty new to linux(debian) and php, but somehow i managed to create the ssh2.so file. I copied that file into all php extension dirs, to make sure php finds it(i tried several locations, they didn\'t work).
If I create an index.php file and put
[CODE=\"php\"]
<?php
if (!function_exists(\"ssh2_connect\")){
print \"function ssh2_connect doesn\'t exist\";
}else{
print \"function ssh2_connect exist\";
}
?>
[/CODE]
in it and I open it from a browser, then i get
function ssh2_connect exist.
I got the same answers with the ssh2_auth_password and the ssh2_auth_nun functions, but if I try to use the ssh2_auth_password, the script doesn\'t run.
Now I\'m confused, becouse I have 3 php.ini-s. I edited the one located in /etc/php5/apache2 , added \"extension=ssh2.so\" and added to the one that you recommended (that one had already that line), and tried to turn the error messages on by deleting \";\" in the line Developer Value=on, but it didn\'t show any errors.
(I restarted apache2 and ssh2 by each trying.)
I edited the /etc/ssh/sshd_config file and uncommented the PasswordAuthentication yes line, but it didn\'t helped either.

So I decidet to give up, and try luck with phpseclib.
I downloaded the \"package\", untgz-d it and copied everything to php extensions dir, but no luck with that either; the example script runs, but I got nothing back.

dusinnhht
dusinnhht·

OK It\'s working!
Today i got 25 updates installed, and now ssh2\'s working!
So thanks for the tutorial! :)

Sam
Sam·

Hi,
I\'ve tried this code with the patch, but each time when I execute it says \"function ssh2_connect doesn\'t exist\". I\'ve used the patch provided and the patching went successful. But couldn\'t connect to ssh. I have also tried both shell and execute methods. Earlier I used to connect to unix server through PHPTelnet, but my school admin removed access using PHPTelnet, so I need to rely on ssh.
Any inputs?

Kev van Zonneveld
Kev van Zonneveld·

@ Sam: telnet is a bad idea. unless you want your server hacked real bad : )

did you include the so file in your php.ini??

John
John·

Hmm, what to do when avrything is ok with connection, commands executing one time on 10 times?. one time on refresh command execute and next 5 time refresh dont?.

Kev van Zonneveld
Kev van Zonneveld·

John: Sorry, you need to provide way more details for us to be able to help you.

noname
noname·

phpseclib is a good alternative

Reiko
Reiko·

Would anybody happen to know how to send Control Characters?

For example, say I wanted to run screen from PHP, how would I successfully emulate a Ctrl+A > D press? I've tried quite a few methods, such as sending chr(1) or ^A, each time the foreground process just shrugs at me.

Any suggestions would be awesome.

VirtualMachine
VirtualMachine·

Hi,

i tried your example script for the Shell Method but after the okay: logged in... method nothing is happening anymore
Even with the timeout script i didnt get anything back. And no bugs in the logfiles
any idea ?

John Aristizabal
John Aristizabal·

Excellent! This single article helped me so much, I'm doing an IPTV app that stores the media data on a cloud computing server (Eucalyptus in Ubuntu) and finally I can execute the cloud commands through the video server. I will put you in the credits of my undergraduate project. tyvm.

Mike Stewart
Mike Stewart·

Thanks, these instructions are the only ones I've found that will actually set up php/ssh2 without hassle.

Antonio Carlos
Antonio Carlos·

I’m using version libssh2-1.2.7 but am having to run the script error
by apache. PHP works fine.
Error menssage:
——————————————-
[Thu Nov 04 15:03:43 2010] [error] [client 9.18.218.31] PHP Warning: ssh2_connect() [function.ssh2-connect]: Unable to connect to 9.18.218.20 on port 22 in /var/www/html/teste_ssh01.php on line 11
[Thu Nov 04 15:03:43 2010] [error] [client 9.18.218.31] PHP Warning: ssh2_connect() [function.ssh2-connect]: Unable to connect to 9.18.218.20 in /var/www/html/teste_ssh01.php on line 11
——————————————-
Script:
<?php
//Tecmaster
$server = '9.18.218.10';
$user = 'root';
$pass = 'pass';
if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");
if(!($con = ssh2_connect($server, 22))){
echo "fail: unable to establish connection\n";
}
else {
if(!ssh2_auth_password($con, $user, $pass)) {
echo "fail: unable to authenticate\n";
} else {
// allright, we're in!
echo "okay: logged in…\n";
// execute a command
if (!($stream = ssh2_exec($con, "df -h" ))) {
echo "fail: unable to execute command\n";
} else {
// collect returning data from command
stream_set_blocking($stream, true);
$data = "";
while ($buf = fread($stream,4096)) {
$data .= $buf."”;
echo $buf.”";
}
fclose($stream);
}
}
}
?>

yasg
yasg·

Thanks Kevin, this only the article that helped me so much, but i'm stuck with the execution process.
I'm trying to execute some commands on a server through the router .
which means i have a router ip address and i'm gonna execute a command on for example "power on" server3 through this router .
i'v tried the example with Shell method but its still doesn't work .
it connect successfully
okay: logged in...

but it doesn't execute the command

this what i test :
[CODE="php"]
stream_set_blocking($shell, true);
// send a command
fwrite($shell, "clp\n");
fwrite($shell, "start server3\n");
[/CODE]
and the buffer output is :
[20l eSH> clpstart server3

could you help me plz

Kev van Zonneveld
Kev van Zonneveld·

Antonio Carlos: What if you try the version that the article uses?

yasg: You probably need a "\\n" to execute the commands

yasg
yasg·

@Kevin
I wrote it using the new line "\n"
but the backslash here doesn't appear after the submission
fwrite($shell, "clp\n");
fwrite($shell, "start server3\n");
also I've tried
fwrite($shell, "clp".'\n');
fwrite($shell, "start server3".'\n');

but still doesn't exe.

yasg
yasg·

@Kevin
I wrote it using the new line ""\n"
but the backslash here doesn't appear after the submission
fwrite($shell, "clp"\n");
fwrite($shell, "start server3"\n");
... [more] also I've tried
fwrite($shell, "clp".'"\n');
fwrite($shell, "start server3".'"\n');

but still doesn't exe.

Kev van Zonneveld
Kev van Zonneveld·

@ yasg: Judging from your output it really seems to ignore any kind of newline though. Maybe this system needs "\\r\\n" or something..
Also try if it helps to put a sleep between commands. Some crappy routers do a bad job at buffering & blocking and need to be handled with extreme care.
Otherwise you seem to be doing it right.

yasg
yasg·

@Kevin
thanks Kevin , yes it works now ^_^
thank u thank u a lot

deepthi
deepthi·

hey...could give steps to follow to configure PHP with SSH on fedora, but NOT WITH YUM...coz i dont hv net connection to my fedora

deepthi
deepthi·

i installed LIBSSH and SSH from PECL: PHP also copies ssh.so to /usr/local/lib/php and also changed php.ini ....but i still get this error
PHP Warning: PHP Startup: Unable to load dynamic library './ssh2.so' - ./ssh2.so: cannot open shared object file: No such file or directory in Unknown on line 0

edubidu
edubidu·

Hi,

Great this howto! Just the wget for libssh2 has changed:
wget http://www.libssh2.org/down...

Marcin
Marcin·

hey, i have a problem in my site...
log: PHP Warning: Module 'ssh2' already loaded in Unknown on line 0

could you help me?
thanks ;)

Gerardo H.
Gerardo H.·

I installed the xampp web server package on an ubuntu(Hardy) machine and this is what I did to solve the:
'function ssh2_connect doesn't exist' error.

1- Followed each step on this great How-to. When running the command 'pecl install -f ssh2' took note of the path where the ssh2.so file was installed.

2-Modified the php.ini file on the path (/opt/lampp/etc) and added the following line: extension=ssh2.so

3- Restarted the apache service using the following commands:

sudo /opt/lampp/lampp stopapache
sudo /opt/lampp/lampp startapache

This restarted apache, and when it was starting again, it shown an error trying to find the ssh2.so file. Took note on the path it was looking for.

3-copied the ssh2.so file from the path where it was installed (in my case /usr/lib/php5/20060613+lfs/) to the path where the apache was trying to find it in the previous step.

4- restarted apache.

And it worked !!!

Regards

tony
tony·

I have done everything you suggest and it appears to work. I appear to be logging i to the server ok. Using the shell script above I get a reply from the server telling me my last login date and time, but no commands are executed:
"Last login: Sat Jan 22 18:54:34 2011 from cpe-139-168-211-92.lns1.way... This account is restricted by rssh. Allowed commands: scp sftp rsync If you believe this is in error, please contact your system administrator. "
I can access the server with a terminal sftp command without problems. Any suggestions please?
Thanks
Tony

tony
tony·

With reference to my last post (#314) I have also tried the method using stderr given in the php documentation. The output stream is empty and stderr contains the text "This account is restricted by rssh....", as before. I've now spent about 15hrs on this and would really like some inspiration.
Thanks
Tony

tony
tony·

OK. Forget my previous posts. Installed phpseclib and got it going first time.
Tony

Kev van Zonneveld
Kev van Zonneveld·

@ tony: Looks like your account is restricted by rssh. Try the same code against a different server / account.

Echo
Echo·

Warning: ssh2_connect() [function.ssh2-connect]: Error starting up SSH connection(-1): Failed sending banner in /var/www/get.php on line 17

Warning: ssh2_connect() [function.ssh2-connect]: Unable to connect to 192.168.7.7 in /var/www/get.php on line 17
fail: unable to establish connection

i used the first code example in this article.

Thank you!

Alberto
Alberto·

I have the same problem of Echo

netadmin
netadmin·

Work perfectly for me thanks!

Beshoy
Beshoy·

Thank you!

Nelson
Nelson·

Problems here...

WARNING: failed to download pecl.php.net/ssh2 within preferred state "stable", will instead download version 0.11.2, stability "beta"
downloading ssh2-0.11.2.tgz ...
Starting to download ssh2-0.11.2.tgz (22,740 bytes)
........done: 22,740 bytes
5 source files, building
running: phpize
sh: phpize: not found
ERROR: `phpize' failed

Nelson
Nelson·

New error

Starting XAMPP for Linux 1.7.1...
PHP Warning: PHP Startup: ssh2: Unable to initialize module
Module compiled with module API=20090626, debug=0, thread-safety=0
PHP compiled with module API=20060613, debug=0, thread-safety=0
These options need to match
in Unknown on line 0

Kev van Zonneveld
Kev van Zonneveld·

@ Echo & Alberto: Seems like the connection ca't be established. Check if you can connect manually.

@ Nelson: You have faulty stack. You need pear & php-dev successfully installed before trying anything with the ssh2 module

knuthmorris
knuthmorris·

phpseclib so totally owns libssh2 it's not even funny. urdd posted some benchmarks over a year ago that demonstrated this but in the time since urdd's post phpseclib's increased the margin even more significantly:

http://core.trac.wordpress....
http://core.trac.wordpress....

If you're not using phpseclib then you're making a big mistake.

Amir
Amir·

Thanks Much !

Patrick
Patrick·

Thanks for this KVZ,
My question is how can ensure that the my output appears like below in my interface
-rw-r--r-- 1 root root 813K Sep 6 2010 idle.txt
-rw-r--r-- 1 root root 184M Jul 29 18:06 ips.txt

keeping the formatting in my interface rather than having it in one long string.

Rain
Rain·

Hello, I have used ssh2_scp_recv to receive file. but if the password is incorrect, it seems cost too much time for waiting response. is there any solutions? Thanks.

Moeller
Moeller·

Thx. That FAQ is Great and very helpfull.
greetings from Germany

kurokysan
kurokysan·

This is the error i get:

function ssh2_connect doesn't exist

ahmed
ahmed·

hello ,

the Method 1: Execute code worked for me like a charm , but i have an important question

it did not excute a command it just said okay: logged in... , Even when i tried it with root .

the Most important thing for me , when it login it did Not display the last login date and time like usual in terminal applications . and i really want to display that output because i included some important data within it .

Luis
Luis·

Hi Kevin,

Thank you for all your help , it has been a key to solve the problem that I am trying to solve. However, I have a question : I have tried to run the scripts you have above because I want to connect to a router terminal from a remote client and activate a spectral scan in order to know what are the busiest channel.

The problem is that I havent could to get the results of the CLI, it seems that it is running, and I tested the connection also. Do you know if it something related to the router terminal? or it should run fine no matter what kind of terminal Im using.

If you have any answers, I will appreciate it.

Thanks,

Luis

Ankit
Ankit·

Hi Kevin,

A very informative article indeed..great work. I'm trying to use this library to start a 'netconf' subsystem. But looks like, can't start any subsystem other than sftp. Any ideas?

Regards
Ankit

finnq
finnq·

Oh, a very very good article I like it. But it shows me only the connection were broken. There's no php error or other...

What should I do?

aneeq
aneeq·

Hi, I have found an excellent solution which is as below.

<?php
$server = “ftp.you-server.com”; //address of ftp server (leave out ftp://)
$ftp_user_name = “userName”; // Username
$ftp_user_pass = “passwordHere”; // Password
$source = “/home/folder/public_html/filename.ext”;
$dest = “/public_html/filename.ext”;
$mode=”FTP_BINARY”;
$connection = ftp_connect($server);

$login = ftp_login($connection, $ftp_user_name, $ftp_user_pass);

if (!$connection || !$login) { die(‘Connection attempt failed!’); }

$upload = ftp_put($connection, $dest, $source, FTP_BINARY);

if (!$upload) { echo ‘FTP upload failed!’; }

ftp_close($connection);
echo “done”;
?>

Source:
<a href="http://phphelp.co/2012/04/0...">http://phphelp.co/2012/04/0...

<a href="http://addr.pk/af97">http://addr.pk/af97</a>

ilan
ilan·

hi,
i did all the tutorial step by step and i got this error:
function ssh2_connect doesn't exist

i think i didn't do this part as you said:

Now you need to make sure our new ssh2.so module is loaded by PHP. Edit a php.ini file (I'd recommend a separate one: /etc/php5/conf.d/ssh2.ini). Make sure it reads:

extension=ssh2.so

i did it like this:

/usr/local/lib/php.ini
i add this line:
...
;extension=php_soap.dll
;extension=php_sockets.dll
;extension=php_sqlite.dll
;extension=php_sybase_ct.dll
;extension=php_tidy.dll
;extension=php_xmlrpc.dll
;extension=php_xsl.dll
;extension=php_zip.dll
;extension=ssh2.so
extension=ssh2.so
....

please help me

Akshay Behera
Akshay Behera·

Hi,
I m able to login using ssh2_connect but while executing a command it fails.

$stream = ssh2_exec($con, "mml") not working.

What should I do ?

How can I throw multiple commands ?

Jimmy
Jimmy·

Kevin, great job!.. Very helpful article.
I was getting function ssh2_connect doesn't exist even though I had gotten "ssh2" on

php -m |grep ssh2

It turned out my PHP installation was still missing some packages (I am using Debian 6.0 on SPARC). I solved it by running:

apt-get install php5-dev

This installed and updated a number of libraries in my PHP stack. Now your PHP script goes past the first line.

Great job and thanks for sharing!

zanzo
zanzo·

Thanks Kevin,
my problem was the 'PasswordAuthentication' set to No in the sshd_config.

comment
comment·

Libshh has moved its files from sourceforge
http://www.libssh2.org/down...

JeffQuer
JeffQuer·

Thanks, Kevin. You saved a 5 day trouble for me.

Cosmin
Cosmin·

How to command action url ?

example 127.0.0.1/test.php?shell=reboot

reply me. thanks you