単純に
を使用できますssh -o ControlPath=$socket -O check
開いた $socket ごとに (単一のディレクトリに保存すると簡単です)。
これは、チェックが失敗した場合 (接続がアクティブでなくなった場合) 255 を返し、パスした場合は別の値を返します。ホスト名も指定する必要があるかもしれませんが、$socket の awk が提供しないものは何もありません:)
@Renik の回答はうまくいきませんでした。何が行われたかについては、以下を参照してください。
これは、コントロール マスターのソケット ファイルのみを使用して機能します。
$ ssh -o ControlPath=~/.ssh/<controlfile> -O check <bogus arg>
注: ssh -S ~/.ssh/<controlfile> ...
も使用できます 同様に、これは上記を少し短くしたものです。
例
以下は、リモート サーバーへの接続を既に確立している例です:
$ ssh -S ~/.ssh/master-57db26a0499dfd881986e23a2e4dd5c5c63e26c2 -O check blah
Master running (pid=89228)
$
接続を外した状態:
$ ssh -S ~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O check blah
Control socket connect(/Users/user1/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74): No such file or directory
$
まだ接続されている場合は、すぐに強制的に終了します:
$ ssh -S ~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O exit blah
Exit request sent.
$
私には不明ですが、潜在的に ssh
のバグのようです blah
にもかかわらず、最後に追加の引数が必要であること 私が使用しているスイッチのコンテキストでは意味がありません。
それがなければ、これが得られます:
$ ssh -S ~/.ssh/master-57db26a0499dfd881986e23a2e4dd5c5c63e26c2 -O check
usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-E log_file] [-e escape_char]
[-F configfile] [-I pkcs11] [-i identity_file]
[-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec]
[-O ctl_cmd] [-o option] [-p port]
[-Q cipher | cipher-auth | mac | kex | key]
[-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port]
[-w local_tun[:remote_tun]] [[email protected]]hostname [command]
バージョン情報
OSX$ ssh -V
OpenSSH_6.9p1, LibreSSL 2.1.8
CentOS 7.x $ ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
これらのバージョンの両方で、追加の偽の引数が必要であることを確認しました.
参考文献
- ssh ControlMaster 接続を手動で閉じる (強制終了する) 方法
- lsof や fuser を使用せずに OpenSSH コントロール マスター プロセスを終了する方法