背景
我正在编写一个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
我尝试了很多不同的论点,似乎没有一个与“重定向标准输入”
一起使用
非常感谢控制服务器的其他想法
答案 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是实际工作的内容,因此直接用母语编写可能更容易。