web-dev-qa-db-ja.com

ssh制御ソケットがすでに存在する場合に中止する方法は?

スクリプトで次の行を使用しています。

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を使用してソケットの存在を確認しても、競合状態が発生する可能性があります。

「コントロールソケットがまだ存在しない場合はそれを開き、存在する場合は終了する」方法を教えてください。

2
finefoot

ControlMaster autoを探していると思います。これは、構成ファイルで指定するか、-o ControlMaster=autoを使用してコマンドラインで直接指定できます。

これにより、接続を開いて使用するコマンドを統合できます(ControlPersistでも非常に役立ちます)。

4
Jakuje