1

phpseclib の NET_SSH2 ライブラリを使用して HP スイッチに接続しようとしています。テスト/開始するために、ログオンしてから、スイッチで「show interfaces brief」コマンドを実行しようとしています。しかし、ログオンした後、エラーメッセージが表示されます:

 SSH command execution is not supported. 

コードは次のとおりです。

<?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>';
}
?>

これが返す出力は次のとおりです。

 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

ssh2.php の 1941 行目は、以下に示す「user_error」行です。

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

私がこれまでに行ったこと:

  1. ssh 経由で手動でログインし、同じコマンドを実行できることを確認しました。
  2. スイッチの Web 構成ページを調べて、ssh で有効にする必要があるものが他にないことを確認しました。
  3. 同様の問題がないか、phpseclib のフォーラムをチェックしています。

phpseclib のバージョン 1.53 2010/10/24 01:24:30 を使用しています。

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

3

HP Procurve スイッチでは exec コマンドを使用できません。(残念ながら) 対話型シェルをエミュレートする必要があります。

これは、一度に複数のスイッチを構成するために、基本的にバッチ コンソールを用意するために作成したものです。私なら、switches.txt というファイルに IP アドレスのリストを入れ、各アドレスを改行で区切ります (ファイルの最後にも必ず改行を残してください)。非常に面倒で、一度しか使用したことがなく、あまり考えていませんでしたが、100 以上のスイッチに手動でログインする代わりに、多くの時間を節約できました。Procurve Manager を入手するまで待ちきれません...

また、適切な実装と STDOUT の読み取りに時間がかからなかったので、スイッチに与えられた出力が表示されませんが、それほど難しくはないと確信しています。

<?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);
?>
于 2012-11-18T00:13:02.167 に答える