Match exec
接続が確立されたら、SSH機能を使用してスクリプトをトリガーします。たとえば、次のようになります。
Match host foo* exec "/some/script.sh"
Host foo
User ubuntu
[... rest of ssh config file truncated ...]
/some/script.sh
私が直面した問題は、exec(この場合)で呼び出されたスクリプトの終了コードに関係なく、sshがすべての接続を継続することです。
スクリプトがゼロ以外のコードで終了した場合は、すべてを停止させる方法はありますか(ssh接続を続行しません)?
答え1
注:スクリプトの効果がわかっている場合は、接続をブロックする以外に他の可能性があります。たとえば、スクリプトがラップトップが現在特定のネットワークを使用しているかどうかを確認したい場合は、切断するのではなくProxyJump
中間サーバーを使用して接続できます。
スクリプトが失敗したときにゼロ以外の値で終了すると仮定すると、スクリプトが失敗し!
たときに接続が失敗するようにするアクティブ化構成を使用して、スクリプトの戻り条件を元に戻すことができます(もちろん、スクリプトの終了コードを元に戻すこともできます)。Match
この行の下のパラメータは、スクリプトが失敗した場合にのみ使用されます。
Match host foo* exec "! /some/script.sh"
... some settings to derail the connection: see below ...
Host foo
User ubuntu
[... rest of ssh config file truncated ...]
接続を具体的にブロックするオプションはわかりませんが、特定のパラメータを使用して接続を破壊できます。
接続障害を保証するすべてのパラメータを使用できます。一部の機能はオペレーティングシステムによって異なる場合があります。... some settings to derail the connection: see below ...
失敗した接続を置き換えるためのいくつかの例は次のとおりです。
代替アドレスとポートを使用し
Hostname 127.0.0.1
、Port xxxx
リッスンなしでどこかに接続されていることを確認してください。Hostname 127.0.0.1 Port 2345
スクリプトが失敗した場合にのみ、次のようになります。
$ ssh foo ssh: connect to host 127.0.0.1 port 2345: Connection refused
ルートアクセス権を持つ人は、これに失敗したIPアドレスを指定できます(ポートを変更する必要はありません)。
Linuxでrootとして実行する例:
ip route add unreachable 192.0.2.2/32
それから:
Hostname 192.0.2.2
与える:
$ ssh foo ssh: connect to host 192.0.2.2 port 22: No route to host
(Linux)
lo
インターフェイスにバインドすると、ルーティングは失敗します。BindInterface lo
与える:
$ ssh foo ssh: connect to host foo port 22: Invalid argument
ただし、これはssh自体を防止しません(たとえば、
foo
システム自体のアドレスなど)。不明なホスト
GlobalKnownHostsFile /dev/null UserKnownHostsFile /dev/null StrictHostKeyChecking yes ConnectTimeout 1
引き続き接続しようとしましたが、ホストから提供された指紋が見つからないため失敗します。
$ ssh foo No ECDSA host key is known for foo and you have requested strict checking. Host key verification failed.
もちろん、スクリプトの失敗が接続の問題に関連している場合はこれだけでは不十分ですが、タイムアウトによってこれを軽減でき、わずか1秒後に次のような結果が得られます。
$ ssh foo ssh: connect to host foo port 22: Connection timed out