対話型セッションに到達するための SSH 接続タイムアウト

対話型セッションに到達するための SSH 接続タイムアウト

動作が不安定な SSH サーバーに接続する場合、短時間で対話型コンソールに到達できなかった場合にクライアントに早期に諦めるように指示するために使用できるフラグまたは構成設定はありますか?

ホストが到達不能な場合、接続を中止する方法はわかっています-o ConnectTimeout。この場合、ホストは到達可能で、最初の接続はすぐに行われます (「サーバーがキーを受け入れます」は 1 秒未満)。ただし、PAM のレイヤーの一部が故障すると、実際のコマンド プロンプトが 3 秒後、12 秒後、またはまったく表示されない可能性があります。Ctrl+C を送信するか、「[ホスト] ポート 22 への接続がタイムアウトしました」が表示されるまで 90 秒待つまで、接続は停止します。

根本的な原因が修正されるまで (この質問で解決しようとしているわけではありません)、症状を軽減するために何かできることはありますか? 5 秒以内に役立つプロンプトが表示されない場合は、自動的に切断するようにします。

答え1

基礎となる接続が安定しており、PAM ルーレットをプレイせずに複数のセッションを開くことが主な目的である場合、「マスター」モードが役立つ場合があります。

ssh -M -S /tmp/reusable.sock user@host

Ctrl+C/90 秒のタイムアウトの戦いに初めて勝利すると、他のターミナルは次のようにしてすぐに開くことができます。

ssh -S /tmp/reusable.sock user@host

これは、元の接続が開いている限り機能します。接続時間の短縮は、問題が認証ステップにあることを前提としています(このようにソケットを多重化すると再認証がバイパスされるため)。

答え2

ポート転送が設定される前に接続が停止した場合は、ソケットをセマフォとして活用し、独自のウォッチドッグをハックすることができます。

lfg.sh:

#!/bin/bash
set -m

function watchdog {
    sleep $1
    if [[ ! -S "/tmp/lfg.$2" ]]; then
        kill -STOP $3
    fi
}

ssh -L /tmp/lfg.$$:localhost:1234 $1 && rm -f /tmp/lfg.$$ &
watchdog $2 $$ $! &
fg %-

使用法:

lfg grumpy-host 5

lfgまずジョブ制御を有効にし、任意のリモート ポートに転送されるsshローカル ソケットの要求を開始します。このジョブをバックグラウンドに置き、ウォッチドッグ関数に 5 秒間待機してからソケットを探すように要求します。ソケットが見つからない場合は、停止した ssh プロセスを強制終了します。sshをフォアグラウンドに戻すので、対話型になるとすぐに開始されます。5 秒以上かかる場合は、ローカル プロンプトに戻ります。/tmp/lfg.nnnfg %-

関連情報