スクリプトで次の行を使用しています。
ssh -f -N -M -S <control socket> <Host>
つまり、最初の接続はバックグラウンドにとどまり、ssh
への以降の呼び出しに使用できます。
ssh -S <control socket> <Host> <command>
ただし、同じ制御ソケットを使用するはずのコマンドを含むスクリプトが複数あり、それらすべてにssh
への「バックグラウンド」呼び出しを入れると、ある時点で次のメッセージが表示されます。
ControlSocket <control socket> already exists, disabling multiplexing
明らかにソケットが存在し、後続のssh
コマンドで使用できるため、これはスクリプトの残りの部分には影響しません。ただし、「バックグラウンド」セッションでソケットを開くことができなくても、多重化せずに終了せず、アクティブのままです。
[ -S
またはssh -O check
を使用してソケットの存在を確認しても、競合状態が発生する可能性があります。
「コントロールソケットがまだ存在しない場合はそれを開き、存在する場合は終了する」方法を教えてください。
ControlMaster auto
を探していると思います。これは、構成ファイルで指定するか、-o ControlMaster=auto
を使用してコマンドラインで直接指定できます。
これにより、接続を開いて使用するコマンドを統合できます(ControlPersist
でも非常に役立ちます)。