2013-05-05 4 views
8

私は、リモートコンソールを作成したい、テルネットサーバーのように動作します。ユーザーはTelnetを使用してサーバーにログインし、いくつかのコマンドを実行していくつかの作業を行うことができます。リモートncursesコンソールのレンダリング方法は?

これの良い例は、router osのコンソールです。私は今混乱している、私はユーザーの入力を受け入れることができますsometingし、いくつかのテキストを印刷しますが、コンソールを作るためにncursesを使用したいです "cmdの自動補完"、構文の色など... )、どうすればいいですか?コンソールがユーザー側にあるので、サーバーがncurses APIを呼び出すと、サーバー上のものが変更されます...

多分これは愚かな質問ですが、私はこれを本当に初心です。どんな提案も感謝しています。

答えて

9

これはあなたが考えるよりも難しいです。

あなたは理解する必要があります端末の仕組み - 彼らは特別な制御シーケンスを使用します。カーソルまたはカラー出力を移動します。これは、端末特有のterminfoファイルによって記述されます。 Ncursesは、terminfoを使用してそのような制御シーケンスにAPI呼び出し(例えば、カーソルを特定の位置に移動)を変換する。

(最近はxtermgnome-terminalscreentmux、など)端末は、クライアント側にあるので、あなたは、クライアントからサーバへの端末の種類を渡す必要があります。その理由は次のとおりです。 sshは、sshクライアントからサーバーにこの情報を渡します(sshセッションでecho $TERMを試してください。コンソール経由でログインしている場合は 'linux'、Xとxtermを使用している場合は 'xterm'かもしれません)。また、それぞれのterminfoをサーバー上で使用することをお勧めします。

もう1つのピースは疑似端末です。今日では、シリアル端末を使用する人が比較的少ないため、それらのセマンティクスは、もともとシリアルコンソール用に開発されたアプリケーションおよびライブラリ(例えば、cursesおよびその友人)が動作するようにエミュレートされる。これは擬似端末を介して実現されます。これらはパイプのようなもので、マスタとスレーブのデバイスが通信し、一方の側に書かれたものは他方の側に出ます。たとえば、gettyのログインプロセスでは、ptyデバイスの片面を使用してシリアル回線と考えることができます。サーバプログラムは、ptyの反対側を処理し、ptyからクライアントに送信するすべてのものを送信する必要がありますネットワークを介して。

ターミナルエミュレータはまたあなたの端子に疑似端末、タイプttyを使用して、あなたは端末エミュレータを使用している場合は、/dev/pts/9ような何かを得るでしょう。 ptyの反対側では、通常はあなたのシェルで、pty経由で端末エミュレータと通信します。

お客様のクライアントプログラムは、多かれ少なかれ標準入力と標準出力を使用できます。あなたの端末情報が正しい場合、残りは端末エミュレータで処理され、サーバプログラムから受け取ったものはstdoutに渡し、読み取ったものはサーバプログラムにstdinから送信します。

うまくいけば、私は重要な細部を省きませんでした。がんばろう!

2

ncursesをstdinおよびstdout以外のストリームで動作させることは可能です。 initscr()の前にnewterm()を呼び出して、ncursesの入力および出力ファイルハンドルを設定します。

しかし、接続のリモートエンドにどのような種類の端末があるのか​​を知る必要があります(sshとtelnetは両方ともこれをサーバに伝えるメカニズムを持っています)。また、ncurses以外のインタフェースリモートエンドがサポートされている端末タイプでない場合(または端末タイプを判別できない場合)

関連する問題