Создание веб-интерактивного эмулятора терминала с удаленным опросом - PullRequest
2 голосов
/ 05 июля 2019

Я обновил это, чтобы уточнить мой вопрос ...

Первоначально я попросил хороший метод запуска команд в постоянном сеансе, чтобы я мог отправить команду, получить ответ, а также промыть и повторить,Кажется, что разъяснение моей конечной цели могло бы быть более полезным для людей, желающих дать мне предложения, поскольку, возможно, решение не в том направлении, в котором я изначально был.Итак, вот нижний предел:)

Огромное спасибо всем, кто помог до сих пор, и тем, кто останавливается, чтобы помочь.

Я работаю над сценарием, который позволит мне безопасно использовать внутреннюю веб-страницу (защищенную паролем и зашифрованную) для запуска команд в командной строке и получения выходных данных.

Я знаю, чтоЕсть такие вещи, как shellinabox и ajaxTerm, которые позволяют SSH на основе браузера, и это моя конечная цель ... вроде ... с подвохом ...

Мне нужен один сервер, на котором размещен эмулятор терминала,Он должен позволять входить в эмулятор терминала и использовать его, как если бы он был локальным, ОДНАКО любые и все команды должны быть переданы на удаленный клиент, который ПОЛУЧИЛ команды, запрашивая их, выполняя их, а затем возвращая результаты и терминал.вывод на основной сервер.Родительский скрипт принимает команды, помещает их в базу данных, а затем ждет результата, который он отображает, прежде чем разрешить дальнейшие команды.Скрипт будет зацикливаться со сном и автоматическим дросселем, поэтому созданный дескриптор будет оставаться открытым до тех пор, пока удаленный сеанс не будет простаивать в течение определенного времени или не отправит разъединение.

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

Может ли кто-нибудь предложить предложение, которое можетРабота?Я хотел бы использовать один из уже доступных терминалов с открытым исходным кодом и выяснить, как сделать так, чтобы он «запускал» сеанс без фактического запуска сеанса, чтобы удаленная сторона могла подключиться, получить и запустить результаты, а затем передать обратно данные.

Основные шаги

1) Пользователь открывает веб-терминал, размещенный на сервере A.
2) Сессия сразу же становится «открытой».
3) Пользователь вводит команду.
4) Терминал принимает команду и ждет
5) Клиентский компьютер на другой стороне Интернета регистрируется и видит, что есть команда, ожидающая ее, поэтому он захватывает ее
6) Клиентский компьютер запускает сеанс и запускает эту команду
7) Клиентский компьютер возвращает результаты и начинает цикл поиска дополнительных команд. 8) Сервер А получает результат и возвращает его в веб-терминал
9) Пользовательвидит результат, и терминал теперь готов принять другую команду
10) Это продолжается до тех пор, пока в течение некоторого времени не было выполнено ни одной команды, и в этот момент сеанс завершается, и удаленная сторона возвращается к проверке команд только изредка

У меня есть все безопасные материалы, написанные и работающие очень хорошо.У меня есть проверка команд, передача туда и обратно, автоматическое регулирование при простое, ведение журнала базы данных и т. Д., Работающие ... Я просто не хочу заново изобретать виртуальный терминал руля и мудро переваривать команды ... но у меня естьпонятия не имею, как лучше всего это сделать.С этой целью я пытался придумать свой собственный базовый код управления командами.Проблема в том, что заново изобретают колесо, и это более сложное колесо, чем я хочу вырезать ...

Мне кажется, что лучше всего как-то "разделить" один из веб-сайтов,с открытым исходным кодом, эмуляторы виртуальных терминалов пополам, так что я перехватываю команды, кэширую их в БД, затем возвращаю их из БД, чтобы он смотрел на эмулятор, как на локальный, и просто медленный, хотя на самом деле он удаленный...

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

EDIT

Вот что у меня есть для командного переваривания такого рода работ ... Это просто интерактивный пример. Реальные команды будут отправлены и получены удаленно. Я говорю, потому что некоторые вещи, такие как пинг, ломают его. ви тоже ломает, но этого и следовало ожидать ... хотя я бы с удовольствием поработал.

Это быстро и безобразно, но работает для базовых вещей. Я уверен, что это немного опасно, если создавать процессы зомби, но я остановлюсь на этом позже.

#!/usr/bin/perl -w
use strict;
use warnings;
use IPC::Open3;
use IO::Select;

#connect to our session using sudo
my $pid = open3(\*WRITE, \*READ,\*ERROR,"sudo su");
my $checkRead = new IO::Select();
my $checkError = new IO::Select();
$checkRead->add(\*READ);
$checkError->add(\*ERROR);
#hold it
my $query  = '';

#want to do it at least once...
do{
    my $error  = '';
    my $answer = '';
    #give us a prompt
    print "\n[REM PROMPT]# ";
    $query = <STDIN>;
    chomp($query);
    #make sure we aren't exiting
    if($query !~/^EXIT\s*$/){
        #send what we entered
        print WRITE "$query\n";
        #We need to give this a chance to run
        select(undef,undef,undef,.02);

        #get any error from bc 
        sysread(ERROR,$error,8192) if $checkError->can_read(0);
        if($error){print "\e[1;31m ERROR: $error \e[0m \n"}

        #get the answer from bc 
        sysread(READ,$answer,8192) if $checkRead->can_read(0);
        if($answer){ print "$answer\n"; }
    }
#give us a way to get out
}while($query !~/^EXIT\s*$/);
#make sure it all exits
waitpid($pid, 1);

Проблема с вышесказанным заключается в том, что хотя я могу передавать базовые команды к нему и от него 1) он подавляется всем, что является подпроцессом 2) мне нужно будет заново изобрести веб-терминал 3) скорее всего нет хорошо с процессами зомби ...

Буду признателен за любые полезные мысли или идеи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...