private void session_StandardDataReceived(object sender, StandardDataReceivedEventArgs e) { if (e.Type == StandardStreamType.OUTPUT) { if (Status != ConsoleStatus.ACCESSGRANTED) { if (e.Data == "login as: ") Status = ConsoleStatus.LOGINAS; else if (e.Data.EndsWith("'s password: "******"Passphrase for key ")) { Status = ConsoleStatus.PRIVATEKEY; OnPasswordRequested(); } StandardOutput += e.Data; } else { char[] data = new char[e.Data.Length]; int read = 0; bool gotESC = false; bool gotOSC = false; bool gotCSI = false; for (var i = 0; i < e.Data.Length; i++) { char c = e.Data[i]; if (gotOSC) { if (c == 7) // BEL gotOSC = false; } else if (gotCSI) { if (c >= 64 && c <= 126) // @ to ~ gotCSI = false; } else if (gotESC) { if (c == 91) // [ gotCSI = true; else if (c == 93) // ] gotOSC = true; gotESC = false; } else if (c == 27) // ESC gotESC = true; else data[read++] = c; } string output = new string(data, 0, read); if (output.EndsWith("Password: "******"[sudo] password for ")) OnPasswordRequested(); StandardOutput += output; } } else if (e.Type == StandardStreamType.ERROR) { if (Status != ConsoleStatus.ACCESSGRANTED) { string[] lines = e.Data.Split(_splitby, StringSplitOptions.RemoveEmptyEntries); if (Array.IndexOf(lines, "Access granted") >= 0) { Status = ConsoleStatus.ACCESSGRANTED; _session.Connected(); } else if (Array.IndexOf(lines, "Store key in cache? (y/n) ") >= 0) Status = ConsoleStatus.STOREHOST; else if (Array.IndexOf(lines, "Update cached key? (y/n, Return cancels connection) ") >= 0) Status = ConsoleStatus.UPDATEHOST; else if (Array.Find<string>(lines, line => line.StartsWith("FATAL ERROR:")) != null) Status = ConsoleStatus.ERROR; } StandardError += e.Data; } }
private void OnStandardDataReceived(object sender, StandardDataReceivedEventArgs e) { if (StandardDataReceived != null) StandardDataReceived(sender, e); }