SSH-Ausgabe ist nicht zeilengepuffert?

35

Ich führe ein Skript auf einem entfernten Rechner wie folgt aus:

ssh $host "pip install -r /path/to/requirements.txt"

Die Ausgabe ist jedoch nicht zeilengepuffert. Anstatt immer nur eine Zeile zu sehen, werden alle Zeilen (~ 10) gleichzeitig gedruckt, wenn die Verbindung beendet wird.

Was ist damit los? Gibt es eine Möglichkeit, die Zeilenpufferung zu erzwingen?

(Um das Offensichtliche zu verdeutlichen: Wenn ich $hostden Befehl "manuell" eingebe und ausführe, wird die Ausgabe wie erwartet zeilengepuffert.)

David Wolever
quelle

Antworten:

45

Verwenden ssh -t ...Sie diese Option, um eine Pseudotty-Zuweisung zu erzwingen (diese erhalten Sie, wenn Sie sich normalerweise über ssh anmelden.)

Ryan Fox
quelle
hat leider nicht geholfen. Dies könnte auch ein Problem mit der MTU sein, aber beides hat nicht geholfen
Nick Roz,
Siehe Magnus 'Kommentar unter ref using -tt- das hat bei mir funktioniert, als -t nicht.
Tom Dalton
23

Um die Antwort von Ryan Fox ein wenig zu erläutern: Viele Programme (die meisten? - das ist die Standardeinstellung für jedes C-Programm) puffern stdout, wenn sie mit einem Terminal sprechen, aber puffern es andernfalls vollständig. (Der C-Standard gibt an, dass stdout anfangs vollständig gepuffert ist, wenn festgestellt werden kann, dass es sich nicht um ein interaktives Gerät handelt.)

Sie sehen also, dass die Ausgabe des Programms, das Sie remote ausführen (wie bei stdout angegeben), nicht zeilengepuffert ist. ssh durchläuft nur das, was es bekommt, wenn es es bekommt. (Ich denke, ssh puffert überhaupt nicht an seiner Ausgabe - das wäre die am wenigsten magische Art, um sicherzustellen, dass der Benutzer sieht, was das Remote-Programm beabsichtigt hat.)

Dave Vandervies
quelle
Ein anonymer Benutzer schlägt vor, dass stdout vollständig und nicht zeilenweise gepuffert ist
Michael Mrozek
Dave Vandervies hat mir außerhalb der Band gesagt, dass er derjenige war, der die Bearbeitung vorgenommen hat, und dass sie korrekt ist (dh stdout ist anfangs vollständig gepuffert, nicht zeilengepuffert).
David Wolever
6

Ryan Fox 'Antwort noch ausführlicher darzulegen, ssh -that auch bei mir nicht funktioniert, aber es hat ssh -ttfunktioniert. Siehe die SSH-Manpage über -t:

Mehrere -t-Optionen erzwingen die Zuweisung von tty, auch wenn ssh kein lokales tty hat

Magnus Berg
quelle