Выход SSH не буферизован?

35

Я запускаю скрипт на удаленной машине, как это:

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

Но вывод не буферизован строкой; вместо того, чтобы видеть по одной строке, возвращаемой за раз, все строки (~ 10) печатаются сразу, когда соединение разрывается.

Что с этим? Есть ли способ заставить их быть буферизованными?

(также, чтобы заявить очевидное: когда я $hostзапускаю и запускаю команду «вручную», вывод буферизуется, как и ожидалось)

Дэвид Волевер
источник

Ответы:

45

Используйте ssh -t ...для принудительного выделения псевдо-tty (это то, что вы получаете, когда вы обычно входите через ssh.)

Райан Фокс
источник
не помогло, к сожалению. Это также может быть проблемой с MTU, но ни одна из них не помогла
Ник Роз
См. Комментарий Магнуса ниже с помощью ссылки -tt- это сработало для меня, когда -t нет.
Том Далтон
23

Чтобы немного расширить ответ Райана Фокса: Многие программы (большинство? - по умолчанию для любой программы на C) выводят строковый буфер, когда они общаются с терминалом, но в противном случае полностью буферизуют его. (Стандарт C определяет, что стандартный вывод изначально полностью буферизируется, когда он «может быть определен как не относящийся к интерактивному устройству».)

Итак, вы видите, что выходные данные программы, которую вы запускаете удаленно (как указано в stdout), не являются буферизованными строками; ssh просто проходит через то, что получает, когда получает. (Я думаю, что ssh на самом деле вообще не буферизирует свои выходные данные - это был бы наименее волшебный способ убедиться, что пользователь видит то, что предназначала удаленная программа.)

Дейв Вандервис
источник
Анонимный пользователь предполагает, что stdout полностью буферизован, а не буферизован строкой
Майкл Мрозек
Дэйв Вандервис сказал мне вне группы, что он был тем, кто сделал редактирование, и что это правильно (то есть stdout изначально полностью буферизован, а не буферизован строкой).
Дэвид Вулевер
6

Более подробно об ответе Райана Фокса ssh -tу меня тоже не получилось, но сработало ssh -tt. Смотрите страницу руководства ssh о -t:

Несколько опций -t принудительно распределяют tty, даже если ssh не имеет локального tty

Магнус Берг
источник