1

phpseclib を使用して cisco SF308 スイッチに接続しようとしています。このライブラリを使用して一部の HP スイッチに正常に接続していますが、何らかの理由で、cisco では機能しません。コードは次のとおりです。

 set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/phpseclib');
 include('/var/www/phpseclib/Net/SSH2.php');
 define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX); //add near include lines
 $cisco = new Net_SSH2('10.10.10.10');

 if (!$cisco->login('username', 'password')) {
     exit('Login Failed');
 }

 echo $cisco->write('\n');

 echo $cisco->write('help');
 echo $cisco->read('/([0-9A-Z\-])*(#)(\s*)/i', NET_SSH2_READ_REGEX);  
 echo $cisco->data;
 echo $cisco->getLog();
 echo $cisco->disconnect();

ログイン失敗エラーメッセージで常に停止します。

NET_SSH2 ライブラリ自体にいくつかのデバッグ ステートメントを追加しようとしましたが、'NET_SSH2_MSG_USERAUTH_FAILURE' として定義されているエラー番号 51 で終了しました。

hp スイッチとこの cisco の違いの 1 つは、手動で接続する場合、hp は最初の ssh コマンドからユーザー名を取得するのに十分「スマート」であることです。たとえば、コマンド プロンプトでこれを行う場合:

 ssh username@10.10.10.10

次にEnterキーを押すと、ユーザー名として「ユーザー名」が選択され、パスワードの入力のみが求められます。cisco スイッチ (SF302-08 がモデル) では、ユーザー名とパスワードの両方を求めるプロンプトが引き続き表示されます。もう一度ユーザー名を入力してからパスワードを入力すると、スイッチに接続できます。

これが問題の原因かどうかはわかりませんが、2 つのスイッチ間で明らかに異なるものです。これを変更する方法があるかどうか、または最初の接続要求でユーザー名を取得する方法があるかどうかを確認するために、cisco のドキュメントを探しています。でも他におすすめがあれば教えてください!ぜひ聞きたいです。

ありがとう。

編集1

複雑なログを有効にして、失敗した場所の完全な詳細を取得しました。これが役立つ場合があります。これが私の最新のコードです:

 set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/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('username', 'password')) { //if you can't log on...
    echo('Login Failed');
    echo 'Error message is: <br>';
    $log = $ssh->getLog(NET_SSH2_LOG_COMPLEX);
    foreach ($log as $logitem)  {
             echo $logitem.'<br>';
     }

これにより、次の出力が返されます。

 Login FailedError message is:
 <-
 ->
 <- NET_SSH2_MSG_KEXINIT (0.0118s)
 -> NET_SSH2_MSG_KEXINIT (0s)
 -> NET_SSH2_MSG_KEXDH_INIT (0s)
 <- NET_SSH2_MSG_KEXDH_REPLY (0.7912s)
 -> NET_SSH2_MSG_NEWKEYS (0s)
 <- NET_SSH2_MSG_NEWKEYS (0s)
 -> NET_SSH2_MSG_SERVICE_REQUEST (0s)
 <- NET_SSH2_MSG_SERVICE_ACCEPT (0.4927s)
 -> NET_SSH2_MSG_USERAUTH_REQUEST (0s)
 <- NET_SSH2_MSG_USERAUTH_FAILURE (0.0059s)

したがって、スイッチに接続していますが、最初の投稿で述べたように、ユーザー名/パスワードの認証に失敗しています。

4

3 に答える 3

2

いくつかの調査を行った後、これが私たちの問題の解決策です。他の人は別の方法で解決したかもしれませんが、これは私たちにとってうまくいくようです.

私たちが気づいたことは次のとおりです。

  1. phpseclib のような一般的な ssh ライブラリは、ssh の実装が制限されているため、このスイッチでは失敗していました。

  2. php の ssh2_auth_none 関数は、このスイッチで TRUE を返します。

これは何を意味するのでしょうか?

sshプロトコルには「none」という認証方式があるようです。これは安全ではなく、通常、ほとんどのスイッチで無効になっています。ssh2_auth_none() 関数は、認証なしで接続を試み、失敗すると、サーバーが受け入れる認証方法のリストを返します。SF300 の場合、認証方法に対しては何も返さずに通過します。

  1. CLI および SSH の既知の制限事項

ソリューションを提供することはできませんでしたが、CISCO のテクニカル サポートは、スモール ビジネス クラスのスイッチには限定された CLI と SSH の簡素化されたバージョンもあると明確に述べているため、これをエンタープライズ レベルのスイッチとして扱うことはできません。本格的な ssh 実装。

役立つ場合は、これらのタイプのデバイスに接続する方法を示す小さなコード スニペットを次に示します。

    <?php

      $username = 'myusername';

      $password = 'mypassword';

      $connection = ssh2_connect('123.123.123.123', 22);

      //$authentication_methods = ssh2_auth_none($connection, 'user');

      $stdio_stream = ssh2_shell($connection);

      fwrite($stdio_stream,$username."\n");

      sleep(1);

      fwrite($stdio_stream,$password."\n");

      sleep(1);

      echo "Results: " . stream_get_contents($stdio_stream); 
      echo 'sending show bonjour command:<br>';
     fwrite($stdio_stream, "show bonjour".PHP_EOL); //you can use \n instead of PHP_EOL but PHP_EOL is recommended.

     sleep(1);

     echo "<br>Results: " . stream_get_contents($stdio_stream); 

    ?>

これが、これらのタイプのデバイスにプログラムで接続しようとしている人に役立つことを願っています.

于 2012-11-15T15:00:21.483 に答える
1

私はあなたが使用しているライブラリに精通していませんが、Perl を使用して Cisco ルーターでいくつかのスクリプトを作成する必要がありました。このために、私は Net::Telnet::Cisco モジュールを使用しました。このモジュールは、Cisco デバイスとの対話のいくつかの特異性を扱います。通常の IOS デバイスではなく、Cisco Nexus デバイスに接続すると、これが壊れました。telnet セッションがユーザー入力を待っていることを示す文字列を認識するためにモジュールが使用する正規表現を変更して、この問題を修正する必要がありました。Wireshark を使用して、IOS デバイスと Nexus デバイスの両方から正確な文字列が送信されていることを確認できました。似たようなものが必要になると思います。

于 2012-10-04T23:35:46.087 に答える
0

使用しているIPアドレスが正しいことを確認し、ユーザー名とパスワードに接続権限があることを確認します

于 2012-10-04T12:56:37.653 に答える