2

背景
我正在编写一个 Web 应用程序,这样我就可以从一个网站控制一个Ubuntu 服务器。

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

从单声道运行“屏幕”:

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 运行“屏幕”会出现错误:

Must be connected to a terminal

我尝试了许多不同的参数,但似乎没有一个适用于“重定向标准输入”


控制服务器的其他想法将不胜感激

4

3 回答 3

2

我认为这是一个典型的问题,您在问如何实施解决问题的方法,而不是问如何解决问题。我认为你不应该做一些骇人听闻的事情,比如制作一个通过终端将用户操作传送到服务器的网络应用程序。

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

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

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

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

于 2012-06-30T16:00:26.570 回答
1

解决同一问题的另一种方法是shellinabox。同样有趣的是来自 anyterm 网站的这个页面,它比较了实现这种功能的不同产品。

使用 shellinabox 非常简单:

# ./shellinaboxd -s /:LOGIN

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

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

于 2012-06-29T00:35:06.347 回答
1

screen将需要某种终端。这也太夸张了。

您可能希望研究Unix 环境中的高级编程一书pty(在源代码中)中的程序,以提供可以以编程方式驱动的伪终端。(如果你愿意的话,你可能会按照提供的方式运行程序并用 Mono 编写驱动程序。)(如果结合本书学习,这个程序会更有意义。)pty/ptypty

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

系统可能有 Mono 接口pty(7);如果是这样,使用它可能比使用 C API 更自然,但实际工作的是 C API,因此直接用本机语言编写可能更容易。

于 2012-06-29T00:58:44.260 回答