Gibt es eine Möglichkeit, die SSH-Tippverzögerung zu vermeiden?

43

Kann ich SSH anweisen, die Daten nur nach Drücken der Eingabetaste oder der Tabulatortaste und nicht nach jedem einzelnen Tastendruck zu senden?

StackedCrooked
quelle
Ich bin sehr interessiert, wo Sie eine solche Tippverzögerung haben, dass Sie nicht damit arbeiten können. Ich habe ssh im Modem-Zeitalter benutzt und mich diesen Problemen nie gestellt.
mailq
4
Ich greife auf ein SliceHost VPS (USA) aus Belgien zu. Die Verzögerung ist merklich genug, um mich zu verwirren. Allerdings habe ich bemerkt, dass andere Leute scheinen weniger
gestört
5
mosh.mit.edu
alfC
@mailq verwenden Sie nicht 3G im Jahr 2019? Wenn Sie vom Dorf-Landhaus oder der U-Bahn kommen, tun Sie das eher mit einer Einwahl
POMATu

Antworten:

32

Nein, da SSH nicht weiß, ob für die Eingabe eine Eingabe oder ein Tabulator erforderlich ist. Wenn Sie beispielsweise versuchen, den Befehlsverlauf durchzugehen, werden die ^RPfeile oder die Aufwärtspfeile nicht von gesendet sich selbst, und das wäre ... unangenehm.

Sie müssen jedoch nicht zwischen den einzelnen Zeichen warten, bis sie auf dem Bildschirm angezeigt werden. Wenn Sie wissen, was Sie tippen müssen, können Sie es so schnell wie Sie möchten ausprobieren, und das Terminal holt in etwa einer Umlaufzeit ab dem Zeitpunkt, an dem Sie mit dem Tippen aufgehört haben, wieder auf ein zeilengepuffertes Setup (Paketverlust ist anders, aber es bringt seine eigenen interessanten Macken mit sich).

womble
quelle
Ich wäre wirklich daran interessiert, einen Weg zu finden, um die ssh-Typisierungsgeschwindigkeit auf mehreren Maschinen zu messen. Ich habe festgestellt, dass die Geschwindigkeit zwischen Maschinen, die sich am selben Ort befinden und nicht stark belastet sind, sehr unterschiedlich sein kann. Meine Theorie besagt, dass dies besonders bei kleinen Instanzen von AWS (wie Micro- oder Mini-Instanzen) der Fall ist.
Sorin
1
Schauen Sie sich das Mosh-Papier an. Der Autor hat ein Benchmarking durchgeführt mosh.org/#techinfo
user7610
25

PuTTY bietet zwei nützliche Funktionen: "lokales Echo" und "lokale Leitungsbearbeitung". Die lokale Leitungsbearbeitung puffert alles und sendet es erst nach einem Zeilenumbruch an den Server. Das kann den Umgang mit der Befehlszeile erleichtern, aber auch die Verwendung eines Texteditors zur Hölle machen.

PuTTY bietet auch einige andere Optionen zum Aktivieren / Deaktivieren bestimmter Dinge (Nagles Algorithmus), die sich auf die wahrgenommene Verbindungslatenz auswirken können. Aus meiner Sicht bietet der OpenSSH-Client nicht alle Funktionen, die PuTTY in dieser Hinsicht bietet, und ich kenne keine vergleichbare Linux-Alternative.

Ansonsten hat womble es richtig.

Jeff Ferland
quelle
Dies sollte die akzeptierte Antwort sein
Freddie Fabregas
Ich konnte PuTTY unter MacOS nicht installieren. Gibt es einen Ersatz?
Aero Windwalker
Putty unter Linux ist ein bisschen schmerzhaft. Die Verbindung kann nicht automatisch wiederhergestellt werden, beim Trennen wird eine Meldung angezeigt und ich muss das Fenster erneut öffnen. Ich wünschte, ich könnte etwas wie kitty oder plink.exe unter Linux oder besser verwenden, um autossh irgendwie zu optimieren. Einige Geräte unterstützen mosh tho nicht (wenn ich versuche, auf meinen openwrt-Router zu Hause zuzugreifen)
POMATu
21

