public static ConsoleMirror StartTerminalServer(Process p, ClientSession session, CancellationToken token) { if (OS.IsWindows) { StartServer(p, session, token); } else { ConsoleMirror server, client; CreatePipes(out server, out client); Task.Run(() => { try { using (var output = new ConsoleStream(ConsoleStream.Channels.Output, session, p.StandardOutput.CurrentEncoding, server.Output)) using (var err = new ConsoleStream(ConsoleStream.Channels.Error, session, p.StandardError.CurrentEncoding, server.Error)) { Task.Run(() => { try { p.StandardOutput.BaseStream.CopyTo(output); } catch { p.Close(); } }, token); Task.Run(() => { try { p.StandardError.BaseStream.CopyTo(err); } catch { p.Close(); } }, token); try { server.Input.CopyTo(p.StandardInput.BaseStream); } catch { p.Close(); } } } catch { } }, token); return(client); } return(null); }
public static void StartServer(Process p, ClientSession session, CancellationToken token) { Task.Run(() => { try { using (var output = new ConsoleStream(ConsoleStream.Channels.Output, session, p.StandardOutput.CurrentEncoding, null)) using (var err = new ConsoleStream(ConsoleStream.Channels.Error, session, p.StandardError.CurrentEncoding, null)) { Task.Run(() => { try { p.StandardError.BaseStream.CopyTo(err); } catch { } }, token); try { p.StandardOutput.BaseStream.CopyTo(output); } catch { } } } catch { } }, token); }