Вихід SSH не є буферним?


35

Я запускаю сценарій на віддаленій машині так:

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

Але вихід не буферний; замість того, щоб бачити один рядок, який повертається одночасно, усі рядки (~ 10) друкуються одразу після припинення з'єднання.

Що з цим? Чи є який-небудь спосіб змусити їх бути захищеними від лінії?

(також, щоб констатувати очевидне: коли я впадаю в $hostзапуск і запускаю команду "вручну", вихід буде буферизований, як очікувалося)

Відповіді:


45

Використовуйте ssh -t ...для примусового виділення псевдо-tty (це те, що ви отримуєте при нормальному вході через ssh.)


На жаль, не допомогло. Це також може бути проблемою з MTU, але жодне з цього не допомогло
Нік Роз

Дивіться коментар Магнуса нижче посилання з використанням -tt- що працювало для мене, коли-ні.
Том Далтон

23

Щоб трохи розширити відповідь Райана Фокса: Багато програм (у більшості? - це за замовчуванням для будь-якої програми С) лінійно-буферний відступ, коли вони розмовляють з терміналом, але повністю завантажують його в іншому випадку. (Стандарт C визначає, що stdout спочатку повністю буферизується, коли "можна визначити, що він не посилається на інтерактивний пристрій".)

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


Анонімний користувач припускає, що stdout є повністю завантаженим, а не буферизованим
Michael Mrozek

Дейв Вандервіс сказав мені, що він не входить в групу, що він змінив редакцію, і це правильно (тобто, stdout спочатку повністю буферизований, а не буферний).
Девід Уолвер

6

Щоб ще більше розширити відповідь Райана Фокса, ssh -tдля мене теж ssh -ttне вийшло , але зробив. Дивіться сторінку ssh man про -t:

Опції з декількома параметрами змушують розподіляти tty, навіть якщо ssh не має локальних tty

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.