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