Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Mono访问Ubuntu终端_C#_Ubuntu_Mono - Fatal编程技术网

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术语