Mosh wurde entwickelt, um genau dieses Problem anzugehen. Es wurde für Verbindungen mit hoher Latenz und unzuverlässigen Verbindungen entwickelt und bietet lokales Echo und Line-Editing.

Steven C. Howell
quelle
Sie können es ohne sudo von der Quelle in einem lokalen Verzeichnis installieren. Besuchen Sie auch mosh.org. Es heißt: "Kein privilegierter Code. Kein Daemon. Sie müssen nicht der Superuser sein, um Mosh zu installieren oder auszuführen. Der Client und der Server sind ausführbare Dateien, die von einem normalen Benutzer ausgeführt werden und nur für die Dauer der Verbindung gültig sind."
Steven C. Howell
1
Nur um zu merken. Mosh ist keine SSH. Es verwendet ein eigenes proprietäres Protokoll. (Damit habe ich allerdings kein Problem.)
user7610
Dies funktionierte von Grund auf für mich auf Android und Home Bad WiFi-Netzwerk. Es weiß über
Readline
9

Öffnen Sie die ssh-Sitzung mit ssh host.example.org bash(oder einer beliebigen Shell, die Sie verwenden möchten).

Sie erhalten einen zeilengepufferten Modus für die Remote-Shell, was bedeutet, dass Sie keine Eingabeaufforderung und keine Zeilenbearbeitung erhalten, sondern ein lokales Echo und den Modus "Zeile für Zeile". Dies ist manchmal nützlich, wenn Sie mit einer sehr schlechten Verbindung arbeiten. Nicht alle Programme werden ordnungsgemäß ausgeführt, da Sie keine Pseudotty haben, aber die meisten UNIX-Dienstprogramme funktionieren einwandfrei.

Aktualisieren:

Wenn Sie den obigen Trick verwenden, können Sie die normale Zeilenbearbeitung ( readline ) am lokalen Ende mithilfe eines praktischen Wrapper-Programms namens rlfe durchführen . Renn einfach rlfe ssh host.example.org bash.

schnappen
quelle
1
Ich habe es versucht und fand es nicht sehr praktikabel. Aber es ist cool zu wissen, danke.
StackedCrooked
das funktioniert wunderbar bei mir.
Lakesare
6

Nachdem ich das gleiche Problem hatte ( hohe Latenz und Paketverlust aufgrund der schlechten Qualität der mobilen Daten an einigen Standorten) und es möglicherweise nicht für mich schneiden musste (es erfordert spezielle Programme auf allen Remote-Hosts, die UTF8 lokal und remote auf allen Servern reparieren, ohne sie zu beschädigen) Ich habe beschlossen, einen kleinen Wrapper zu schreiben, um den lokalen Zeilenbearbeitungsmodus für ssh bereitzustellen .

Standardmäßig wird im standardmäßigen char-by-char-Modus nur alles an ssh übergeben. Sie können jedoch jederzeit einen Hotkey drücken, um in den readline-basierten Bearbeitungsmodus für lokale Leitungen zu wechseln. Sie können also die gesamte Zeile lokal eingeben (mit Bearbeiten, Abrufen von Befehlen usw.). Wenn Sie dann die Eingabetaste drücken , wird sie als ein TCP-Paket an die Remote-Seite gesendet.

Vorteil ist das verzögerungsfreie Editieren der Kommandozeile (wie beim alten Telnet-gekochten / kanonischen "zeilenweise gepufferten Modus", jedoch mit überlegenen Editierbefehlen, die von GNU readline bereitgestellt werden ). Außerdem muss an Servern oder Firewalls nichts geändert werden. Und Editoren und andere Programme, die auf Flüchen basieren, arbeiten im standardmäßigen char-by-char-Modus wie bei einer normalen ssh-Verbindung normal weiter (wenn auch mit Verzögerung).

