using System; using System.IO; using System.Text; using System.Diagnostics; using System.Collections.Generic; namespace AniNIX.Shared { public static class ExecuteCommand { // Allow anyone using this class to modify the timeout at will. public static int TimeOut = 5000; /// /// This method allows a CSharp app to execute a command on the OS. /// /// The command string to run as the string argument to "bash -c 'command'" /// The effective replacement for the command's stdinThe stdout of the command /// public static String Run(String command, String input) { //Sanitize inputs. command = command.Replace("\\'","'").Replace("'","\\'"); //Create process. Process proc = new Process(); proc.StartInfo.CreateNoWindow = true; proc.StartInfo.FileName = "/bin/bash"; proc.StartInfo.Arguments = String.Format("-c \'{0}\'",command); proc.StartInfo.UseShellExecute=false; ReportMessage.Log(Verbosity.VeryVerbose,String.Format("{0} {1}",proc.StartInfo.FileName,proc.StartInfo.Arguments)); //Redirect input proc.StartInfo.RedirectStandardOutput=true; proc.StartInfo.RedirectStandardInput=true; //Start process proc.Start(); //Add input and read output. proc.StandardInput.Write(input); proc.StandardInput.Close(); proc.WaitForExit(TimeOut); if (!proc.HasExited) { proc.Kill(); } if (proc.ExitCode != 0) { throw new Exception(String.Format("Failed to exit command with return code {0}",proc.ExitCode)); } String stdoutString = proc.StandardOutput.ReadToEnd(); //Close up and return proc.Close(); return stdoutString; } //Add polymorphism to allow no stdin public static String Run(String command) { return Run(command,null); } } }