C# 从Mono访问Ubuntu终端
背景C# 从Mono访问Ubuntu终端,c#,ubuntu,mono,C#,Ubuntu,Mono,背景 我正在编写一个web应用程序,这样我就可以从网站上控制Ubuntu服务器 我的一个想法是从mono运行“screen”应用程序,并从那里重定向我的输入和输出 从mono运行“屏幕”: ProcessStartInfo info = new ProcessStartInfo("screen", "-m"); info.UseShellExecute = false; info.RedirectStandardOutput = true; info.RedirectStandardInput
我正在编写一个web应用程序,这样我就可以从网站上控制Ubuntu服务器 我的一个想法是从mono运行“screen”应用程序,并从那里重定向我的输入和输出 从mono运行“屏幕”:
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;
但使用重定向标准输入运行“screen”会显示错误:
Must be connected to a terminal
我尝试了许多不同的参数,但似乎没有一个与“重定向标准输入”相关
控制服务器的其他想法将非常受欢迎解决同一问题的不同方法是。同样有趣的是,比较了实现这种功能的不同产品 使用shellinabox非常简单:
# ./shellinaboxd -s /:LOGIN
(这是他们网站上给出的示例)将启动一个Web服务器(在您的例子中是Ubuntu服务器)。当您将浏览器指向http://yourserver:4200
您将看到一个登录屏幕,就像使用ssh/putty/telnet/打开会话时一样。。。但是在你的浏览器里
只需在应用程序的网页中包含指向该服务的iframe,即可向服务器外壳提供所需的远程访问功能。解决相同问题的另一种方法是。同样有趣的是,比较了实现这种功能的不同产品 使用shellinabox非常简单:
# ./shellinaboxd -s /:LOGIN
(这是他们网站上给出的示例)将启动一个Web服务器(在您的例子中是Ubuntu服务器)。当您将浏览器指向http://yourserver:4200
您将看到一个登录屏幕,就像使用ssh/putty/telnet/打开会话时一样。。。但是在你的浏览器里
只需在应用程序的网页中包含指向该服务的iframe,即可向服务器外壳提供所需的远程访问功能。
屏幕
将需要某种终端。这也太过分了
您可能希望研究pty
程序(源代码中的pty/
),以提供一个可以编程驱动的伪终端。(如果您愿意的话,您可能会按照提供的方式运行pty
程序,并用Mono编写驱动程序。)(如果结合使用pty
程序进行研究,将更有意义。)
使用pty
程序或类似功能的好处在于,您可以正确处理passwd
等打开(“/dev/tty”)
的程序,以提示用户输入密码。如果您只需通过pipe()
和dup2()
系统调用重定向标准IO流,您就不会为需要控制终端的程序配备控制终端。(这仍然是许多有用的程序,但不足以成为远程管理工具。)
pty(7)
系统可能有一个单声道接口;如果是这样的话,使用它可能比使用C API更自然,但C API才是真正起作用的,因此直接用母语编写可能更容易。screen
需要某种终端。这也太过分了
您可能希望研究pty
程序(源代码中的pty/
),以提供一个可以编程驱动的伪终端。(如果您愿意的话,您可能会按照提供的方式运行pty
程序,并用Mono编写驱动程序。)(如果结合使用pty
程序进行研究,将更有意义。)
使用pty
程序或类似功能的好处在于,您可以正确处理passwd
等打开(“/dev/tty”)
的程序,以提示用户输入密码。如果您只需通过pipe()
和dup2()
系统调用重定向标准IO流,您就不会为需要控制终端的程序配备控制终端。(这仍然是许多有用的程序,但不足以成为远程管理工具。)
pty(7)
系统可能有一个单声道接口;如果是这样的话,使用它可能比使用C API更自然,但C API才是真正起作用的,因此直接用母语编写可能更容易。我认为这是一个典型的问题,在这个问题中,你会问如何实现问题的解决方案,而不是问如何解决问题。我认为你不应该做一些黑客行为,比如制作一个通过终端将用户行为传输到服务器的web应用程序
我认为您可以绕过所有这些,不必编写一行代码,就可以利用平台(本例中为Gtk+)已经为您提供的功能:
您可以在服务器中使用运行gnome终端。这样,gnome终端应用程序将不会在服务器中运行,而是在指定的端口上打开web服务器。稍后,您可以使用任何启用WebSocket的浏览器来控制它
与迄今为止提供的其他解决方案相比,这是最简单且不太粗糙的解决方案。如果您仍然对使用Mono进行web开发感到兴奋,您仍然可以,您可以将这种访问嵌入iFrame或其他东西中
(注:如果你不想依赖安装在服务器上的GTK,你可以在网页的客户端部分使用WebSocket,以便能够将事件从服务器发送到客户端,并使用库直接通过网络发送用户输入。)我认为这是一个典型的问题,在这个问题中,你问的是如何解决问题,而不是如何解决问题。我认为你不应该做一些黑客行为,比如制作一个通过终端将用户行为传输到服务器的web应用程序 我认为您可以绕过所有这些,不必编写一行代码,就可以利用平台(本例中为Gtk+)已经为您提供的功能: 你可以运行gnome术语