-F /dev/stdin 構文を使用すると ssh がすぐに切断されるのはなぜですか?

-F /dev/stdin 構文を使用すると ssh がすぐに切断されるのはなぜですか?

次のコマンドを使用して、デフォルトのUbuntu VMボックスを設定して起動しました。

vagrant init ubuntu/trusty64; vagrant up --provider virtualbox

今度は、教育目的で次の構文を使用してSSHに接続したいと思います。

ssh -F /dev/stdin < <(vagrant ssh-config) default

このコマンドは仮想マシンに正常に接続されますが、印刷後すぐに切断されます。モード

なぜこれが起こるのか、そしてそれを避ける方法があるのか​​知りたいです。

疑似端末割り当てを強制しようとしましたが、成功しませんでした。

次の2つのコマンド構文が期待どおりに機能することがわかります。

vagrant ssh-config > ssh_tmp
ssh -F ssh_tmp default

もしそうなら、プロセス代替構文を使用するときになぜ失敗するのか疑問に思います。

答え1

vagrant ssh-configコマンドの標準入力に渡す出力ですssh。リモートコマンドを実行してリモート標準入力をローカル標準入力に接続すると、ファイルの末尾にssh到達しました。したがって、リモートシェルは標準入力でファイルの終わりを確認し、すぐに終了します。

通常、他のファイル記述子に構成ファイルを渡す必要があります。

ssh -F <(vagrant ssh-config) default

sshただし、デフォルト以外のファイル記述子が設定ファイルを読み取る前に閉じるため、この方法は機能しません。したがって、実際のファイル名をプロセスに渡す必要がありますssh。次の出力を保存したくない場合は、名前付きパイプにすることができますvagrant ssh-config

mkfifo fifo
vagrant ssh-config >fifo &
ssh -F fifo …
rm fifo

zshシェル(macOSでデフォルトで有効)を使用すると、=(...)以下を介してアクセスされるパイプの代わりに一時ファイルを使用するコマンド代替形式を使用できます/dev/fd/x

ssh -F =(vagrant ssh-config) …

/dev/fd/x1 名前付きパイプを使用してプロセス交換が実装されるサポートされていないシステムは除外

関連情報