Nachteil ist, dass Sie entweder den Hotkey drücken müssen, um jedes Mal in den Bearbeitungsmodus für lokale Leitungen zu wechseln, oder die Eingabeaufforderung auf dem Remote-Host ändern müssen, um die automatische Erkennung zuzulassen. Außerdem funktioniert die Vervollständigung des Dateinamens auf einer Remote- Registerkarte derzeit nur, indem Sie in den char-by-char-Modus zurückkehren (oder, abhängig von Ihren Einstellungen, das lokale Dateisystem anstelle des Remote-Dateisystems verwenden). Es ist jedoch noch in Arbeit, daher sind Pull-Anfragen oder umsetzbare Verbesserungsvorschläge willkommen!


Auf der unkonventionellen Seite könnten Sie alternativ SSHFS verwenden , um das entfernte Dateisystem lokal einzuhängen.

Der Vorteil ist nicht nur, dass Ihre Shell (und ihre Zeilenbearbeitung) lokal und verzögerungsfrei ist, sondern auch, dass Sie im Remote-Dateisystem navigieren und die Dateinamenvervollständigung ( Tabulatortaste ) der Shell für Remote-Dateien verwenden können. Außerdem können Sie (meiner Meinung nach die beste Funktion) den lokalen Editor Ihrer Wahl zum verzögerten Bearbeiten von Remotedateien verwenden.

Nachteile sind (insbesondere, wenn Sie eine Verbindung mit geringer Bandbreite und nicht nur hoher Latenz herstellen), dass jede zu bearbeitende Datei vollständig an localhost und nach der Bearbeitung erneut vollständig an remote übertragen werden muss. SSHFS sorgt für ein gewisses Caching (siehe sshfs (1) options cache , cache_timeout , cache_x_timeout ), um diese Probleme etwas zu lindern. Wenn Sie etwas auf einem Remote- Computer ausführen möchten, müssen Sie einen anderen Bildschirm verwenden oder allen Befehlen das Präfix " ssh remotehost " voranstellen (zum Beispiel ssh remotehost sudo service apache restart). Siehe Option ControlMaster in ssh_config (5) , um die Ausführung zu beschleunigen (und ohne Passwortabfrage).

Matija Nalis
quelle
3

Sie können dieses Verhalten emulieren, wenn Sie nur Befehle ausführen, indem Sie

ssh user @ targetmachine 'meine Befehle in einem String'

aber,

  1. Dies fügt eine zusätzliche Verzögerung beim Herstellen der Verbindung hinzu (kann mithilfe von Master- / Shared-SSH-Verbindungen verringert werden ).
  2. Wenn Sie keinen kennwortlosen privaten Schlüssel haben, müssen Sie ssh-agentdas Kennwort verwenden oder eingeben
  3. Offensichtlich funktioniert es nicht, wenn Sie mit Menüs interagieren, Dateien bearbeiten usw.
EightBitTony
quelle
1

Sie können tmux verwenden, um ein flüssiges Echo Ihrer Eingabe zu erzielen. Führen Sie tmux lokal aus. Wenn Sie die SSH-Shell in einem Bereich und eine lokale Shell in einem Bereich darunter haben, können Sie über den lokalen Bereich Schlüssel an den Remote-Bereich senden.

tmux send-keys -t top 'ls' C-m

Interaktive Befehle und kleine Befehle gebe ich direkt in die nacheilende SSH-Shell ein. Sobald die Verzögerung meine Eingabe behindert, wechsle ich in den lokalen Bereich und benutze die Sendetasten. Dies funktioniert sogar während der Eingabe eines Befehls.

Um es zu verkürzen, fügte ich dieses meinem .bashrc hinzu

function ts {
    args=$@
    tmux send-keys -t right "$args" C-m
}

Vielen Dank an Christian Pelczarski für die Erklärung der Send-Keys: https://minimul.com/increased-developer-productivity-with-tmux-part-5.html

Sie müssen beispielsweise bei der Verwendung von Anführungszeichen die Flucht ergreifen

ts git config --global alias.lola \'log --graph --decorate --pretty=oneline --abbrev-commit --all\'
Kjell
quelle
0

Das macht was du willst. Sie müssen jedoch sowohl den Client als auch den Server installieren, und der OpenSSH-Upstream hat die Änderungen nie übernommen. https://github.com/hyc/OpenSSH-LINEMODE

hyc
quelle