2012年5月27日 星期日

PHP-EXPECT SSH應用(TELNET)

使用expect可以簡單達到自動交互作用,之前都在SHELL底下工作,用排程完成相關作業。
最近使用PHP expect 移到WEB介面,可遠端利用WEB更輕鬆完成操作,搭配PHP語法更容控制整個程序,不用考慮SHELL下的權限問題。

底下範例:

使用SSH連至設備進行命作操作,針對MOTOROLA RFS 抓取線上無線使用者IP

<?php
ini_set("expect.timeout", 10);
ini_set("expect.loguser", "Off");
define("PASSWORD", 'password:');
define("YESNO", 'yes/no)?');  ##first once for ssh key
define("ENABLEMODE", '*>');
define("SHELL", '*#');
#EXP_EXACT ..
$stream = fopen("expect://ssh sshcmd@10.209.8.1", "r");
#$stream = expect_popen("ssh sshcmd@10.209.8.1");
$status=1;
while ($status) {
    switch (expect_expectl ($stream, array (
            array ('password:', 1 => PASSWORD),
            array ('yes/no)?', 1 => YESNO),
            array ('*>', 1 => ENABLEMODE),
            array ('*#', 1 => SHELL, EXP_EXACT)
           ),$result))
     {
        case @PASSWORD:
            fwrite ($stream, "password\n");
            break;
        case @YESNO:
            fwrite ($stream, "yes\n");
            break;
        case @ENABLEMODE:
            fwrite ($stream, "enable\n");
            break;
        case @SHELL:
            fwrite ($stream, "show wireless client \n        " );
            sleep(3);  ##wait output
            fwrite ($stream, "exit \n");
            break 2;
        case @EXP_TIMEOUT:
        case @EXP_EOF:
            $status=0;
            break 2;
        default:
            die ("Error has occurred!\n");
    }
}
## show messages
    $line = stream_get_contents($stream) ;
    fclose ($stream);
    print_r($line);
?>

部份PHP 就沒有貼上來,僅貼連結MoTo RFS7000控制部份。
主要PHP程式是控制,線上增加及刪除使用者裝置MAC,使用者自行登入註冊MAC,來MAC存取控管,原本要從RFS7000設備上手動命令設定,現在只要WEB介面讓使用者點點按鈕就可了。
 
 

@SHELL  顯示如果有多頁顯示時需要按任一鍵繼續換頁(強迫性),所以 \n 後面接幾個控白字元來換頁,同時也可能需要等待結果的輸出,在加上seleep(3),若未等待可能造成下一個指令無法正確執行。
在linux 上系統就比較不會發生這種問題,大都是一個命令就全部顯示,不需換行的動作。

@YESNO  是控制SSH第一次接收public key動作。



在 CentOS6 需要安裝pecl, 同時也要安裝 ssh2 , expect, 才能正常執行PHP_EXPECT
# pecl list
Installed packages, channel pecl.php.net:
=========================================
Package  Version State
expect   0.3.1   beta
ssh2     0.11.2  beta

安裝php ssh2 & expect 模組

作業環境 : CentOS6-64bit

1. pear & pecl 是PHP用來擴充套件( extensions )的程式,pecl 在php-pear套件內

# yum install php-pear
# pecl list-all
安裝 ssh2 & expect ,因為兩個模組都是beta套件,所以無法直接安裝,會有提示bete安裝方式
# pecl install ssh2
# pecl install expect

# pecl install channel://pecl.php.net/ssh2-0.11.3
# pecl install "channel://pecl.php.net/expect-0.3.1"
#安裝完成,檢視已安裝的模組
# pecl list
Installed packages, channel pecl.php.net:
=========================================
Package Version State
expect 0.3.1 beta
ssh2 0.11.3 beta

#確認模組是否正確編譯成功(.so)
# ls /usr/lib64/php/modules/

預設不會掛載pecl 編譯出來的PHP 模組, 必須手動設定
# vim /etc/php.d/ssh2.ini
   extension=ssh2.so
# vim /etc/php.d/expect.ini
   extension=expect.so

#service httpd restart

設定完成


2. 安裝過程中可能發生錯誤(相依套件)

# pecl install channel://pecl.php.net/ssh2-0.11.3
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading ssh2-0.11.3.tgz ...
Starting to download ssh2-0.11.3.tgz (23,062 bytes)
.....done: 23,062 bytes
5 source files, building
running: phpize

sh: phpize: command not found
ERROR: `phpize' failed

缺少PHP 可執行腳本 編譯軟體,但看一下就知道前面安裝的套件,就知道可能需要那些套件。

# yum install php-devel.x86_64  
# yum install libssh2-devel.x86_64
# yum insatll expect-devel.x86_64
# yum insatll tcl-devel.x86_64

phpize 是屬於 php-devel 中的東西,主要是設定 php 外掛模塊的一些設定
php安裝成功後,在bin目錄下會生成一個phpize的可執行腳本,它的用途是用來動態安裝php擴充模組。使用phpize的好處是:在已經安裝了php的情況下,再安裝擴展模塊時,無需重新編譯安裝php。

Extreme XOS run pyton scripts

XOS run python scripts v15.7 or high 將交換器上的 IP & MAC 往syslog 丟, 簡單將IP資料保留下 ## 編緝Scripts # vi ip2syslog.py #!/usr/bin/python # ...