问题
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:
- I've logged in manually via ssh and made sure that I can run the same command.
- 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.
- 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.
回答1:
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);
?>
来源:https://stackoverflow.com/questions/12115252/phpseclib-attempting-to-connect-to-an-hp-procurve-switch-returns-error-ssh-co