Пример #1
0
        internal static void ChangeFolder(this ConEmuControl terminal, string path)
        {
            if (terminal?.RunningSession == null || string.IsNullOrWhiteSpace(path))
            {
                return;
            }

            switch (AppSettings.ConEmuTerminal.ValueOrDefault.ToLower())
            {
            case "bash":
                if (PathUtil.TryConvertWindowsPathToPosix(path, out var posixPath))
                {
                    terminal.ClearCurrentLineWithMacroAndRunCommand($"cd {posixPath.QuoteNE()}");
                }

                break;

            case "cmd":
                terminal.ClearCurrentLineWithEscapeAndRunCommand($"cd /D {path.QuoteNE()}");
                break;

            case "powershell":
            case "pwsh":
                terminal.ClearCurrentLineWithEscapeAndRunCommand($"cd {path.QuoteNE()}");
                break;

            default:
                break;
            }
        }
 public ConsoleEmulatorOutputControl()
 {
     Controls.Add(_terminal = new ConEmuControl()
     {
         Dock = DockStyle.Fill, AutoStartInfo = null                                                       /* don't spawn terminal until we have gotten the command */
     });
 }
        private static void KillProcess(ConEmuControl terminal)
        {
            ConEmuSession session = terminal.RunningSession;

            if (session != null)
            {
                session.SendControlCAsync();
            }
        }
Пример #4
0
        private static Form CreatePingForm()
        {
            var form = new Form()
            {
                AutoSize = true, AutoSizeMode = AutoSizeMode.GrowAndShrink, Padding = new Padding(10), Text = "Ping Command"
            };

            FlowLayoutPanel stack;

            form.Controls.Add(stack = new FlowLayoutPanel()
            {
                Dock = DockStyle.Fill, AutoSize = true, AutoSizeMode = AutoSizeMode.GrowAndShrink, FlowDirection = FlowDirection.TopDown
            });

            stack.Controls.Add(new Label()
            {
                AutoSize = true, Dock = DockStyle.Top, Text = "Running the ping command.", Padding = new Padding(5)
            });
            Label labelWaitOrResult;

            stack.Controls.Add(labelWaitOrResult = new Label()
            {
                AutoSize = true, Dock = DockStyle.Top, Text = "Please wait…", BackColor = Color.Yellow, Padding = new Padding(5)
            });

            ConEmuControl conemu;
            var           sbText = new StringBuilder();

            stack.Controls.Add(conemu = new ConEmuControl()
            {
                AutoStartInfo = null, MinimumSize = new Size(800, 600), Dock = DockStyle.Top
            });
            ConEmuSession session = conemu.Start(new ConEmuStartInfo()
            {
                AnsiStreamChunkReceivedEventSink = (sender, args) => sbText.Append(args.GetMbcsText()),
                ConsoleProcessCommandLine        = "ping 8.8.8.8",
                LogLevel = ConEmuStartInfo.LogLevels.Basic
            });

            session.ConsoleProcessExited += delegate
            {
                Match match = Regex.Match(sbText.ToString(), @"\(.*\b(?<pc>\d+)%.*?\)", RegexOptions.Multiline);
                if (!match.Success)
                {
                    labelWaitOrResult.Text      = "Ping execution completed, failed to parse the result.";
                    labelWaitOrResult.BackColor = Color.PaleVioletRed;
                }
                else
                {
                    labelWaitOrResult.Text      = $"Ping execution completed, lost {match.Groups["pc"].Value} per cent of packets.";
                    labelWaitOrResult.BackColor = Color.Lime;
                }
            };
            session.ConsoleEmulatorClosed += delegate { form.Close(); };

            return(form);
        }
Пример #5
0
        private void setupConEmu()
        {
            ConEmuStartInfo startInfo = new ConEmuStartInfo();

            startInfo.ConEmuExecutablePath      = @"C:\Program Files\ConEmu\ConEmu64.exe";
            startInfo.GreetingText              = $"ConEmu version [{FileVersionInfo.GetVersionInfo(_conEmuPath).ProductVersion}]";
            startInfo.GreetingText             += $"ngrok version [{FileVersionInfo.GetVersionInfo(_ngrokPath).ProductVersion}";
            startInfo.ConsoleProcessCommandLine = _ngrokPath + " start --none";
            _control = new ConEmuControl();
            _session = _control.Start(startInfo);
            pnlBottom.Controls.Add(_control);
            _control.Dock    = DockStyle.Fill;
            _control.Enabled = false;
        }
