Signale oder Besitzstände können nicht "magisch" über eine Steckdose übertragen werden.
Über AF_UNIX können Sie den tty-Dateideskriptor selbst senden (mithilfe von sendmsg und recvmsg) und die empfangende Seite (und nicht den Socket) als stdout / stderr des Unterprozesses verwenden. Dies ist nicht mit plain socat möglich, aber diese Methode wird intern von zB dem Tool tmux verwendet.
Bei plain socat können Sie am besten ein 0x03-Byte (^ C) senden, wenn Sie Strg + C drücken (dies ist die Aufgabe von Telnet und ssh). Sie können dies testen, indem Sie drücken Ctrl+VCtrl+C, um es einmal zu senden, oder indem Sie stty raw
vor socat laufen, um dauerhaft in den "Rohmodus" zu wechseln.
Das reicht jedoch nicht aus, um das Tastendruck zu verstehen . Die grundlegendste Methode wäre, jedes Byte manuell zu prüfen. SIGINT senden, wenn 0x03 angezeigt wird. Schreiben Sie es sonst in den Standardprozess des Unterprozesses.
Was jedoch telnetd und sshd tun, ist das Hinzufügen einer 'Pseudo-tty' zwischen Socket und Subprozess. In Python können Sie eine erstellen os.openpty()
. Die 'Slave'-Seite muss als stdout / stderr des Unterprozesses angegeben werden, und Ihr Skript muss in einer Schleife ausgeführt werden, um Daten zwischen dem Socket und der' Master'-Seite zu kopieren.
Das ist immer noch nicht ganz genug - ein voll ausgestattete Terminal - Login - Protokoll, wie zum Beispiel SSH oder Telnet, würde auch Nachrichten hat die PTYs Dimensionen zu aktualisieren, und reagiert auf termios Einstellungsänderungen (zB die „lokales Echo“ -Einstellung und andere gesehen in stty
).
Es wäre nützlich, den Quellcode des Telnet-Clients und des Telnetd-Servers, z. B. von GNU-Inetutils, zu lesen, da sie genau dies tun.