ベストアンサー
端末でプログラムを実行すると、プログラムをバッチジョブとして実行する場合にはない追加機能が提供されます。たとえば、端末でプロセスを実行する場合は、Ctrl + Cを押して中断できますが、プロセスがどの端末にも関連付けられていない場合は、Ctrl + Cで中断することはできません。代わりに、おそらく次のようになります。 kill
などを実行します。端末については、この回答で詳しく説明しています。
リモートsshd
プロセスでは、キーボードと画面の役割を引き受けるために、疑似端末ペアを使用します。リモートプロセスが/dev/tty1
などの「真の」端末から読み取っていた場合、キーボードから直接入力を取得します。代わりに、sshd
プロセスは、キーストロークを疑似端末のマスターエンドに書き込むことにより、リモートプロセスに渡します。実行中のプログラムは、キーボードから送信されたかのように、疑似端末のスレーブ側でデータを受信します。同様に、プロセスが疑似端末のスレーブ側に書き込むと、そのような錯覚が生じます。画面に文字を印刷する「真の」端末への書き込み。ただし、代わりにsshd
はマスター側に書き込まれたデータを読み取り、暗号化して、ネットワーク経由で返送します。
端末なしで何が起こるかを確認するには、ssh -T remote.host
のようなものを実行してみてください。リモートホストでシェルを起動しますが、シェルには端末がないため、バッチモードで実行されていると見なされるため、プロンプトを出力する必要はありません。また、sudo
ではパスワードを読み取る代わりに端末で入力する必要があるため、リモートホストでsudo
を実行することはできません。標準入力から取得します。
デフォルトでは、リモートのsshd
は、コマンドを指定しない場合にのみptyを割り当てます。 ssh remote.host screen
を試してみると、コマンドを指定するとptyの割り当てが抑制され、再び問題が発生することがわかります。これを回避するには、-t
オプションを指定すると、リモートのsshd
は常に端末の割り当てを試みます。
… ssh
がファイルから読み取っている場合など、ローカルエンドに通信する端末がない場合を除きます。その場合、ssh -t -t
を使用して、強制のpty割り当てを行うことができます。リモートエンドは、ssh
の標準入力に書き込まれたすべてのバイトに、キーボードで入力されたかのように反応するため、これは意図しない影響を与える可能性があります。たとえば、Ctrl + CキーボードはASCIIコード3を生成するため、ローカルのssh
が入力ファイルから値3のバイトを読み取った場合、それをリモートホストであるリモートホストに渡します。リモートsshd
はそれをptyのマスターエンドに書き込み、カーネルはSIGINTをスレーブエンドから読み取るプロセスに送信します。ターミナルは興味深い生き物です。