Ich schreibe ein Go-Programm, das über SSH eine Verbindung zu einem Host herstellt, und zwar mit dem nativen x / crypto / ssh Bibliothek und legen Sie eine interaktive Shell.
Ich benutze RequestPty()
, aber die (bash) Shell an Das Remote-Ende verhält sich nicht wie erwartet mit Steuercodes.
Wenn ich verschiedene Steuerzeichen eingib, werden sie von meinem Terminal wiedergegeben:
%Vor%Die Zeichen funktionieren immer noch in dem Sinne, dass, wenn ich nach dem Drücken des Pfeils nach oben die Eingabetaste drücke, der vorherige Befehl ausgeführt wird - aber die Ausgabe des Steuerzeichens stimmt nicht überein, was dort angezeigt werden soll. Das gleiche gilt für Tab.
Gibt es einen einfachen Weg, um dies zum Laufen zu bringen? Wenn ich ähnliche Systeme in der Vergangenheit implementiert habe, war das kein Problem, da ich gerade nach openssh
ausgeschüttet habe und die Semantik der Prozessgruppen alles aussortiert.
Ich habe The TTY Demystified studiert "und so großartig wie es ist, ist nicht klar, wo ich anfangen soll.
Ein paar Dinge, die ich untersuchen wollte:
openssh
selbst muss diese Arbeit richtig machen, aber es ist eine echte Bestleistung einer Code-Basis zu studieren.
Es ist mir nicht wirklich klar, ob dieses Drucken von meinem lokalen Terminal-Emulator oder Shell oder vom Code auf dem Remote-Host ausgeführt wird.
Wo beginne ich?
Hier ist ein Beispiel meines Codes:
%Vor% Ich habe das mit anderen Termwerten als xterm
: screen-256color
und vt100
versucht.
Für die Aufzeichnung - im echten Code, anstatt nur einen Aufruf von session.Wait()
, habe ich eine for/select
-Schleife, die verschiedene Signale an den Prozess abfängt und sie an die Session
weiterleitet.
Die Einstellungen ssh.ECHO: 0
und ssh.ECHOCTL: 0
funktionierten nicht für mich. Für andere Leute, die auf dieses Problem gestoßen sind, ist unten der grobe Code, der benötigt wurde, um ein voll funktionierendes interaktives Terminal mit der Go ssh Bibliothek zu erhalten:
Beachten Sie, dass alle Tastaturfunktionen (Tabulatorabschluss, Pfeil nach oben) und die Signalverarbeitung ( CTRL + C
, CTRL + D
) korrekt mit der obigen Konfiguration funktionieren.