Wie rende ich eine Remote-Ncurses-Konsole?

8

Ich möchte eine Remote-Konsole schreiben, die wie ein Telnet-Server funktioniert. Der Benutzer kann telnet verwenden, um sich beim Server anzumelden, und dann einige Befehle schreiben, um einige Arbeiten auszuführen.

Ein gutes Beispiel dafür ist die Konsole des Router-Betriebssystems. Was ich momentan verwirre ist, ich kann Benutzereingaben akzeptieren, etwas machen und dann einige Texte zurückdrucken, aber ich möchte ncurses verwenden, um die Konsole mit mehr Funktionen zu versehen (wie "cmd auto-complete", Syntaxfarbe ...). ), wie kann ich das tun? Da die Konsole in der Benutzerseite ist, wenn der Server Ncurses-APIs aufruft, wird es nur Sachen auf dem Server ändern ...

Vielleicht ist das eine dumme Frage, aber ich bin wirklich neu dabei. Irgendwelche Vorschläge werden geschätzt.

    
Mark Zhang 05.05.2013, 07:11
quelle

2 Antworten

9

Das ist schwieriger als Sie vielleicht denken.

Sie müssen verstehen, wie Terminals funktionieren - sie verwenden spezielle Kontrollsequenzen für z. Bewegen des Cursors oder der Farbausgabe. Dies wird durch eine terminfo -Datei beschrieben, die terminalspezifisch ist. Ncurses übersetzt API-Aufrufe (z.B. den Cursor zu einer bestimmten Position bewegen) zu solchen Steuersequenzen unter Verwendung von terminfo.

Da das Terminal (heutzutage xterm , gnome-terminal , screen , tmux usw.) auf der Client-Seite ist, müssen Sie den Typ des Terminals vom Client an den Server übergeben. Deshalb z. ssh leitet diese Informationen vom ssh Client an den Server weiter (versuchen Sie echo $TERM in Ihrer ssh Sitzung - es könnte 'linux' sein, wenn Sie über die Konsole angemeldet sind, oder 'xterm', wenn Sie X und ein xterm). Außerdem sollten Sie das entsprechende Terminal auf dem Server verfügbar haben.

Ein weiteres Puzzleteil ist Pseudo-Terminals . Da heutzutage relativ wenige Leute serielle Terminals verwenden, wird ihre Semantik emuliert, so dass Anwendungen und Bibliotheken (z. B. curses und seine Freunde), die ursprünglich für serielle Konsolen entwickelt wurden, weiterhin funktionieren. Dies wird über Pseudo-Terminals erreicht - diese sind wie Pipes, ein Master und ein Slave-Gerät kommunizieren, alles, was auf der einen Seite geschrieben ist, kommt auf der anderen Seite heraus. Für einen Login-Prozess kann getty zum Beispiel nur eine Seite eines pty-Geräts verwenden und denkt, dass es eine serielle Zeile ist - Ihr Server-Programm muss die andere Seite des pty handhaben und alles senden kommt von der Pty zu Ihrem Kunden über das Netzwerk.

Terminal-Emulatoren verwenden auch ptys, geben Sie tty in Ihr Terminal ein, und Sie erhalten etwas wie /dev/pts/9 , wenn Sie einen Terminalemulator verwenden. Auf der anderen Seite ist es normalerweise Ihre Shell, die mit Ihrem Terminal-Emulator über den Pty kommuniziert.

Ihr Client-Programm kann mehr oder weniger einfach Standardeingabe und Standardausgabe verwenden. Wenn Ihre Terminalinformationen korrekt sind, wird der Rest von Ihrem Terminal-Emulator verarbeitet, übergeben Sie einfach alles, was Sie von Ihrem Serverprogramm erhalten, an stdout und senden Sie alles, was Sie von stdin gelesen haben, an Ihr Serverprogramm.

Hoffentlich habe ich kein wichtiges Detail weggelassen. Viel Glück!

    
ldx 06.05.2013, 22:00
quelle
2

Es ist möglich, dass ncurses auf anderen Streams als stdin und stdout ausgeführt wird. Rufen Sie newterm() vor initscr() auf, um die Eingabe- und Ausgabedatei-Handles für ncurses festzulegen.

Aber Sie müssen wissen, welche Art von Terminal auf dem Remote-Ende der Verbindung ist (ssh und telnet haben beide Mechanismen, um dies mit dem Server zu kommunizieren), und Sie wollen auch auf eine Nicht-Ncurses-Schnittstelle zurückgreifen Falls das entfernte Ende kein unterstützter Terminaltyp ist (oder wenn Sie den Terminaltyp nicht bestimmen können).

    
Craig 07.05.2013 22:45
quelle

Tags und Links