パイプが壊れた後、どうすればsshセッションに再接続できますか?


28

そのapt-get upgradeため、ルーターで最後に怒ったのでルーターが長すぎると判断したとき、サーバーで実行していました。すべての接続が切断されました。話の教訓は、screenあなたがお尻のルーターにいるときにたくさん使うことです。

とにかく、ログインし直してhtopでプロセスがまだハングしていることを発見し、Y / nのアップグレードを待っています(幸運にもまだヒットしていませんでした)。切断されたセッションに再接続する方法はありますか?パッケージ管理の途中ではなかったので、私はそれを単に殺しましたが、将来の参考のために知っておくといいでしょう。


1
apt-getプロセスがまだ実行されていることに驚いています。SSHまでのプロセスチェーン全体とともに消滅していたはずです。/ セッションでdo-dist-upgrade自動的に開始することに気づきました:状況によっては同じかもしれませんか?screenbyobuapt-get
nfirvine

回答:


16

適切な質問への答えは次のとおりですできません。主な問題は、認証手順が同期していないことだと思います。それだけでは機能しません。

お気づきのように、解決策は可能な場合はscreenを使用することです(ところで、tmuxはscreenの代替です)。


1
しかし、パスワードなしのsshがある場合はどうでしょうか?それならできますか?
スリダールサルノバト

1
byobuは、フロントエンドをscreen(またはtmux)使用するのに便利で、素敵です-間違いなく一見の価値があります(:
-drevicko

Sridhar-Samobol、まだ認証が必要です。実行中のセッションにアタッチすると、最初のハンドシェイクを再度行う方法がないため、既存のセッションに新しいセッションを導入すると不変式が壊れます。回答:いいえ。
kevr

9

長期にわたるプロセスを実行するには、screenを使用します。またはするか、より使いやすいインターフェイスが必要な場合 o延ます。

画面では、次を使用できます。

screen [program] [args]

これは、スクリーンセッション内で[プログラム]とその[引数]を実行します。プログラムが終了すると、セッションは自動的に閉じられます。プログラムの実行後にセッションを保持したい場合は、引数なしでscreenを実行するだけで、セッション内に新しいプロンプトが表示されます。CTRL + A + Dは、現在のセッションから端末を切り離します。

前のセッションに再接続するには:

screen -r

開いているセッションが1つだけの場合、すぐに再接続されます。複数のセッションが進行中の場合、どのセッションにアタッチするかを尋ねられます。セッション名がわかっている場合は、このコマンドラインに引数として追加するだけです。

By風は素晴らしい改善です。screenに基づいていますが、現在のすべてのセッションをタブとして表示し、それらを簡単に移動できるショートカットを提供するバーを下部に提供します。あなたはできる:

  • F2新しいセッションを開始
  • F3左側の次のセッションタブに移動する
  • F4右側の次のセッションタブに移動する
  • F8は現在のセッションタブにわかりやすい名前を付けます
  • F9はオプションメニューを開きます
  • CTRL + A + Dは、すべてのセッションを端末から切り離します。

アドバイス:ユーザーrootでセッションを開いたままにしないでください。誰かが(ローカルまたはリモートで)端末にアクセスすると、進行中のセッションに簡単に再接続し、システムをルートとして使用できます。必要に応じて、必要に応じて共通ユーザーとsudoの個別のコマンドラインを使用してセッションを開始することをお勧めします。


1
OPを引用することができます:「物語のモラルはスクリーンをたくさん使うことです」。どうやらそれはここでの質問ではありませんでした。
月13

書き込みありがとうございますが、1月は正しかったです。

sudo screen <command>を使用して、画面をルートとして設定します。再接続するには、sudoアクセスが必要です。通常の画面を起動してから、画面内でrootに変更するよりもはるかに優れています。
djsmiley2k-CoW

8

壊れたSSHセッションに再接続することはできませんが、SSH 内で実行されているプロセスの親を変更することができます。機能的には必要なものと同等です。

説明書

あなたの場合、新しい SSHセッション、セッションなどapt-getから制御されるプロセスを引き継ぎます。これに対する私のお気に入りはコマンドです:screenreptyr

$ sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8   R+     0:32 apt-get upgrade

次に、プロセスに見つかったpidを使用します。

$ sudo reptyr -T 10626

または、それがうまくいかない場合、試してください:

$ reptyr 10626

この段階の後、すべてのキーボード入力は、引き継いだプログラムに送られます。残念ながら、次のようなSSHセッションの古い出力は表示されません。apt-get、確認を求める出力。

説明

基本的に同じように機能するreptyr(つまり、ptraceデバッグ接続を介して)他の複数のツールがあります。次の質問と回答を参照してください。

上記の手順では、reptyr 10626使用ptraceしながらデバッグアタッチメントsudo reptyr -T 10626コマンドがTTYが盗み使用し、好ましいある(詳細)。

最後に、この方法でSSHセッションを引き継ぐことができない理由は、sshdプロセスがホスト端末によって制御されず、代わりに端末のスレーブ部分(デバイス)を提供するpts一方で、それを制御するマスター部分がクライアントマシン、ここでは故障したSSHセッションが間にあります。でそのようなsshdプロセスを強制的に引き継ぐとreptyr -s <pid>、キーボード入力はアクティブな子プロセスではなく、そのプロセスに送られます。したがって、「Ctrl + Z」は単にそれを殺しますsshd


1

do-dist-upgradeしたがって、サスペンドに入ったラップトップからsshを使用して実行していましたBroken pipe。マシンに戻ると、アップグレード関連のプロセスがまだ実行されており、その中whiptailに入力(ディスプレイマネージャーを選択)を求め、それに関連してルート所有のプロセスが表示されていましたSCREEN。私が行うことができたsudo su -screen -rセッション、セッションにアタッチする、見よ、私は目の前に入力を受け取ることができるホイップテールダイアログを持っています。シームレスにアップグレードを再開できました。

注:これはUbuntu 14.04から16.04へのアップグレードでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.