Это должно быть решенной проблемой, но поиск в Google не нашел мне ответа.
У меня есть программа с интерактивным текстовым интерфейсом командной строки. Я хотел бы запустить эту программу на веб-сервере, чтобы каждый сеанс получал уникальный сеанс программы CLI, и каждый раз, когда команда вводится на веб-странице, соответствующий ответ отправляется обратно.
Я вроде как знаю, как это сделать, если программа каждый раз запускалась заново; что я ищу, так это как это сделать, чтобы программа продолжала работать (предположительно в своем собственном процессе), и веб-страница получала обновления.
Это будет на коробке Linux. Советы по безопасности были бы полезны — я надеюсь, что смогу запустить саму программу как пользователь, настроенный на то, чтобы иметь достаточно прав для запуска, но как можно меньше, чтобы не дать хакеру войти.
Вы можете использовать это:
https://www.tecmint.com/shell-in-a-box-a-web-based-ssh-terminal-to-access-remote-linux-servers/
Затем вам нужно настроить пользователя с ограниченными правами, который автоматически запускает нужное приложение. Убедитесь, что вы понимаете безопасность Linux, прежде чем сделать это. 🙂
Вот некоторая информация об ограничении сеансов SSH, которая может оказаться полезной для этой цели:
Похоже, что хотя бы частичный ответ — просто базовая Linux-ность: я наткнулся на именованные каналы (которые я знал о, dangit!). После тестирования я могу настроить пару каналов, а затем выполнить команду как
tail -f in_pipe.fifo | my_command > out_pipe.fifo
Тогда временным командам нужно будет просто открыть соответствующие каналы, поговорить с ними, закрыть и выйти. Мне все еще нужно будет управлять временем жизни вышеуказанной команды (без сомнения, будут задействованы таймеры и магия), но это вопрос для другой публикации.
На этом этапе я могу открыть три окна терминала: одно с запущенной выше командой, одно с tail -f out_pipe.fifo
работает, и тот, в котором я печатаю вещи в форме echo line of input > in_pipe.fifo
и все это работает. Я уверен, что (A) я могу решить это отсюда, и (B) это будет ужасно.
Мне нужно было войти в исходный код программы и убедиться, что выходной буфер был очищен (используя fflush (stdout)) в C-коде. (Я работаю из какого-то винтажного исходного кода; на данный момент я пытаюсь выполнить минимальный объем работы для его компиляции и запуска — каждая измененная строка является возможностью для ошибки, и я еще не знаком с этим кодом базы).