Программная навигация приложения оболочки Linux

0

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

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

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

Таким образом, у нас есть это стороннее приложение на нашем бэкэнд-сервере, где у нас нет возможности получить доступ к живым данным. В приложении есть отчет, который мы можем сгенерировать, что даст нам "живую" картину различных 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 Super-Report" [Нажмите 2].

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

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

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

  • 0
    Меню, вероятно, создается с использованием управляющих кодов ANSI. Вы можете расшифровать их следующим образом: phpseclib.sourceforge.net/ssh/examples.html#top Что касается того, действительно ли это отвечает на ваш вопрос ... idk. Я не совсем уверен, что ваш вопрос?
Теги:
screen-scraping
ssh
phpseclib

1 ответ

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 ? Если да, то добавили ли вы какие-либо изменения? Если это так, то может быть полезно опубликовать ваши изменения!
  • 0
    Привет, единственным изменением было пропустить предупреждение о неизвестных символах в File_ANSI :-) Неизвестными символами были символы, используемые для иллюстрации границ на экране. Следующий код был закомментирован echo "{$this->ansi} unsupported\r\n";

Ещё вопросы

Сообщество Overcoder
Наверх
Меню