web-dev-qa-db-ja.com

指定されたtty / ptyで端末を開くことは可能ですか?

(私はUbuntuを使用しています。)私の理解では、ttyは単なるポートの一種です。何かを入力すると、何かが出力されます。そして端末(エミュレータ)は、それらの入出力を扱うソフトウェアです。文字通り端末は接続するポートを選択できます。

/ devに多くのttyファイルが見られ、/ dev/pts /に多くのptsファイルが見られたのですが、なぜそんなにたくさんあるのかわかりません。それらはすべて使用されていますか?

そうでない場合、指定したptyで端末を起動できますか?

例えばgnome-terminal /dev/pts/47

更新

これを行う理由は、リモート端末を持ちたいからです。適切なアプローチはsshまたはtelnetを使用することです。

しかし、一時的なアクセスでは、あまり便利ではありません。 socatを使用してttyまたはptyをクライアントに転送したい。次に、クライアントはそのptyまたはttyで端末を起動できます。

次のコードは正常に動作します。クライアント上で実行され、サーバー側で「こんにちは」と表示されます。

echo "hello" > /home/myhomefoler/pty_created_by_socat
8
worldterminator

UNIXでは、tty(他の多くのものと同様)がファイルとして表示されます。 ttyデバイスに書き込まれたデータは端末に送られ、端末からのデータはttyで読み取ることができます。

Ttyがハードウェアシリアルポートの場合、それに書き込まれたデータは回線上に送信され、回線からのデータはttyに表示されます。

Ttyがマシンのビデオコンソールである場合、それに書き込まれたデータが画面に表示され、キーボードからのデータがttyに表示されます。

Ttyがgnome-terminalなどのX端末エミュレータに接続された疑似tty(仮想端末)である場合、それに書き込まれたデータはX端末エミュレータソフトウェアに配信され、ウィンドウに表示されます。そのウィンドウに仮想端末で読み取るために利用可能です。ソフトウェアは、疑似端末の「マスター」側に接続されていると言われています。実際の端末には "マスター"エンドはありません。これは、背後に実際のデバイス(シリアルポートなど)があり、ソフトウェアによって実装された仮想デバイスではないためです。

そのため、/dev/ttyS0(Linux上の実際のシリアルポート)などの任意のttyデバイスで動作するようにXターミナルエミュレーターに要求しても意味がないことは、すでにお分かりでしょう。疑似ttyでなければなりません。

しかし、ターミナルエミュレータは、使用する疑似ターミナルデバイスの数値IDを選択できますか?原則として、カーネルがこれを許可することは可能ですが、実際には、新しい疑似端末を割り当てるためのカーネルインターフェイスはそれをサポートしていません。カーネルが独自に選択します。 (SysVモデルでは、pesudoターミナルは/dev/ptmxという特別なデバイスを開くことによって作成され、使用可能な最も小さい番号の疑似ターミナルデバイスが自動的に割り当てられます。)

しかし、割り当てられる疑似端末デバイスの数を選択する必要があるのはなぜですか?カーネルは、利用可能で使用可能であることが保証されている未使用のものを選択します。別のものを選択した方がよい理由はありますか?

あなたの他の質問について:

/ devに多くのttyファイルが見られ、/ dev/pts /に多くのptsファイルが見られました。なぜそんなにたくさんあるのかわかりません。それらはすべて使用されていますか?

システムによって異なります。一部のシステムでは、使用可能なかどうかに関係なく、可能なすべての疑似端末デバイスが/dev/ptsまたは/devに事前に作成されています。他のデバイスでは、疑似ターミナルが使用されている場合にのみデバイスノードが存在します。後者のタイプであるLinuxを使用するUnunbuを使用していると言います。したがって、はい、/dev/ptsに表示されるすべてのデバイスノードは現在使用中です。

しかし、一時的なアクセスでは、あまり便利ではありません。 socatを使用してttyまたはptyをクライアントに転送したい。次に、クライアントはそのptyまたはttyで端末を起動できます。

socatまたはその他のソフトウェアを疑似端末のマスターエンドに接続する場合は、そのソフトウェアがその実行を明確にサポートする必要があります。しかし、socatがそうするので、あなたは幸運です。たとえば、私が実行した場合:

socat PTY,link=/tmp/socat.pty TCP-LISTEN:2222 &
sleep 1 && ( setsid bash ) </tmp/socat.pty >/tmp/socat.pty 2>&1

他の場所からポート2222に接続してシェルを取得できます。 セキュリティの観点から非常に危険です!!!

9
Celada