疑似ttyの目的は何ですか?


ベストアンサー

端末でプログラムを実行すると、プログラムをバッチジョブとして実行する場合にはない追加機能が提供されます。たとえば、端末でプロセスを実行する場合は、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をスレーブエンドから読み取るプロセスに送信します。ターミナルは興味深い生き物です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です