La sortie SSH n'est pas en ligne tamponnée?

35

J'exécute un script sur une machine distante comme ceci:

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

Mais la sortie n'est pas en ligne tamponnée; au lieu de voir une ligne renvoyée à la fois, toutes les lignes (~ 10) sont toutes imprimées en même temps à la fin de la connexion.

Quoi de neuf avec ça? Est-il possible de les forcer à être tamponnés?

(aussi, pour énoncer l'évident: quand je ssh dans $hostet exécute la commande "manuellement", la sortie est mise en mémoire tampon, comme prévu)

David Wolever
la source

Réponses:

45

Utilisez ssh -t ...pour forcer une allocation de pseudo-tty (c'est ce que vous obtenez lorsque vous vous connectez normalement via ssh.)

Ryan Fox
la source
n'a pas aidé, malheureusement. Cela pourrait aussi être un problème avec MTU, mais aucun de ceux-ci n'a aidé
Nick Roz
Voir le commentaire de Magnus ci-dessous en utilisant -tt- cela a fonctionné pour moi quand -t ne l'a pas fait.
Tom Dalton
23

Pour approfondir un peu la réponse de Ryan Fox: De nombreux programmes (la plupart? C’est la valeur par défaut de tout programme C) line-buffer stdout lorsqu’ils parlent à un terminal, mais le tamponnent intégralement. (La norme C spécifie que stdout est initialement entièrement mis en mémoire tampon lorsqu'il est "possible de déterminer qu'il ne fait pas référence à un périphérique interactif".)

Donc, ce que vous voyez, c'est que la sortie du programme que vous exécutez à distance (comme donné à stdout) n'est pas en ligne tamponnée; SSH ne fait que passer à travers ce qu'il obtient quand il l'obtient. (Je pense que ssh n'effectue aucune mise en mémoire tampon sur sa sortie - ce serait le moyen le moins magique de s'assurer que l'utilisateur voit ce que le programme distant avait l'intention de faire.)

Dave Vandervies
la source
Un utilisateur anonyme suggère que stdout est entièrement tamponné et non pas tamponné
Michael Mrozek
Dave Vandervies m'a dit hors du groupe qu'il était celui qui avait effectué le montage et qu'il était correct (c'est-à-dire que stdout est initialement intégralement mis en mémoire tampon, pas en ligne).
David Wolever
6

Pour développer encore plus la réponse de Ryan Fox, ssh -tcela ne fonctionnait pas pour moi non plus, mais ssh -ttsi. Voir la page de manuel ssh à propos de -t:

Plusieurs options -t forcent l'allocation de tty, même si ssh n'a pas de tty local

Magnus Berg
la source