65 lines
2.2 KiB
Plaintext
65 lines
2.2 KiB
Plaintext
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;
|
|
|
|
/// <summary>
|
|
/// This method allows a CSharp app to execute a command on the OS.
|
|
/// </summary>
|
|
/// <param name=command>The command string to run as the string argument to "bash -c 'command'"</param>
|
|
/// <param name=input>The effective replacement for the command's stdin</param
|
|
/// <return>The stdout of the command</return>
|
|
/// </summary>
|
|
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);
|
|
}
|
|
|
|
}
|
|
}
|