Re: lib ssh2 functions and ssh2_exec stream reading work around

From: Date: Mon, 16 May 2005 02:14:09 +0000
Subject: Re: lib ssh2 functions and ssh2_exec stream reading work around
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-215297@lists.php.net to get a copy of this message
I ran in to many ssh2 stream problems as well. Problem 1. One problem I think related to the openssl version I was using. I was using the standard version with Fedora Core 3. ssh connected actions sometimes worked and sometimes did not work. I recompiled the ssh2.so with the following versions. libssh2-0.8 openssl-0.9.7g ssh2-0.7 Problem 2. At this point file transfers worked great. However, running commands and reading the stream was having problems. Using the classic <? | while (!feof($ssh_stream)) { $contents .= fread($||ssh_stream||, 5120); } ?> I found that I never got any responses. After testing I found that my $||ssh_stream always had a true response to feof($||ssh_stream||)|; And that fread($ssh_stream,5120) did not always bring back data. While the following is not a Correction to the problem, it does allow you to read the incoming stream and know when it is done computing. This is the function I use which is in side a remoteConnection class I have wrapping the different ssh2 functions. If somebody comes up with a "CORRECTIOIN" to the problem rather than a work around, I would surely appreciate it. Here is my work around with comments. Hope it helps. <? function command ($command) {
            // attach "echo '__end_cmd_response__';" to the end of any command run.
            // this will be the last thing in the streams output so I can identify when my command
            // has finished.
           $stream = ssh2_exec($this->conn, $command ."\necho '__end_cmd_response__';" );
           if ($stream) {
               // not fully sure why I do this. but it does not seem to hurt. The stream has no data
               // right away.
               sleep(5);
               // turning blocking off allows stream to keep moving eventhough no data is coming
               // through it. Required to make the time out work correctly.
               socket_set_blocking($stream,false);                       // the time out is set less than the php time out. Otherwise you run the risk of the
               // php timing out if the stream hangs.
               stream_set_timeout($stream,25);
               $start = mktime();
               // manual indicator to exit the while
               $exit = false;
               while ($exit == false) {
                   $read .= fread($stream,5120);
                    // this pulls meta data from the stram so we can test for the time out.
                   $info = stream_get_meta_data($stream);
                    // test for the echo'ed __end_cmd_response__
                   if (ereg("__end_cmd_response__",$read)) {
                       $exit = true;
                       break;
                   // check to see if the stream has timed out.
                   } elseif ($info["timed_out"]) {
                        // i just add this to tell the user that the stream timed out.
                       $read .= "<i>Exited stream reading (25 seconds). Check changes online.</i>\n";
                       $exit = true;
                       break;
                   }
               }
               fclose($stream);
               return $read;
} ?> Oscar Gosdinski wrote:
Hello everybody: I need my PHP application connects through SSH to other server for getting some info to display and i tried the following code to test lib ssh2: $server = ...; $user = ...; $passwd = ...; $con = ssh2_connect($server, 22); if (ssh2_auth_password($con, $user, $passwd)) {
      $s = ssh2_exec($con, 'ls -l');
      $file = fopen("/tmp/test", "w");
      while ($line = stream_get_line($s, 1024)) {
              fwrite($file, $line);
              fflush($file);
      }
      fclose($file);
} else {
      echo "Authentication Error";
} The file /tmp/test was created but it does not have any data. I can connect to the server using a normal ssh session in my laptop and the 'ls -l' command returns me information. I think that i installed correctly the ssh2 functions because if a put an incorrect password i get the "Authentication Error" message. I searched the web for info about similar problems and no results. Please, anyone can help me with this problem because i have been spending three days with this. Thanks in advance for your answers.


« previous php.general (#215297) next »