Пример #6
0
        public override void Reset()
        {
            if (_terminal != null)
            {
                KillProcess();
                Controls.Remove(_terminal);
                _terminal.Dispose();
            }

            Controls.Add(_terminal = new ConEmuControl()
            {
                Dock = DockStyle.Fill, AutoStartInfo = null                                            /* don't spawn terminal until we have gotten the command */
            });
        }
Пример #7
0
        public override void Reset()
        {
            if (_terminal != null)
            {
                KillProcess();
                _panel.Controls.Remove(_terminal);
                _terminal.Dispose();
            }

            _panel.Controls.Add(
                _terminal = new ConEmuControl()
            {
                Dock               = DockStyle.Fill,
                AutoStartInfo      = null, /* don't spawn terminal until we have gotten the command */
                IsStatusbarVisible = false
            });
        }
Пример #8
0
        public PanelConsole(ConsoleSession session)
        {
            InitializeComponent();

            AutoSize = true;
            Text     = session.SessionName;
            //Resize += new System.EventHandler(TermPanel_Resize);

            Controls.Add(conemu = new ConEmuControl()
            {
                AutoStartInfo = null, Dock = DockStyle.Fill
            });
            con_session = conemu.Start(new ConEmuStartInfo()
            {
                ConsoleProcessCommandLine = session.CommandLine
            });
        }
        public override void Reset()
        {
            ConEmuControl oldTerminal = _terminal;

            _terminal = new ConEmuControl
            {
                Dock = DockStyle.Fill,
                IsStatusbarVisible = false
            };

            if (oldTerminal != null)
            {
                KillProcess(oldTerminal);
                _panel.Controls.Remove(oldTerminal);
                oldTerminal.Dispose();
            }

            _panel.Controls.Add(_terminal);
        }
        public static void ChangeFolder(this ConEmuControl terminal, IShellDescriptor shell, string path)
        {
            if (terminal?.RunningSession is null || shell is null || string.IsNullOrWhiteSpace(path))
            {
                return;
            }

            string command = shell.GetChangeDirCommand(path);

            switch (shell.Name)
            {
            case BashShell.ShellName:
                terminal.RunningSession.BeginGuiMacro("Keys").WithParam("^A").WithParam("^K").ExecuteSync();
                terminal.RunningSession.WriteInputTextAsync(command + Environment.NewLine);
                break;

            default:
                terminal.RunningSession.WriteInputTextAsync($"\x1B{command}{Environment.NewLine}");
                break;
            }
        }
 private static void KillProcess(ConEmuControl terminal)
 {
     terminal.RunningSession?.SendControlCAsync();
 }
