SSH出力はラインバッファリングされていませんか?


35

このようなリモートマシンでスクリプトを実行しています。

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

ただし、出力は行バッファリングされません。接続が終了すると、一度に1行が返されるのではなく、すべての行(〜10)がすべて一度に印刷されます。

これはどうしたの?それらを強制的に行バッファリングする方法はありますか?

(また、明白に言うと:$hostコマンドをssh で実行して「手動で」実行すると、出力は期待どおりに行バッファーされます)

回答:


45

ssh -t ...擬似tty割り当てを強制するために使用します(ssh経由で通常ログインしたときに得られるものです)。


残念ながら、助けにはなりませんでした。また、これはMTUに問題があるが、それの助けでもないかもしれない
ニック・ロズ

以下のMagnusのコメントを参照してください-tt
トムダルトン

23

ライアン・フォックスの答えを少し拡大するには:多くのプログラム(ほとんど?-Cプログラムのデフォルト)は、端末と通信しているときはstdoutを行バッファしますが、そうでなければ完全にバッファします。(C標準では、「対話型デバイスを参照しないと判断できる」場合、stdoutは最初は完全にバッファリングされると規定されています。)

したがって、あなたが見ているのは、リモートで実行しているプログラムの出力(stdoutに与えられている)が行バッファリングされていないということです。sshは、取得したときに取得したものを通過するだけです。(実際には、sshはその出力でバッファリングをまったく行わないと思います。これは、リモートプログラムが意図したものをユーザーに表示させるための最も魔法の方法です。)


匿名ユーザー、stdoutが行バッファーではなく完全にバッファーされること示唆しています
Michael Mrozek

Dave Vanderviesは、彼が編集を行った人であり、それが正しいことを帯域外で教えてくれました(つまり、stdoutはラインバッファリングではなく、最初は完全にバッファリングされています)。
デビッドウォレバー

6

ライアン・フォックスの答えをさらに拡大することssh -tは、私にとってもうまくいきませんでしたが、うまくいきましssh -ttた。-tに関するsshのマニュアルページを参照してください。

複数の-tオプションは、sshにローカルttyがない場合でも、ttyの割り当てを強制します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.