Wyjście SSH nie jest buforowane w linii?

35

Używam skryptu na zdalnym komputerze, takim jak ten:

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

Ale wynik nie jest buforowany wierszowo; zamiast widzieć, że jedna linia jest zwracana na raz, wszystkie linie (~ 10) są drukowane jednocześnie po zakończeniu połączenia.

O co chodzi? Czy istnieje sposób, aby zmusić je do buforowania linii?

(również, aby powiedzieć oczywiste: kiedy ssh $hosti uruchomię polecenie „ręcznie”, dane wyjściowe są buforowane zgodnie z oczekiwaniami)

David Wolever
źródło

Odpowiedzi:

45

Użyj, ssh -t ...aby wymusić alokację pseudo-tty (to jest to, co dostajesz, gdy logujesz się normalnie przez ssh.)

Ryan Fox
źródło
nie pomogło niestety. Może to być również problem z MTU, ale żadne z nich nie pomogło
Nick Roz
Zobacz komentarz Magnusa poniżej przy użyciu ref -tt- to zadziałało dla mnie, gdy -t nie.
Tom Dalton
23

Aby nieco rozwinąć odpowiedź Ryana Foxa: Wiele programów (większość? - jest to domyślna dla każdego programu w języku C) stdout bufora linii, gdy rozmawiają z terminalem, ale w przeciwnym razie całkowicie je buforują. (Norma C określa, że ​​stdout jest początkowo w pełni buforowany, gdy „można stwierdzić, że nie odnosi się do urządzenia interaktywnego”).

Widzisz więc, że dane wyjściowe programu, który uruchamiasz zdalnie (jak podano dla stdout), nie są buforowane w linii; ssh po prostu przechodzi przez to, co dostaje, kiedy to dostaje. (Myślę, że ssh w ogóle nie buforuje danych wyjściowych - byłby to najmniej magiczny sposób upewnienia się, że użytkownik zobaczy, co zamierzał zdalny program).

Dave Vandervies
źródło
Anonimowy użytkownik sugeruje, że standardowe wyjście jest w pełni buforowane, a nie buforowane liniowo
Michael Mrozek
Dave Vandervies powiedział mi poza pasmem, że to on dokonał edycji i że jest poprawny (tzn. Standardowe wyjście jest w pełni buforowane, a nie buforowane liniowo).
David Wolever
6

Aby jeszcze bardziej rozwinąć odpowiedź Ryana Foxa, ssh -tteż nie działało to dla mnie, ale zadziałało ssh -tt. Zobacz stronę man ssh o -t:

Wiele opcji -t wymusza alokację tty, nawet jeśli ssh nie ma lokalnego tty

Magnus Berg
źródło