1

いくつかのphpコマンドを実行して、リモート電源スイッチを制御しようとしています。

telnet 接続を確立するために使用している telnet ライブラリがあります: http://www.soucy.org/project/cisco/source.php

私の接続機能は次のようになります。

public function connect() 
{
    $this->_connection = fsockopen($this->_hostname, $this->_port, $errno, $errstr, $this->_timeout);
    if ($this->_connection === false) {
        die("Error: Connection Failed for $this->_hostname\n");
    } // if
    stream_set_timeout($this->_connection, $this->_timeout);
    $this->_readTo(':');
    if (substr($this->_data, -9) == 'Username:') {
        $this->_send($this->_username);
        $this->_readTo(':');
    } // if
    $this->_send($this->_password);

    $this->_send(''); //blank space, because we need to press <Enter> for the second login prompt 

   //Login Second time

    $this->_send($this->_username2);
    $this->_send($this->_password2);
}

送信機能は次のようになります。

private function _send($command) 
{
    fputs($this->_connection, $command . "\r\n");
} 

したがって、リモート電源スイッチを制御したい場合は、そのためのメニューがあります。このメニューでは、ユーザーは次のようにナビゲートできます。

------- コントロールコンソール ------------------------------------------ --------------

 1- Device Manager
 2- Network
 3- System
 4- Logout

 <ESC>- Main Menu, <ENTER>- Refresh

1 を押すと、別のメニューに移動します。

- - - - デバイスマネージャ - - - - - - - - - - - - - - - - - - - - - ---------------

 1- Bank Monitor
 2- Outlet Management
 3- Power Supply Status

 <ESC>- Back, <ENTER>- Refresh

などなど... したがって、これらの番号を入力するだけで、必要なコンセントにアクセスできます。

コンセントをリロードする機能 (コンセント番号 22):

public function ReloadOutlet22() 
{

$this->_send('1'); // Access Device Manager
$this->_send('2'); // Access Outlet Management
$this->_send('1'); // Outlet Control/Configuration
$this->_send();    // '<Enter> to continue'
$this->_send('22'); // Access Outlet number 22
$this->_send('6');  // Delayed Reboot (reboot with 5 sec delay)
$this->_send('YES'); // 'Yes' to continue
$this->_send();      // <Enter> to continue'

//Everything is working till there. I can successfully reload the outlet which I want. After the reload I want to go to the main menu and logout from this console.

$this->_send('\e');  // <Esc> - back
$this->_send('\e');  // <Esc> - back
$this->_send('\e');  // <Esc> - back
$this->_send('\e');  // <Esc> - back
$this->_send('\e');  // <Esc> - back
$this->_send('4');   // Logout
}

だから問題があります。次回、別のアウトレット (たとえば、番号 23 のアウトレット) をリロードしようとすると、APC PDU に正常にログインできません。ログイン プロンプトで、'\e' をユーザー名とパスワードとして使用しようとしたことがわかります。

では、リロードが成功した後にコードが正常に機能しないのはなぜでしょうか? メインメニューに戻ってログアウトできないのはなぜですか?

お時間をいただきありがとうございます。

4

2 に答える 2

2

APC は、コントロール コンソール (テキスト ベースのメニュー駆動型) と、PDU のコンセントの制御に固有のさまざまなコマンド ラインを受け入れるコマンド ライン インターフェイス (「CLI」) の両方を提供します。

コントロール コンソールの代わりにコマンド ライン インターフェースを使用するには、telnet でログインするときにパスワードに「-c」を追加します。つまり、telnet パスワードが「abcdefg」の場合、パスワード「abcdefg -c」でログインして、 CLI。CLI コマンド プロンプトは「APC>」です。

コンセントの電源を入れ直す (再起動する) CLI コマンドは次のとおりです。

APC> reboot x
(x = the outlet number to power cycle)
于 2012-09-28T19:38:19.450 に答える
1

おそらく "\e" を二重引用符で囲む必要があります - 一重引用符はそれをリテラル文字列として扱います (\n のようなエスケープ シーケンスはありません)。

$this->_send("\e");  // <Esc> - back

それがうまくいかない場合は、

$this->_send(chr(27));  // <Esc> - back

数値ASCII値を使用してエスケープキーを送信するには

http://php.net/manual/en/function.chr.php

于 2012-08-29T08:16:34.480 に答える