Как визуализировать удаленную консоль ncurses?

Я хочу написать удаленную консоль, работающую как сервер telnet. Пользователь может использовать telnet для входа на сервер, а затем написать несколько команд для выполнения некоторых работ.

хорошим примером для этого является консоль маршрутизатора os. Что я сейчас путаю, так это то, что я могу принять пользовательский ввод, сделать что-то, а затем распечатать некоторые тексты, но я хочу использовать ncurses, чтобы консоль имела больше функций(например, "cmd auto-complete", цвет синтаксиса...), так как я могу это сделать? Потому что консоль находится в пользовательская сторона, если сервер вызывает ncurses API, он просто изменит питание на сервере...

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

2 ответов


это сложнее, чем вы думаете.

вы должны понять как терминалы работают - они используют специальные управляющие последовательности, например, для перемещения курсора или вывода цвета. Это описывается a используя базу файл, специфичный для терминала. Ncurses переводит вызовы API (например, перемещение курсора в определенную позицию) в такие управляющие последовательности с помощью terminfo.

С терминала (в настоящее время xterm, gnome-terminal, screen, tmux и т. д.) На стороне клиента, вы должны передать тип терминала от клиента к серверу. Вот почему, например,ssh передает эту информацию от клиента ssh на сервер (попробуйте echo $TERM в сеансе ssh-это может быть "linux", если вы вошли в систему через консоль, или "xterm", если вы используете X и xterm). Кроме того, вам лучше иметь соответствующий terminfo, доступный на сервере.

еще одна часть головоломки псевдо терминалы. Как сейчас относительно немногие люди используют последовательные терминалы, их семантика эмулируется так, что приложения и библиотеки (например,curses и его друзья), первоначально разработанный для последовательных консолей, продолжают работать. Это достигается с помощью псевдо-терминалов - это как трубы, ведущий и ведомый устройства общается, все, что написано на одной стороне выходит на другой стороне. Для процесса входа в систему, getty, например, можно просто использовать одну сторону устройства pty и думать, что это последовательная линия -ваш сервер программа должен обрабатывать другую сторону pty, отправляя все, что он получает от pty вашему клиенту через сеть.

эмуляторы терминалов также используйте ptys, введите tty на ваш терминал, и вы получите что-то вроде /dev/pts/9 если вы используете эмулятор терминала. На другой стороне pty это обычно ваша оболочка, взаимодействующая с эмулятором терминала через pty.

клиентская программа может более или менее просто используйте стандартный вход и стандартный выход. Если информация о вашем терминале верна, остальное будет обрабатываться эмулятором терминала, просто передайте все, что вы получаете от своей серверной программы в stdout, и отправить все, что вы читали из stdin в программу-сервер.

надеюсь, я не упустил ни одной важной детали. Удачи!


возможно иметь ncurses работать на потоках за исключением stdin и stdout. Звоните newterm() до initscr() для установки дескрипторов входных и выходных файлов для ncurses.

но вам нужно будет знать, какой терминал находится на удаленном конце соединения (ssh и telnet имеют механизмы для передачи этого на сервер), и вы также захотите вернуться к интерфейсу без ncurses в случае, если удаленный конец не является поддерживаемым типом терминала (или если вы не можете определить тип терминала.)