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);
 }