从Mono访问Ubuntu终端

时间:2012-06-29 00:25:19

标签: c# ubuntu mono

背景
我正在编写一个Web应用程序,因此我可以从一个网站控制 Ubuntu Server

我的一个想法是从单声道运行'screen'应用程序并从那里重定向我的输入和输出。

从mono:

运行'screen'
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

我尝试了很多不同的论点,似乎没有一个与“重定向标准输入”

一起使用


非常感谢控制服务器的其他想法

3 个答案:

答案 0 :(得分:2)

我认为这是您询问如何实施问题解决方案的典型问题,而不是询问如何解决问题。我不认为你应该做一些hacky事情,例如制作一个通过终端将用户操作隧道传送到服务器的Web应用程序。

我认为你可以绕过所有这一切,并且无需编写任何代码,就可以利用平台(本例中为Gtk +)已经为您提供的功能:

您可以使用Broadway GDK backend在服务器中运行gnome-terminal。这样,gnome-terminal应用程序将不会在服务器中运行,而是在您指定的端口上打开Web服务器。稍后,您可以使用任何支持WebSockets的浏览器来控制它。

与目前为止提供的其他解决方案相比,这是最简单且不那么苛刻的解决方案。如果您仍然对使用Mono进行Web开发感到兴奋,那么您仍然可以将此访问权限嵌入到iFrame中。

(PS:如果您不想依赖于在服务器中安装GTK;您可以在网页的客户端部分使用WebSockets,以便能够将事件从服务器发送到客户端,以及库SSHNET直接通过电汇发送用户的输入。)

答案 1 :(得分:1)

解决同一问题的另一种方法是shellinabox。同样有趣的是this page from the anyterm website,它比较了实现这种功能的不同产品。

使用shellinabox非常简单:

# ./shellinaboxd -s /:LOGIN

(这是他们网站上给出的例子)将启动一个网络服务器(在你的情况下是Ubuntu服务器)。当您将浏览器指向http://yourserver:4200时,您将看到一个登录屏幕,就像您在使用ssh / putty / telnet / ...打开会话时所看到的那样,但是在您的浏览器中。

您可以通过在应用程序的网页中包含指向该服务的iframe来为服务器的shell提供所需的远程访问功能。

答案 2 :(得分:1)

screen需要某种终端。这也是一种巨大的杀伤力。

您可能希望调查pty计划from the Advanced Programming in the Unix Environment book(来源中的pty/),以提供可以通过编程方式启动的伪终端。 (你可能会按照提供的方式运行pty程序并在Mono中编写你的驱动程序。(如果与{{pty程序一起研究,pty程序会更有意义。 3}}。)

使用passwd程序或类似功能的好处是,您可以正确处理open("/dev/tty") pipe()之类的程序,以提示用户输入密码。如果您只是通过dup2()pty(7)系统调用重定向标准IO流,则您将无法拥有需要的程序的控制终端。 (这仍然是很多有用的程序,但还不足以成为远程管理工具。)

{{1}}系统可能有Mono接口;如果是这样,使用它可能比使用C API更自然,但C API是实际工作的内容,因此直接用母语编写可能更容易。