2015-01-14 58 views
0

我想弄清楚是否可以程序化導航一個linux shell應用程序 - 基於文本。以編程方式導航linux shell應用程序

具體來說,我想用PHP和phpSecLib實現這一目標,但如果你知道一個更好/更簡單的方法這一輪請在場上。

我知道如何使用PHP + phpSecLib登錄到Linux服務器通過SSH,並運行shell命令。

所以我們在我們的後端服務器上有這個第三方應用程序,我們沒有選擇訪問實時數據。 該應用程序有一個我們可以生成的報告,它會給我們提供各種KPI的「實時」圖片,但是這個報告屏幕並不會自動刷新,因此我們不得不從報告中退出並重新生成更新後的KPI

當應用程序啓動時,在「屏幕/輸出」更新發生後不久,「閃屏」顯示「歡迎使用Ye Olde應用程序版本3.14159」(名稱是虛構的)主菜單「,其中每個menupoint可通過按鍵(1-9a-z)訪問。

主菜單

   ┌────────────────────────────────────────────────┐ 
       │            │ 
       │ 1 Foo     bar    │ 
       │ 2 Same     procedure  │ 
       │ 3 Rudolph    Reindeer   │ 
       │ 4 Report     generator  │ 
       │ 5 Log-off    system   │ 
       │            │ 
       └────────────────────────────────────────────────┘ 

因此,在這種情況下,我想進入 「4報告生成器」[新聞4]。之後,「屏幕/輸出」使用上面的新子菜單更新,並帶有其他選項。在這裏,我將進入「1創建新報告」[按1],再次進行「屏幕/輸出」更新。現在用新的菜單,進入「2 Superhandy超級報告」[按2]。

之後,我想將文本從報告屏幕保存到文檔以供進一步解析。但這不是最初的問題。

另一個想法可能是...

..to做到這一點在shell腳本(bash)的某種方式與宏或類似。

+0

該菜單可能是使用ANSI轉義碼創建的。你可以這樣解碼: http://phpseclib.sourceforge.net/ssh/examples.html#top 至於是否真的回答你的問題... idk。我不完全確定你的問題是什麼? – neubert

回答

0

自己想象出來;-)如果有人遇到同樣的問題,就把它留在這裏。

require_once('Net/SSH2.php'); 

$ip = '127.0.0.1'; // The IP of the SSH server 
$username = 'username'; 
$password = 'password';  

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

// Set a reasonable timeout (secs) 
$ssh->setTimeout(5);   
// Prepare ANSI "screen reader" 
$ansi = new File_ANSI(); 
$ansi->setDimensions(200, 30); // set number of collumns and rows of each screen 

// Should probably do some stuff here to make sure we're ready for next step 

$ssh->write("/usr/bin/3rdpartybackendapp\n"); // Start the backend application 
// Read until the "Please select" text appears 
$ssh->read('Please select'); 

$ssh->write("4"); // Select "4: Report generator" 
$ansi->appendString($ssh->read('Please select')); 

$ssh->write("1"); // Select "1: Create reports" 
$ansi->appendString($ssh->read('Please select')); 

$ssh->write("h"); // Select "H: Dashboard report 
$ansi->appendString($ssh->read('Q Quit')); 

$output = strip_tags($ansi->getScreen()) . PHP_EOL . PHP_EOL; // Collect the screen 
$fulloutput .= $output; 

// The report has multiple pages, so continue to read pages 
// until there are no more pages to read. 
// Application does not show "N Next" on last page. 
while(false !== strpos($output, 'N Next')) { 
    $ssh->write("n"); // Select "N: Next page 
    $ansi->appendString($ssh->read('Q Quit')); 

    $output = strip_tags($ansi->getScreen()) . PHP_EOL . PHP_EOL; // Collect the screen 
    $fulloutput .= $output; 
} 

echo strip_tags($fulloutput); // outputs HTML 

// Terminate the SSH session 
$ssh->disconnect(); 

更新: 從擴展My_File_ANSI改爲File_ANSI在上面的例子中,看到註釋。

+0

我注意到你正在使用'My_File_ANSI'而不是'File_ANSI'。你擴展了'File_ANSI'嗎?如果是,你是否添加了更改?如果是這樣,那麼發佈您的更改可能會有用! – neubert

+0

嗨,唯一的變化就是跳過'File_ANSI'中未知字符的警告:-)未知字符是用來說明屏幕邊框線條的字符。下面的代碼被註釋掉了「echo」{$ this-> ansi}不受支持\ r \ n「;' – Phliplip

相關問題