2012-06-17 34 views
1

我試圖安裝一個應用程序使用phpseclib(使用apt-get)並且想要處理不同的輸出結果我可以接收...但是我不確定如何讓它工作。目前,我有以下幾點:

$first = $ssh->read('[email protected]:~#'); 
$ssh->write("sudo apt-get install emacs\n"); 
echo "<br />"; 
echo "sudo apt-get install emacs"; 
echo str_repeat(' ',1024*64); 
if ($unexpected_output = $ssh->read('[email protected]:~#')){ 
    echo "<pre>$unexpected_output</pre>"; 
    echo str_repeat(' ',1024*64); 
} elseif ($continue = $ssh->read('Do you want to continue [Y/n]?')){ 
    echo "<pre>$continue</pre>"; 
    echo str_repeat(' ',1024*64); 
    $ssh->write("Y\n"); 
    $continue_end = $ssh->read('[email protected]:~#'); 
    echo "<pre>$continue_end</pre>"; 
    echo str_repeat(' ',1024*64); 
} 

此,如果僅環與作品的第一個「如果」 ......也就是說,如果有意外的輸出(你回去的外殼,而不問「要不要繼續「,這意味着已經安裝等),那麼這個腳本將工作得很好。

但是,如果應用程序未安裝,它將永遠不會去elseif循環。我很確定原因是因爲第一個ssh-> read會持續到php超時,等待這個結果......我該如何編寫它,以便它將同時查看這兩個選項,並選擇正確的選項。

我想使用CASE這一點,但我不知道該怎麼寫......

也有可能是一個更好的方式來做到這一點使用phpseclib ...但不知道該怎麼做。

謝謝!

回答

1

爲什麼你不改變你如何調用apt-get到apt-get install -y emacs所以它不會提示是或否?您可能還想使用-q,因此它不會打印進度。

apt-get(8)

與您的解決方案的問題是,$ SSH->閱讀等到規定的圖案被發現。

+0

哦,好吧,我必須承認我不知道這個選項......我會用它,雖然我希望有一種方法可以使用CASE語句,所以我可以搜索「emacs已經是最新版本「或」包未找到「等,所以用戶可以得到一個確切的錯誤味精,但這解決了我的直接問題,謝謝。 – deranjer

+1

如果你使用我的方法,你可以使用$ ssh-> exec和grep輸出的文本作爲最新版本 – jpiasetz

+0

哦,太棒了!這很有幫助,我剛剛使用stristr來搜索$ ssh-> exec輸出......效果很好,謝謝。 – deranjer

0

您也可以執行$ ssh-> setTimeout(10)或其他任何操作,然後當連接超時時執行$ ssh-> getLog()查看實際發送的內容。