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


9

(私は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

回答:


9

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

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

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

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

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

しかし、ターミナルエミュレータは、使用する疑似ターミナルデバイスの数値IDを選択できますか?原則として、カーネルがこれを許可することは可能ですが、実際には、新しい疑似端末を割り当てるためのカーネルインターフェイスはそれをサポートしていません。カーネルが独自に選択します。(SysVモデルでは、pesudo-terminalsは、呼び出された特別なデバイスを開くことによって作成され、/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に接続してシェルを取得できます。セキュリティの観点から非常に危険です!!!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.