Frage Der Remote-SSH-Befehl benötigt ein Terminal


Für einen meiner Server ist das meiste, was ich mache, Dateien mit vim zu bearbeiten. Ist es möglich etwas zu tun? ssh me@myserver vim ? Wenn ich das versuche, bekomme ich "Warnung, Ausgabe ist nicht zu einem Terminal" und vim ist unbrauchbar.

Ich lese die ssh-Manpage, aber bash mag nicht das Escape-Zeichen ~ C, um ein Kommando-Terminal zu erstellen.


3
2018-01-04 09:34


Ursprung




Antworten:


Theorie

SSH-Sitzungen können mit - oder ohne - dem Remote-Server gestartet werden, der a Pseudo-Terminal (PTY) -Gerät.

Wenn Sie eine Verbindung zu einem Remote-Host über SSH herstellen (ohne einen Befehl anzugeben), führen Sie normalerweise nach korrekter Authentifizierung Ihre Standard-Login-Shell aus. Wenn diese Shell auf einem Remote-Host ausgeführt wird, wird automatisch ein Pseudoterminal für die interaktive Shell zugewiesen. Dadurch kann die Shell auf den Bildschirm des Benutzers schreiben, um z. B. die Eingabeaufforderung anzuzeigen.

Während der interaktiven Sitzung SSH_TTY Umgebungsvariable wird auf den Geräteknoten des entfernten PTY-Geräts gesetzt, z. /dev/pts/10 und wenn das Pseudo-Terminal endet, ssh gibt die folgende Nachricht aus:

Connection to <remotehost> closed.

Zum nicht interaktiv SSH-Sitzungen, d. H. Spezifiziert einen Befehl zum Ausführen auf dem entfernten Host, wird kein Pseudoterminal zugewiesen und die Befehlsausgabe wird an den stdout des lokalen Terminals. Dieses Standardverhalten funktioniert gut, wenn Befehle ausgeführt werden, die Eingaben einfach lesen stdin und drucken zu stdout und / oder stderr, z.B., ls, psusw. In diesem Fall SSH_TTY Umgebungsvariable ist nicht gesetzt und ich habe auch bemerkt, dass die TERM Umgebungsvariable ist auf festgelegt dumb. Bei einem Betrieb ohne Pseudo-Terminal können die Escape-Zeichen wie z ~C werden nicht unterstützt; Dies macht es für Programme sicher, Binärdateien zu übertragen, die diese Sequenzen enthalten können.

Programme wie z vim oder top müssen in der Lage sein, den Bildschirm unter Verwendung verschiedener Terminalfähigkeiten neu zu zeichnen (typischerweise unter Verwendung der ncurses Bibliothek). Dazu benötigen sie ein Endgerät - oder ein Gerät, das ein Endgerät emuliert. Das ssh Client verfügt über a -t Option, die die Zuweisung eines Pseudo-Terminals erzwingt. Dies -t Die Option ist auf der SSH-Manpage beschrieben:

Pseudo-tty-Zuweisung erzwingen. Dies kann verwendet werden, um beliebige bildschirmbasierte Programme auf einer entfernten Maschine auszuführen, was sehr nützlich sein kann, z. wenn Sie Menüdienste implementieren. Mehrere Optionen -t erzwingen eine Zuweisung, selbst wenn ssh kein lokales Terminal hat.

Fazit

Also, Hinzufügen der -t Die Option zu Ihrem SSH-Befehl ist alles, was Sie tun müssen, um Vim ein Endgerät zur Verfügung zu stellen, das es verwenden kann:

ssh -t me@myserver vim

5
2018-01-04 10:06



Das ist was ich wollte und es funktioniert! Vielen Dank! - Ray Vinmad