Как визуализировать удаленную консоль 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 в случае, если удаленный конец не является поддерживаемым типом терминала (или если вы не можете определить тип терминала.)