web-dev-qa-db-ja.com

SSHセッションでのCtrl-C処理

実行時間の長いコマンドを実行するSSHセッションを開始すると、どうなるか Ctrl+C (SIGINT)処理?

SSHセッションが閉じていることがわかりますが、最初にSIGINTを取得するのは誰なのかわかりません。

  1. リモートの長期実行コマンド?つまり、(a)リモートコマンドのシグナルハンドラーが呼び出されてリモートコマンドを停止します。(b)コマンドを停止したことを検出したシェルは、コマンドが停止したことを検出します。また、(c)リモートのsshdがシェルの停止を検出します。接続を閉じます

    または

  2. ローカルsshがシグナルを受信し、接続を閉じます。

(1)は起こっていると思いますが、確認したいです。

この場合、SIGINTのシェル処理で何が発生するかも不明です。たとえば、私が...

ssh remote 'while true ; do sleep 1 ; date ; done'

そして Ctrl+C、その後、リモート接続がドロップされます。後で生き続けるシェルの下でリモートコマンドを実行する方法はありますか Ctrl+C?つまり、この場合、ループを停止して、リモートシェルでの作業を続行できるようにしますか?

21
ttsiodras

sshはいくつかの異なる方法で呼び出すことができ、それぞれが次のような端末起動信号のわずかに異なる処理をもたらします Ctrl-C

  • ssh remotehostremotehostでインタラクティブセッションを実行します。クライアント側では、sshはstdinが使用するttyを「raw」モードに設定しようとし、リモートホストのsshdは疑似ttyを割り当て、シェルをログインとして実行しますシェル(例:-bash)。

    Rawモードを設定すると、通常は信号を送信する文字( Ctrl-C そして Ctrl-\)代わりに、入力ストリームに挿入されるだけです。 sshは、そのような文字をそのままリモートホストに送信します。この場合、これらの文字はSIGINTまたはSIGQUITを送信し、通常はコマンドを強制終了して、リモートホストのシェルに戻ります。リモートシェルが有効である限り、ssh接続は有効です。

  • ssh -t remotehost command args ...は、上記と同様にremotehostでインタラクティブセッションを実行しますが、リモート側ではyour_Shell -c "command args ..."が実行されます。上記のように、 Ctrl-C、それはリモートホストに送信され、コマンドはSIGINTを受信して​​すぐに終了し、その後リモートシェルが終了します。次に、リモートsshdが接続を閉じ、sshConnection to remotehost closed.を報告します。

  • ssh remotehost command args ...remotehostで非インタラクティブセッションを実行します。クライアント側では、sshnot ttyをrawモードに設定します(パスワードまたはパスフレーズを読み取る場合を除いて)。入力した場合 Ctrl-CsshはSIGINTを送信し、Connection to remotehost closedメッセージを発行することなく直ちに終了します。

    your_Shell -c "command args ..."プロセスはリモートホストで実行されている可能性が高いになります。自分で終了するか、1つのプロセスが現在閉じているsshソケットにデータを書き込もうとすると、(通常は)致命的なSIGPIPEシグナルが送信されます。

25
Mark Plotnick