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)

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.)


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.)


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.