Пример #12
0
        private static Form RenderView(Form form)
        {
            form.Size = new Size(800, 600);

            ConEmuControl conemu;

            form.Controls.Add(conemu = new ConEmuControl()
            {
                Dock = DockStyle.Fill, MinimumSize = new Size(200, 200), IsStatusbarVisible = true
            });
            if (conemu.AutoStartInfo != null)
            {
                conemu.AutoStartInfo.SetEnv("one", "two");
                conemu.AutoStartInfo.SetEnv("geet", "huub");
                conemu.AutoStartInfo.GreetingText = "• Running \"cmd.exe\" as the default shell in the terminal. \n\n";
                //conemu.AutoStartInfo.GreetingText = "\"C:\\Program Files\\Git\\bin\\git.exe\" fetch --progress \"--all\" ";	// A test specimen with advanced quoting
                conemu.AutoStartInfo.IsEchoingConsoleCommandLine = true;
            }
            //conemu.AutoStartInfo = null;
            TextBox txt;

            form.Controls.Add(txt = new TextBox()
            {
                Text = "AnotherFocusableControl", AutoSize = true, Dock = DockStyle.Top
            });

            FlowLayoutPanel stack;

            form.Controls.Add(stack = new FlowLayoutPanel()
            {
                FlowDirection = FlowDirection.LeftToRight, Dock = DockStyle.Top, AutoSize = true, AutoSizeMode = AutoSizeMode.GrowAndShrink
            });

            Button btn;

            stack.Controls.Add(btn = new Button()
            {
                Text = "Paste Command", AutoSize = true, Dock = DockStyle.Left
            });
            btn.Click += delegate { conemu.RunningSession?.WriteInputText("whois microsoft.com" + Environment.NewLine); };

            stack.Controls.Add(btn = new Button()
            {
                Text = "Write StdOut", AutoSize = true, Dock = DockStyle.Left
            });
            btn.Click += delegate { conemu.RunningSession?.WriteOutputText("\x001B7\x001B[90mEcho \"Hello world!\"\x001B[m\x001B8"); };

            stack.Controls.Add(btn = new Button()
            {
                Text = "Query HWND", AutoSize = true, Dock = DockStyle.Left
            });
            btn.Click += delegate { conemu.RunningSession?.BeginGuiMacro("GetInfo").WithParam("HWND").ExecuteAsync().ContinueWith(task => txt.Text = $"ConEmu HWND: {Regex.Replace(task.Result.Response, "\\s+", " ")}", TaskScheduler.FromCurrentSynchronizationContext()); };

            stack.Controls.Add(btn = new Button()
            {
                Text = "Query PID", AutoSize = true, Dock = DockStyle.Left
            });
            btn.Click += delegate { conemu.RunningSession?.BeginGuiMacro("GetInfo").WithParam("PID").ExecuteAsync().ContinueWith(task => txt.Text = $"ConEmu PID: {Regex.Replace(task.Result.Response, "\\s+", " ")}", TaskScheduler.FromCurrentSynchronizationContext()); };

            stack.Controls.Add(btn = new Button()
            {
                Text = "Kill Payload", AutoSize = true, Dock = DockStyle.Left
            });
            btn.Click += delegate { conemu.RunningSession?.KillConsoleProcessAsync(); };

            stack.Controls.Add(btn = new Button()
            {
                Text = "Ctrl+C", AutoSize = true, Dock = DockStyle.Left
            });
            btn.Click += delegate { conemu.RunningSession?.SendControlCAsync(); };

            CheckBox checkStatusBar;

            stack.Controls.Add(checkStatusBar = new CheckBox()
            {
                Text = "StatusBar", Checked = conemu.IsStatusbarVisible
            });
            checkStatusBar.CheckedChanged += delegate { conemu.IsStatusbarVisible = checkStatusBar.Checked; };

            TextBox txtOutput = null;

            stack.Controls.Add(btn = new Button()
            {
                Text = "&Ping", AutoSize = true, Dock = DockStyle.Left
            });
            btn.Click += delegate
            {
                if (conemu.IsConsoleEmulatorOpen)
                {
                    MessageBox.Show(form, "The console is busy right now.", "Ping", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }
                if (txtOutput == null)
                {
                    form.Controls.Add(txtOutput = new TextBox()
                    {
                        Multiline = true, Dock = DockStyle.Right, Width = 200
                    });
                }
                conemu.Start(new ConEmuStartInfo()
                {
                    ConsoleProcessCommandLine = "ping ya.ru", IsEchoingConsoleCommandLine = true, AnsiStreamChunkReceivedEventSink = (sender, args) => txtOutput.Text += args.GetMbcsText(), WhenConsoleProcessExits = WhenConsoleProcessExits.KeepConsoleEmulatorAndShowMessage, ConsoleProcessExitedEventSink = (sender, args) => txtOutput.Text += $"Exited with ERRORLEVEL {args.ExitCode}.", GreetingText = $"This will showcase getting the command output live in the backend.{Environment.NewLine}As the PING command runs, the textbox would duplicate its stdout in real time.{Environment.NewLine}{Environment.NewLine}"
                });
            };

            stack.Controls.Add(btn = new Button()
            {
                Text = "&Choice", AutoSize = true, Dock = DockStyle.Left
            });
            btn.Click += delegate
            {
                conemu.RunningSession?.CloseConsoleEmulator();
                DialogResult result = MessageBox.Show(form, "Keep terminal when payload exits?", "Choice", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                if (result == DialogResult.Cancel)
                {
                    return;
                }
                ConEmuSession session = conemu.Start(new ConEmuStartInfo()
                {
                    ConsoleProcessCommandLine = "choice", IsEchoingConsoleCommandLine = true, WhenConsoleProcessExits = result == DialogResult.Yes ? WhenConsoleProcessExits.KeepConsoleEmulatorAndShowMessage : WhenConsoleProcessExits.CloseConsoleEmulator, ConsoleProcessExitedEventSink = (sender, args) => MessageBox.Show($"Your choice is {args.ExitCode} (powered by startinfo event sink).")
                });
#pragma warning disable 4014
                ShowMessageForChoiceAsync(session);
#pragma warning restore 4014
            };

            return(form);
        }
Пример #13
0
 private static void ClearCurrentLineWithEscapeAndRunCommand(this ConEmuControl terminal, string command)
 {
     terminal.RunningSession.WriteInputTextAsync("\x1B" + command + Environment.NewLine);
 }
Пример #14
0
 private static void ClearCurrentLineWithMacroAndRunCommand(this ConEmuControl terminal, string command)
 {
     // Use a ConEmu macro to send the sequence for clearing the bash command line
     terminal.RunningSession.BeginGuiMacro("Keys").WithParam("^A").WithParam("^K").ExecuteSync();
     terminal.RunningSession.WriteInputTextAsync(command + Environment.NewLine);
 }