最近使用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