Eseguire comandi di sistema con C#
Mi stavo creando una interfaccia su misura per NMap che fosse multipiattoforma.
Mi è venuto in mente di usare Monodevelop e C# visto che Java non è molto adatto alla scopo.
Crea una GUI per NMap in sostanza vuol dire lanciare il comando che faresti direttamente da shell e rappresentare il risultato nella finestra.
Vediamo quindi come eseguire, in generale, comandi DOS/Bash o altri simili direttamente da codice.
Il codice qua sotto funziona sia su Linux che su Windows (su Mac OS X non ho ancoa provato).
Per eseguire semplici comandi basta la classe Process e il metodo Start(); vediamo qualche esempio:
System.Diagnostics.Process.Start("kwrite");
System.Diagnostics.Process.Start("nmap", "192.168.1.1/24");
System.Diagnostics.Process.Start("iexplorer.exe");
Tanto per farvi capire la potenza di Mono vi ho fatto tre esempi; il primo eseguito su Linux, il secondo eseguito su Linux e Windows, il terzo solo per Windows.
Infatti il primo lancia l'editor di KDE, il secondo lancia NMap indicando cosa scennerizzare, il terzo lancia IE.
Altre differenza tra i comandi è il numero di argomenti.
Nel caso di NMap il primo argomento lancia il programma, il secondo imposta le opzioni.
Possiamo anche usare IE con per aprire direttamente una pagina:
System.Diagnostics.Process.Start("iexplorer.exe", "www.facebook.com");
Se invece vogliamo qualcosa di più concreto dobbiamo usare la classe ProcessStartInfo.
static void LaunchCommandLineApp() { const string ex1 = "C:\\"; const string ex2 = "C:\\Dir"; ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.CreateNoWindow = false; // indica se avviare il processo in una nuova finestra startInfo.UseShellExecute = false; // indica se utilizzare la shell del sistema operativo per avviare il processo startInfo.FileName = "file.exe"; // applicazione o documento da avviare. startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.Arguments = "-f j -o \"" + ex1 + "\" -z 1.0 -s y " + ex2; try { using (Process exeProcess = Process.Start(startInfo)) { exeProcess.WaitForExit(); } } catch { } }
L'esempio è un pò più complesso ma permette di eseguire le operazioni in maniera più personalizzata.
c# mono monodevelop process processstartinfo
Commentami!