Выход 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.