Output SSH tidak dilindungi garis?

35

Saya menjalankan skrip pada mesin jarak jauh seperti ini:

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

Tetapi output tidak buffer line; alih-alih melihat satu baris dikembalikan pada satu waktu, semua baris (~ 10) semuanya dicetak sekaligus saat koneksi berakhir.

Ada apa dengan ini? Apakah ada cara untuk memaksa mereka menjadi buffer line?

(juga, untuk menyatakan yang jelas: ketika saya ssh ke $hostdan menjalankan perintah "secara manual", outputnya adalah buffered line, seperti yang diharapkan)

David Wolever
sumber

Jawaban:

45

Gunakan ssh -t ...untuk memaksa alokasi pseudo-tty (yang adalah apa yang Anda dapatkan ketika Anda masuk secara normal melalui ssh.)

Ryan Fox
sumber
sayangnya, tidak membantu. Ini juga mungkin masalah dengan MTU, tetapi tidak ada yang membantu
Nick Roz
Lihat komentar Magnus 'di bawah ref menggunakan -tt- yang bekerja untuk saya ketika -t tidak.
Tom Dalton
23

Untuk sedikit memperluas jawaban Ryan Fox: Banyak program (kebanyakan? - ini adalah default untuk semua program C) line-buffer stdout ketika mereka sedang berbicara dengan terminal, tetapi sepenuhnya buffer sebaliknya. (Standar C menentukan bahwa stdout awalnya buffered penuh ketika itu "dapat ditentukan untuk tidak merujuk ke perangkat interaktif".)

Jadi yang Anda lihat adalah bahwa output dari program yang Anda jalankan dari jarak jauh (seperti yang diberikan ke stdout) tidak didukung oleh garis; ssh baru saja melewati apa yang didapatnya saat mendapatkannya. (Saya pikir ssh sebenarnya tidak memiliki buffering sama sekali pada outputnya - itu akan menjadi cara yang paling ajaib untuk memastikan bahwa pengguna melihat apa yang dimaksud dengan program jarak jauh.)

Dave Vandervies
sumber
Seorang pengguna anonim menyarankan bahwa stdout sepenuhnya buffered, bukan buffered baris
Michael Mrozek
Dave Vandervies mengatakan kepada saya out-of-band bahwa dia adalah orang yang melakukan pengeditan, dan itu benar (yaitu, stdout pada awalnya sepenuhnya buffered, bukan line buffered).
David Wolever
6

Untuk lebih memperluas jawaban Ryan Fox, ssh -ttidak berhasil juga untuk saya, tetapi ssh -ttternyata berhasil. Lihat halaman man ssh tentang -t:

Opsi -t ganda memaksa alokasi tty, bahkan jika ssh tidak memiliki tty lokal

Magnus Berg
sumber