iT邦幫忙

0

【請問 Windows 下的 php 如何使用 expect ???】

expect做為一種tcl語言
不管是
netterm 或是 securecrt
都有內建這種語法
方便和switch或是router做溝通
linux底下好像有支援 expect
但是如果php架設在 windows 底下
如何可以使用 expect 的功能呢
謝謝
我是安裝 wamp server 安裝包

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

6
wiseguy
iT邦超人 1 級 ‧ 2012-02-07 12:09:32
最佳解答
  1. 安裝 expect 的 windows 版:http://expect.sourceforge.net/#windows
  2. 在 php 中用 exec()、system()、shell_exec() 之類的函式去執行 expect.exe 即可。
看更多先前的回應...收起先前的回應...
andyto202 iT邦研究生 4 級 ‧ 2012-02-07 13:04:24 檢舉

這是 php 官網的例子

<pre class="c" name="code">
<?php
ini_set("expect.loguser", "Off");

$stream = fopen("expect://ssh root@remotehost uptime", "r");

$cases = array (
    array (0 => "password:", 1 => PASSWORD)
);

switch (expect_expectl ($stream, $cases)) {
    case PASSWORD:
        fwrite ($stream, "password\n");
        break;
 
    default:
        die ("Error was occurred while connecting to the remote host!\n");
}

while ($line = fgets($stream)) {
      print $line;
}
fclose ($stream);
?>

我有幾個問題想請問
1.expect.loguser(範例程式第一行),這個也是灌了expect才有用的嗎??
2.我灌了後,是不是也可以用網頁去跑(就是執行過程都是網頁呈現)??
3.有簡單的範例嗎?(php 搭配 expect 連到 switch 或 router 的範例)

我目前是可以用php連到設備去
但是是透過
php_ssh2搭配
fwrite($shell,$cmd . "\n");
sleep( 3 );
去寫資料
因為想說
expect是期待什麼 符號
就送出什麼命令
遠比用sleep來控制寫入的東西好
才會想把
fwrite,sleep
改成
expect

wiseguy iT邦超人 1 級 ‧ 2012-02-07 23:35:51 檢舉
  1. expect 是 pecl,要加掛 extension:在 php.ini 加上extension=php_expect.dll
  2. 你搞錯了吧?加掛 php extension 後用 php 程式執行,是在 server 端跑,除非你把所有輸出都捕捉並 echo 出來,並且是以瀏覽器連到 server 去執行那支 php,要不然沒有什麼用網頁跑這回事。就算你真的這麼做了,意義何在?
  3. 範例你不是已經在 php 官網看到了?

不過話說回來,我看你應該是要用 ssh 連到機器上,下一些指令吧?這個應該可以用 script 命令檔直接辦到,不懂為什麼要模擬真人登入跟機器對話耶?

andyto202 iT邦研究生 4 級 ‧ 2012-02-08 08:16:50 檢舉

wiseguy兄
我目前的作法就是你說的
用瀏覽器連到server去執行那支php啊,而且全部過程都echo出來,並把有問題的紅色標記,分別存入不同的資料表中啊,因為我去pecl的官網下載expect,解壓後,並沒有php_expect.dll檔案,所以無法掛在php.ini裡啊

wiseguy iT邦超人 1 級 ‧ 2012-02-08 14:02:57 檢舉

好吧~ 雖然你寫到『要把有問題的紅色標記,分別存入不同的資料表中』我還是不知道為什麼要『用瀏覽器連到server去執行那支php 並整個 echo 出來』這麼麻煩,直接用 php.exe 去執行程式不是單純多了?不過你願意這麼做我也沒話說。

php_expect.dll 是 pecl,並非官方的程式,所以 php 官方沒有預編譯的 dll 檔,你得自己去找,或者自己去 pecl.php.net 抓原始碼來編譯。

andyto202 iT邦研究生 4 級 ‧ 2012-02-08 21:11:20 檢舉

這是 expect (pecl 的官方網站有)
http://pecl.php.net/package/expect
下載下來的檔案
以下是壓縮檔的內容

壓縮檔 D:\TDDOWNLOAD\expect-0.3.1.tgz

2011-11-23 00:27 1856 0 package.xml
2011-11-23 00:27 1287 0 expect-0.3.1\config.m4
2011-11-23 00:27 387 0 expect-0.3.1\config.w32
2011-11-23 00:27 10995 0 expect-0.3.1\expect.c
2011-11-23 00:27 4512 0 expect-0.3.1\expect.dsp
2011-11-23 00:27 2615 0 expect-0.3.1\expect_fopen_wrapper.c
2011-11-23 00:27 2259 0 expect-0.3.1\php_expect.h

總共 大小 封裝後 檔案

23911 0 7

請問要如何編譯呢
請問
wiseguy兄
您有曾經在windows底下用php跑過expect的經驗嗎
謝謝您

wiseguy iT邦超人 1 級 ‧ 2012-02-10 21:35:23 檢舉

官方站有教怎麼安裝編譯環境,麻煩你自行參閱囉。
不好意思,不只是 windows,我在 Linux 也沒用過 expect。我不知道你用 expect 是不是有絕對非它不可的必要性。我已經有說明,如果你是要用 ssh 連進機器去執行指令,這個目的可以直接用 ssh 做,完全不必透過 expect 去跟介面對話。因為我都是這麼做的,所以我沒用過 expect。

andyto202 iT邦研究生 4 級 ‧ 2012-02-21 06:41:08 檢舉

您說您用ssh
所以您也是設sleep來讓區隔下指令和顯示嗎
有時候我的程式會登入失敗
根本沒進設備
如果為了保險,把sleep設大
執行時間又會拉長
所以才覺得很頭大

我要發表回答

立即登入回答