切断されたsshセッションに接続する方法はありますか?個別に作業しているリモートサイトへのネットワーク接続に問題があります。ただし、その間に、リモートロケーションにあるサーバーに接続しているときに、パケットの損失が原因で多数の切断が発生します。多くの場合、セッションはしばらくの間アクティブなままであり、場合によっては、可能であれば再起動するのではなく、戻る必要がある何らかのアクション(ファイルの編集、プロセスの実行など)の途中にあることがあります。
更新:実際の回答については、下記のzero_rの回答を参照してください
これは答えではありませんが、回避策です。 screen を使用します。
初めてログインしたときにscreenを実行します。別のシェルを取得し、その中でコマンドを実行します。接続が切断されている場合、画面プロセスはターミナルを存続させ、シェルとそれが実行しているプロセスが停止しないようにします。再接続したら、「screen -r」を実行して再開します。
画面の構成と使用にはさらに多くの機能がありますが、上記の方法で問題を回避できます。
ClientAliveInterval(60など)とTCPKeepAlive(yesまたはno)をサーバー側のsshd.confで適切な値に設定してみてください。
これにより、接続が数分間失われた場合でも、セッションが維持されます。
上で述べたように、 GNU Screen を使用する方法です。複数の「画面ウィンドウ」を介して複数のコマンドを実行できるリモートボックスで「画面セッション」を使用できます。これは、親SSH接続が停止した場合に単純に切り離され、その中で実行されているすべてのサブプロセスを正常に維持します。
'man screen
'はいつものようにあなたの友達です。OSパッケージがデフォルトでインストールされていない場合、OSパッケージは' screen
'と呼ばれるべきです。
基本は:
(リモートホストで)スクリーンセッションを開始します。
$ screen
スクリーンセッションから切断します。 CTRL-A、 d
再度ログインした後、画面セッションに再接続します。
$ screen -d -r
別の画面「ウィンドウ」を開きます。 CTRL-A、 c
画面ウィンドウを開いて循環します。 CTRL-A、 space
有る たくさん Screenでできるクールなもの。私は10年以上使用していますが、まだ新しい機能を見つけています。私のお気に入りのUnixユーティリティです。
誰も言及していないなんて信じられない [〜#〜] mosh [〜#〜] ;
Moshは、SSHログインプロセスにフックできる独立したプロトコルであり、切断、IPの変更、高遅延などの数日後もセッションを存続させます。ホームページよりも説明がわかりやすいので、以下の説明をコピーしました。私の経験とアドバイスは、自分のAndroidモバイルで使用することです。旅行やSSHを実行するときのライフセーバーです。たとえば、電車の中でモバイルにテザリングすると、ラップトップにも同じことが言えますソースからコンパイルして最新バージョンを取得することをお勧めします。Ubuntu内の私用のレポバージョンにはいくつかの不快な点があり、最新バージョン(執筆時点)で修正されています。
Mosh(モバイルシェル)
ローミングを可能にし、断続的な接続をサポートし、ユーザーのキーストロークのインテリジェントなローカルエコーとライン編集を提供するリモートターミナルアプリケーション。
MoshはSSHの代替品です。特にWi-Fi、携帯電話、長距離リンクを介して、より堅牢で応答性が高くなります。
Moshはフリーソフトウェアで、GNU/Linux、FreeBSD、Solaris、Mac OS X、Androidで利用できます。
ウェブサイトの機能:
IPを変更します。接続を維持する:インターネット接続間を移動すると、Moshは自動的にローミングします。電車の中でWi-Fiを、ホテルでイーサネットを、そしてビーチでLTE:ログインしたままにします。SSHやWebアプリなど、ほとんどのネットワークプログラムはローミング後に接続を失いますGmail。Moshは違います。
夢の実現:Moshを使用すると、ノートパソコンをスリープ状態にして後でスリープ状態から復帰させ、接続を維持できます。インターネット接続が切断された場合、Moshは警告を出しますが、ネットワークサービスが回復すると接続が再開されます。
ネットワークラグを取り除く:SSHはサーバーの応答を待ってから、自分の入力を表示します。これは、ユーザーインターフェースを粗くする可能性があります。 Moshは異なります。入力、削除、行編集に対して即座に応答します。これは適応的に行われ、emacsやvimなどのフルスクリーンプログラムでも機能します。接続が悪いと、未解決の予測に下線が引かれ、誤解されません。
特権コードなし。デーモンなし:Moshをインストールまたは実行するためにスーパーユーザーである必要はありません。クライアントとサーバーは、通常のユーザーによって実行される実行可能ファイルであり、接続の存続期間中のみ持続します。
同じログイン方法:Moshはネットワークポートをリッスンしたり、ユーザーを認証したりしません。 moshクライアントはSSHを介してサーバーにログインし、ユーザーは以前と同じ資格情報(パスワード、公開鍵など)を提示します。次に、Moshはmosh-serverをリモートで実行し、UDPを介してそれに接続します。
端末内で実行しますが、より優れています:Moshはsshのようなコマンドラインプログラムです。 xterm、gnome-terminal、urxvt、Terminal.app、iTerm、emacs、screen、またはtmux内で使用できます。ただし、moshはゼロから設計されており、UTF-8という1つの文字セットのみをサポートしています。他の端末とSSHのUnicodeバグを修正します。
Control-Cはうまく機能します:SSHとは異なり、moshのUDPベースのプロトコルはパケット損失を適切に処理し、ネットワークの状態に基づいてフレームレートを設定します。 Moshはネットワークバッファーをいっぱいにしないため、Control-C
常に暴走プロセスを停止するように機能します。
autossh 接続を監視し、接続がダウンした場合は再接続します。キープアライブよりも信頼性が高くなります。スクリーンセッションに接続すると、切断したところから続行します(autosshに付属するrscreen
を参照)
これは定番です。端末との接続が失われる危険性がある場合は常に使用してください。
$ tmux
$ sh do_something_that_takes_forever
!! Connection fails so you reconnect once you notice
$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]
$ tmux attach -t 0
ちょうどそのように、あなたは行動に戻っています。
他の人が指摘したように、画面は一般的にこれに最適なソリューションであり、他の便利な機能のホストも追加されます。
リモートマシンでプロファイルを設定して、ログイン時に自動的に画面を起動および/または画面に再接続することができます。これにより、接続が切断されたため、必要なときに画面を起動するのを忘れることがありません。
http://tlug.dnho.net/?q=node/239 を参照してください(または、わずかに異なる方法で行われた他の多くの例をGoogleで検索してください)。
これが別の非画面ソリューションです。
PuTTYトレイを使用すると、通常の方法やPuTTY-ngにはない切断時の再接続オプションを利用できます
https://puttytray.goeswhere.com/
それは他のオプションを持つPuTTYの(完全にオープンソースの)フォークであり、接続設定に移動し、2つのオプションがあります。
いくつかのタイプの「仮想化」では利用できない(たとえば、cygwinでは「画面」は作成できますが、設計方法により「tmux」は作成できません)が、tmuxをインストールするオプションがある場合、私はそのスクリーンの目的のために行くことを強くお勧めします。
Sshセッションがドロップした場合、画面はリモートサーバー上でシェルセッションを開いたままにしますが、ssh接続がドロップされる問題については何もしません。 zero_rが示唆するように、キープアライブと長いタイムアウトでssh接続を調整してみてください。
問題の原因となっている失われたパケットの原因を追跡し、回避する代わりに修正することをお勧めします。
たまにscreenを実行するのを忘れて、未完成の作業を失うこともありました。この場合、壊れたSSHセッションに再接続することはできませんが、reptyr
のおかげで、実行中のプログラムの親を新しい端末に変更し、実行していた作業を再開できます。
SSHセッションから誤って切断された後、最初にscreen
を実行して、接続が再び切断されないようにします。次に、新しいセッションでps aux | grep {The process to be resumed}
を実行してPIDを取得します。 PIDを使用すると、reptyr {PID}
またはreptyr -T {PID}
(サブプロセスがある場合)を試行して作業を続行できます。