失敗したSSH転送を致命的なエラーにする

失敗したSSH転送を致命的なエラーにする

SSHを介していくつかのファイルをコピーするためにリモートホストに接続するスクリプトがあります。ポート873でリッスンするrsyncデーモンに接続する必要があります。これを達成するために、次のSSH構成があります。

Host blah
    LocalForward 10873 127.0.0.1:873
    Hostname 10.2.4.1

残念ながら、このスクリプトのタイミングにより、SSHセッションを確立しようとすると、別の同様のスクリプトが他のホストのポートを開くことがあります。

別のSSHセッションが開いている間に接続すると、明確なメッセージが表示されます。住所はすでに使用中です。

me@local:~$ ssh blah
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 10873
Could not request local forwarding.
Linux remote 2.6.26-2-amd64 #1 SMP Tue Jan 25 05:59:43 UTC 2011 x86_64
motd...
remote:~$ 

私が望むのは、終了コードを使用してSSHクライアントをすぐに終了させることです。これにより、誤ったホストに転送されたポートに対してコマンドを実行するのではなく、失敗を報告するロジックをスクリプトに配置できます。

答え1

SSH設定オプションがあります(からssh_config(5)):

転送に失敗した場合
すべての要求に対して動的、トンネリング、ローカル、およびリモートポート転送を設定できない場合は、ssh(1)が接続を終了するかどうかを指定します。引数は「はい」または「いいえ」でなければなりません。デフォルトは「いいえ」です。

したがって、SSH 構成に以下を追加できます。

ExitOnForwardFailure yes

またはコマンドラインから:

$ ssh -o ExitOnForwardFailure=yes blah

関連情報