phpseclib - attempting to connect to an HP procurve switch returns error: SSH command execution is not supported

StackOverflow https://stackoverflow.com/questions/12115252

  •  28-06-2021
  •  | 
  •  

Question

i'm trying to use phpseclib's NET_SSH2 library to connect to an HP switch. just to test / get started, i'm trying to log on, and then run a 'show interfaces brief' command on the switch. But after it logs me on, i get an error message :

 SSH command execution is not supported. 

here's the code:

<?php
set_include_path(get_include_path() . PATH_SEPARATOR . '../phpseclib');
include('Net/SSH2.php');
define('NET_SSH2_LOGGING', true); //turn on logging.

$ssh = new Net_SSH2('10.10.10.10'); //starting the ssh connection to localhost
if (!$ssh->login('', 'password')) { //if you can't log on...
  exit('Login Failed');
}
else  {
echo 'logged in<br>';
}
echo 'Attempting command: <br>';
$output = $ssh->exec('show interfaces brief');    
echo $output.'<br>';
echo 'Error message is: <br>';
$log = $ssh->getLog(NET_SSH2_LOG_COMPLEX);
foreach ($log as $logitem)  {
echo $logitem.'<br>';
}
?>

The output that this returns is:

 logged in
 Attempting command:

 Notice: Connection closed prematurely in /var/www/phpseclib/Net/SSH2.php on line 1941
 SSH command execution is not supported.
 Error message is:
 <-
 ->
 <- NET_SSH2_MSG_KEXINIT (0.0015s)
 -> NET_SSH2_MSG_KEXINIT (0s)
 -> NET_SSH2_MSG_KEXDH_INIT (0s)
 <- NET_SSH2_MSG_KEXDH_REPLY (0.5123s)
 -> NET_SSH2_MSG_NEWKEYS (0s)
 <- NET_SSH2_MSG_NEWKEYS (0s)
 -> NET_SSH2_MSG_SERVICE_REQUEST (0s)
 <- NET_SSH2_MSG_SERVICE_ACCEPT (0.1962s)
 -> NET_SSH2_MSG_USERAUTH_REQUEST (0.0001s)
 <- NET_SSH2_MSG_USERAUTH_BANNER (0.0014s)
 <- NET_SSH2_MSG_USERAUTH_SUCCESS (0.0392s)
 -> NET_SSH2_MSG_CHANNEL_OPEN (0s)
 <- NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION (0.0204s)
 -> NET_SSH2_MSG_CHANNEL_REQUEST (0s)
 <- NET_SSH2_MSG_CHANNEL_SUCCESS (0.1011s)
 <- NET_SSH2_MSG_CHANNEL_DATA (0s)
 -> NET_SSH2_MSG_CHANNEL_DATA (0s)
 <- NET_SSH2_MSG_CHANNEL_EOF (0s)
 <- NET_SSH2_MSG_CHANNEL_REQUEST (0s)
 <- NET_SSH2_MSG_CHANNEL_CLOSE (0s)

 Notice: Connection closed prematurely in /var/www/phpseclib/Net/SSH2.php on line 1941

Line 1941 in ssh2.php is the "user_error" line you see below:

 function _send_binary_packet($data)
{
    if (feof($this->fsock)) {
        user_error('Connection closed prematurely', E_USER_NOTICE);
        return false;
    }

What I've done so far:

  1. I've logged in manually via ssh and made sure that I can run the same command.
  2. i've gone through the switch's web config page to make sure there's nothing else I need to turn on etc. for ssh.
  3. I've been checking phpseclib's forums for any similar issues.

I'm using version 1.53 2010/10/24 01:24:30 of the phpseclib.

Any help would be appreciated. Thanks.

Was it helpful?

Solution

You aren't able to use the exec command on HP Procurve Switches. You have to emulate an interactive shell (unfortunately).

Here is something I've made in order to basically have a batch console in order to configure more than one switch at a time. I'd put a list of IP addresses in a file called switches.txt, separating each address with a new line (be sure to leave a new line at the end of the file as well). It's very messy, and I only used it once and didn't put much thought into it, but it did save me a lot of time instead of manually logging into over a hundred switches. I can't wait until I get Procurve Manager...

Also, I didn't take the time to properly implement and STDOUT reading, so you cannot see any output given to the switch, but I'm sure it wouldn't be that difficult.

<?php

require ('Net/SSH2.php');
$cnt = 0;
$ssh = array();
$ips = array();
echo "\n";

$handle = fopen('switches.txt', 'r');
while (!feof($handle)) {
    $ip = trim(fgets($handle)); 
    $ips[$cnt] = $ip;

    //SSH Setup

    $ssh[$cnt] = new Net_SSH2($ip);
    echo "Logging into device: ".$ip."\n";
    if (!$ssh[$cnt]->login('USERNAMEHERE', 'PASSWORDHERE')) {
        exit ('Login Failed');
    }
    $cnt++;

}
fclose($handle);

//Initial Post Login Setup
sleep(1);
for ($i=0; $i<sizeof($ssh); $i++) {
echo "Performing Post Login Setup (1/2) on device: ".$ips[$i]."\n";
$ssh[$i]->write("\n");
}
sleep(1);
for ($i=0; $i<sizeof($ssh); $i++) {
echo "Performing Post Login Setup (2/2) on device: ".$ips[$i]."\n";
$ssh[$i]->write("conf\n");
}
sleep(1);


//Command Loop
while (true) {
    //Device Loop
    echo "\nBatch Input# ";
    $in = fopen('php://stdin', 'r');
    $buffer = fgets($in);
    for ($i=0; $i<sizeof($ssh); $i++) {
        $ssh[$i]->write($buffer);
        //echo "Wrinting command: $buffer  ;  To Device: ".$ips[$i].";\n";
    }   
}
fclose($handle);
?>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top