Я пытаюсь выяснить, можно ли программно ориентироваться в приложении оболочки Linux — на основе текста.
В частности, я хотел бы добиться этого с помощью PHP и phpSecLib, но если вы знаете лучший / более простой способ, пожалуйста, укажите.
Я знаю, как использовать PHP + phpSecLib для входа на сервер Linux через SSH и запуска команд оболочки.
Итак, у нас есть это стороннее приложение на нашем внутреннем сервере, где у нас нет возможности доступа к оперативным данным.
В приложении есть отчет, который мы можем сгенерировать, который даст нам «живую» картину различных KPI, однако этот экран отчета не обновляется автоматически, поэтому придется выйти из отчета и сгенерировать его снова для обновленных KPI.
Когда приложение запускается, мне предлагают «заставку», говорящую «Добро пожаловать в Ye Olde Application ver. 3,14159«(имя вымышленное), вскоре после обновления« экран / вывод »и представления« Главного меню », где каждая точка меню доступна нажатием клавиши (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-скрипте (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
в приведенном выше примере см. комментарии.
Других решений пока нет …