2015-01-14 2 views
0

Я пытаюсь выяснить, можно ли прогматически перемещаться по приложению linux shell - на основе текста.Программно перемещаться по приложению linux shell

В частности, я хотел бы добиться этого с помощью PHP и phpSecLib, но если Вы знаете лучше/легкий способ обойти это, пожалуйста, шаг в.

Я знаю, как использовать PHP + phpSecLib войти в сервер Linux через SSH, и запускать команды оболочки.

Итак, у нас есть это стороннее приложение на нашем серверном сервере, где у нас нет возможности доступа к живым данным. Приложение имеет отчет, который мы можем сгенерировать, что даст нам «живую» картину различных KPI, однако этот экран отчета не обновляется автоматически, поэтому нужно было бы отступить от отчета и сгенерировать его снова для обновленных KPI.

Когда приложение запускается, я представил с «заставки экрана», говоря «Добро пожаловать в Ye Olde Application вер. 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 Super-Report» [Нажмите 2].

После этого я хотел бы сохранить текст с экрана отчета в документ для дальнейшего разбора. Но это не первая проблема.

Другая идея может быть ..

..разработать сделать это в раковине-скрипт (Bash) каким-то образом с макро или аналогичный.

+0

Меню, вероятно, создается с использованием escape-кодов 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(); 

Update: Изменено с расширенным My_File_ANSI до File_ANSI в приведенном выше примере, см комментарии.

+0

Я отмечаю, что вы используете 'My_File_ANSI' вместо' File_ANSI'. Вы расширили 'File_ANSI'? Если бы вы добавили какие-либо изменения? Если это так, может быть полезно опубликовать ваши изменения! – neubert

+0

Привет, только изменение состояло в том, чтобы пропустить предупреждение для неизвестных символов в 'File_ANSI' :-) Неизвестные символы были символами, используемыми для иллюстрации пограничных линий на экране. Следующий код был прокомментирован «echo» {$ this-> ansi} unsupported \ r \ n ";' – Phliplip

 Смежные вопросы

  • Нет связанных вопросов^_^