2016-03-08 71 views
0

我使用phpseclib從Web瀏覽器SSH到我的遠程服務器並執行一個PHP文件。以下是我使用的代碼:phpseclib ssh exec回調不工作

$ssh->exec('cd myfolder/; php main.php ' . $file, 'packet_handler'); 
function packet_handler(){ 
    echo "Completed"; 
    header("Location: exec_completed.php"); 
} 

main.php文件在沒有任何問題的情況下執行。問題是執行後返回數據。我有以下問題:

  1. 我在main.php文件中做了很多處理,我需要顯示腳本的實時進度。當我通過exec執行文件時,只打印main.php中的第一個回顯並停止執行。有沒有辦法從執行腳本獲取實時數據?

  2. 雖然我的回調函數packet_handler在執行exec後沒有運行,但我仍然使用phpseclib中的example進行回調。一旦我通過SSH執行的main.php已經完成執行,我想重定向到另一個頁面。現在,如果我重定向到該頁面,我只獲得部分結果,因爲main.php文件尚未完成其執行。我試圖使用睡眠(10),但我的main.php可能需要更長的時間才能執行,所以它不起作用。請從phpseclib

回調例如提出任何想法:

<?php 
include('Net/SSH2.php'); 

$ssh = new Net_SSH2('www.domain.tld'); 
if (!$ssh->login('username', 'password')) { 
    exit('Login Failed'); 
} 

function packet_handler($str) 
{ 
    echo $str; 
} 

$ssh->exec('ping 127.0.0.1', 'packet_handler'); 
?> 

回答

1

#1 ...做$ssh->exec沒有回調應該工作。如果沒有,我需要查看日誌,通過在頂部執行define('NET_SSH2_LOGGGING', 2)然後在echo $ssh->getLog()之後執行日誌。在pastebin.com上發佈日誌,然後發佈鏈接會很好。但是那就是說,這也不會讓你實時輸出。

對於#2 ...回調函數主要用於實時更新,很有可能您每次調用回調函數時都會得到不完整的輸出結果。因此,如果您的回調輸出「已完成」並將用戶重定向到另一個位置,則很可能不正確。

另一種可能適用於您的方法是:使用交互式shell。例如:

http://phpseclib.sourceforge.net/ssh/examples.html#sudo

我不知道你的輸出是什麼樣子。也許你可以read(),直到你有一定的輸出保證輸出。或者,也許你可以使用$ssh->setTimeout(5)並獲得更新輸出每五秒鐘或什麼..

+0

感謝您的幫助。我現在沒有包含回調。這是我的日誌輸出。 http://pastebin.com/PzKe5sUv我發現在我的main.php文件中回顯的數據在日誌中可用,但在執行它時不顯示。關於我的文件的輸出:我解析一個csv文件,並使用解析的數據對Web服務執行soap調用並顯示結果。我嘗試使用if(read('my final echo'){重定向到另一個文件;}但無論我給出什麼字符串,它都會被執行,如何使用read()來發現main.php已經完成執行。 –