sshは尋ねずにstdinを読みます。

sshは尋ねずにstdinを読みます。

これらは異なって働きます:

$ seq 1000000 | (ssh localhost sleep 1; wc -l)
675173
$ seq 1000000 | (ssh localhost sleep 1 </dev/null; wc -l)
1000000

stdinを読む理由は何ですかssh

ベストアンサー1

-nsshは、オプション(またはoptions)を使用して読み取らないように指示しない限り、常に標準入力を読み込みます-f

その理由は、次のようなことができるからです。

tar cf - somedir | ssh otherhost "tar xf -"

sshはリモートコマンドが入力を許可するかどうかを知らないため、常にこれを行います。

おそらく最初のコマンドで起こることができるのは、seqがネットワークとパイプバッファ(seq - > ssh - > sleep)を埋め、sleepは何も読み取らないため、より多くの読み込みを待ってブロックされ、次にsleepが終了してこの問題が発生するということですです。バッファ全体をダンプした後、seqはブロック解除され、残りはwcに送信されます。

次のような結果が得られます。seq 1000000 | ( cat | cat | sleep 1; wc -l)

2番目のコマンドではまだstdinを読み込んでいますが、外部で/ dev / nullをstdinに割り当てました。

おすすめ記事