2

背景
私はWebアプリケーションを作成しているので、WebサイトからUbuntuサーバーを制御できます。

私が持っていたアイデアの1つは、モノラルから「画面」アプリケーションを実行し、そこから入力と出力をリダイレクトすることでした。

モノから「画面」を実行する:

ProcessStartInfo info = new ProcessStartInfo("screen", "-m");
info.UseShellExecute = false;
info.RedirectStandardOutput = true;
info.RedirectStandardInput = true;

var p = new Process();

p.StartInfo = info;

p.Start();

var output =  p.StandardOutput;
var input = p.StandardInput;

ただし、RedirectStandardInputを指定して「screen」を実行するとエラーが発生します。

Must be connected to a terminal

私は多くの異なる引数を試しましたが、「標準入力のリダイレクト」で機能するものはないようです


サーバーを制御するための他のアイデアは大歓迎です

4

3 に答える 3

2

これは、問題を解決する方法を尋ねるのではなく、問題の解決策を実装する方法を尋ねる典型的な質問だと思います。ターミナルを介してユーザーアクションをサーバーにトンネリングするWebアプリを作成するようなハッキーなことをするべきではないと思います。

これらすべてをバイパスして、コードを1行も記述せずに、プラットフォーム(この場合はGtk +)がすでに提供しているものを利用できると思います。

BroadwayGDKバックエンドを使用してサーバーでgnome-terminalを実行できます。このように、gnome-terminalアプリはサーバーで実行されませんが、指定したポートでWebサーバーを開きます。後で、WebSocket対応のブラウザーを使用して制御できます。

これは、これまでに提供された他のソリューションと比較して、最も簡単でハックの少ないソリューションです。それでもWeb開発にMonoを使用することにワクワクしている場合は、それでも可能であり、このアクセスをiFrameなどに埋め込むことができます。

(追記:サーバーにインストールされているGTKに依存したくない場合は、Webページのクライアント部分でWebSocketを使用して、サーバーからクライアントにイベントを送信し、ライブラリSSHNETを使用して送信できます。ワイヤーを介したユーザーの入力。)

于 2012-06-30T16:00:26.570 に答える
1

同じ問題を解決するための別のアプローチはshellinaboxです。また、この種の機能を実装するさまざまな製品を比較するanytermWebサイトのこのページも興味深いものです。

shellinaboxの使用は非常に簡単です。

# ./shellinaboxd -s /:LOGIN

(これは彼らのウェブサイトで与えられた例です)ウェブサーバー(あなたの場合はUbuntuサーバー上)を起動します。ブラウザをポイントするhttp://yourserver:4200と、ssh / putty / telnet / ...でセッションを開いたときと同じように、ブラウザにログイン画面が表示されます。

アプリケーションのWebページにそのサービスを指すiframeを含めるだけで、サーバーのシェルに必要なリモートアクセス機能を提供できます。

于 2012-06-29T00:35:06.347 に答える
1

screenある種の端末が必要になります。それはまた、巨大にやり過ぎです。

プログラムで駆動できる疑似端末を提供するために、(ソースにある) Unix環境の高度なプログラミングの本からptyプログラムを調査することをお勧めします。(プログラムを提供されたとおりに実行し、必要に応じてドライバーをMonoで作成することもできます。)(このと併せて学習すると、プログラムの意味がはるかにわかります。)pty/ptypty

プログラムまたはそれに類似した機能を使用する利点は、ユーザーにパスワードの入力を求めるプログラムptyなどのプログラムを適切に処理できることです。システムコールを介して標準のIOストリームをリダイレクトするだけの場合、それを必要とするプログラム用の制御端末はありません。(これはまだ多くの便利なプログラムですが、リモート管理ツールとしては十分ではありません。)passwdopen("/dev/tty")pipe()dup2()

pty(7)システムへのモノラルインターフェースがあるかもしれません。その場合、C APIを使用するよりも使用する方が自然かもしれませんが、実際に機能するのはC APIであるため、母国語で直接記述する方が簡単な場合があります。

于 2012-06-29T00:58:44.260 に答える