SSH接続でのServerAliveIntervalの動作

SSH接続でのServerAliveIntervalの動作

SSH を使用して別のシステムにログインし、そこで新しいマシンを作成するスクリプトを実行し、いくつかのセットアップを行っています。これには約 7 ~ 8 時間かかります。つまり、SSH 接続が切断され続け、スクリプトの実行が失敗して常にタイムアウトが発生します。

そこで、私は SSH 接続とともにこの引数を使用しています:

ssh -o ServerAliveInterval=60 user@host ....

この ssh は複数回生成されます。問題は、数回の ssh 接続後にエラーが発生することです。

too many logins of userログインが成功した直後に SSH 接続が閉じられます。

それは、サーバーアライブ間隔、これにより、SSH 作業が終了した後でもリモート マシンの SSH ユーザー ログイン セッションが維持され、それ以降のログインが切断されるのはなぜですか?

答え1

クライアントが接続を失った場合、これでセッションが維持されるとは思えません。おそらくサーバー側のオプションが原因だと思います:

クライアントアライブカウント最大

sshd(8) がクライアントからメッセージを受信せずに送信できるクライアント アライブ メッセージの数を設定します。クライアント アライブ メッセージの送信中にこのしきい値に達すると、sshd はクライアントを切断し、セッションを終了します。クライアント アライブ メッセージの使用は TCPKeepAlive とはまったく異なることに注意してください。クライアント アライブ メッセージは暗号化されたチャネルを介して送信されるため、偽装できません。TCPKeepAlive によって有効になる TCP キープアライブ オプションは偽装可能です。クライアント アライブ メカニズムは、クライアントまたはサーバーが接続が非アクティブになったことを知る必要がある場合に便利です。

デフォルト値は 3 です。ClientAliveInterval が 15 に設定され、ClientAliveCountMax がデフォルトのままになっている場合、応答しない SSH クライアントは約 45 秒後に切断されます。

クライアントアライブ間隔

タイムアウト間隔を秒単位で設定します。この時間が経過すると、クライアントからデータが受信されなくなり、sshd(8) は暗号化されたチャネルを介してメッセージを送信し、クライアントからの応答を要求します。デフォルトは 0 で、これらのメッセージはクライアントに送信されません。

マニュアルsshd_config)

おそらく、問題の本当の解決策は、screen や tmux などのターミナル マルチプレクサを使用することです。接続が切断されても、ログインと実行中のプログラムはそのまま残ります。実行中のプログラムの出力を含め、後でいつでもターミナルに再接続できます。また、1 つの ssh 接続で複数のターミナルを使用することもできます。サーバーが ssh セッションを制限しているようなので、これも役立つかもしれません。スクリーンの紹介はこちらしかし、他にもたくさんあります。

答え2

つまり、 の動作によりServerAliveInterval、ssh 作業が終了した後もリモート マシンの ssh ユーザー ログイン セッションが維持され、それ以降のログインが切断されるのでしょうか?

いいえ。これは、接続を確認し、SSH または下位レベルでの自動切断を防ぐキープアライブ メッセージを送信します。長時間実行されるスクリプトを開始する場合は、リモート側で、またはを使用する必要がありますnohupscreenこれtmuxにより、切断後もスクリプトが実行され続け、2 番目と 3 番目のコマンドを使用すると、既存のターミナルを再接続できます。

答え3

おそらく、ServerAliveInterval=60接続が維持されているため、有効化後にこれらのエラーが発生します。そのサーバーへの ssh 接続/コマンドのパターンにより、サーバーが許可するように設定されているよりも多くの同時接続が蓄積されています。

以前は接続が切断され、同時接続数が少なくなっていましたが、サーバー側はそれで満足していました (接続が拒否されなかった) が、ユーザーは満足していませんでした。

同時接続の最大数に関するサーバーの構成を確認し、その制限内にとどまるか、サーバーの管理者と交渉して、自分 (または全員) の制限を引き上げるように依頼します。

関連情報