SSHセッションでCtrl-Cを処理する

SSHセッションでCtrl-Cを処理する

長期実行コマンドを実行するSSHセッションを開始するときのCtrl+(SIGINT)処理Cはどうなりますか?

SSHセッションが閉じられていることがわかりますが、誰が最初にSIGINTを受け取ったかはわかりません。そうでしたか?

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

    または

  2. ローカルSSHは信号を受信し、接続を閉じます。

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

また、この場合、シェルのSIGINT処理に何が起こるのかわかりません。たとえば、私は...

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

Ctrl+をC押すとリモート接続が切断されます。Ctrl+以降にアクティブになっているシェルでリモートコマンドを実行する方法はありますかC?つまり、この場合はループを停止してリモートシェルで作業を続行できますか?

ベストアンサー1

sshさまざまな方法で呼び出すことができ、それぞれは端末から開始された信号に応答します(例Ctrl-C

  • ssh remotehost対話型セッションがで実行されますremotehost。クライアント側では、stdinで使用されるttyを "raw"モードに設定し、リモートホストにpseudo-ttyを割り当て、シェルをログインシェルとして実行しようとしていますsshsshd-bash

    生モードを設定すると、通常、信号を送信する文字(たとえば、およびCtrl-CCtrl-\が入力ストリームに挿入されます。sshこれらの文字はそのままリモートホストに送信され、SIGINTまたはSIGQUITを送信でき、通常はすべてのコマンドを終了してリモートホストのシェルに戻ります。リモートシェルがアクティブな間、SSH接続はアクティブのままです。

  • ssh -t remotehost command args ...対話型セッションは上記と同様に実行されますremotehost。ただし、リモート側では でyour_shell -c "command args ..."実行されます。上記のように、を入力するとリモートCtrl-Cホストに送信され、コマンドはSIGINTを受信して​​すぐにシャットダウンでき、その後リモートシェルがシャットダウンします。その後、リモコンは接続sshdを閉じてssh報告します。Connection to remotehost closed.

  • ssh remotehost command args ...非対話型セッションがで実行されますremotehostsshクライアント側ではいいえttyをrawモードに設定します(パスワードまたはパスワードフレーズの読み取りを除く)。と入力するとCtrl-CSIGINTsshを受け取り、Connection to remotehost closedメッセージも送信せずにすぐに終了します。

    これらのyour_shell -c "command args ..."プロセスはリモートホストでまだ実行されている可能性があります。。彼らは自分で終了するか、プロセスが現在閉じているsshソケットにデータを書き込もうとし、それによって(通常)致命的なSIGPIPE信号が送信されます。

おすすめ記事