EJECUTAR COMANDO LINUX DESDE MONODEVELOP

Imagen de AndreR

Forums: 

Buenos días a todos.
Tengo una aplicación realizada en MonoDevelop con c#. Lo que necesito es ejecutar un script desde esta aplicación.
El script ya lo tengo y funciona, por eso no coloqué el tema en el foro de Shell Scripting, lo he probado desde la línea de comandos y esta todo ok. En el terminal he colocado: sudo ./myscript parametros, me pide la contraseña del usuario actual, no de supersusuario, y listo.
Pero, como envío a ejecutar esto desde la aplicación en Mono???
He intentado algo como esto:


public string ejecutaComando2 (string str_comando, string str_parametros)
{
string str_ejecutaComando = "";
string str_directorio = "/lib/";
try {
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo ();
//startInfo.Arguments = str_parametros;
startInfo.FileName = str_comando;
startInfo.WorkingDirectory = str_directorio;

startInfo.UseShellExecute = false;
startInfo.ErrorDialog = false;
startInfo.CreateNoWindow = true;
startInfo.RedirectStandardOutput = true;
startInfo.UserName = "usuario";

System.Security.SecureString password = new System.Security.SecureString ();
string contraseña = "micontrasena";
foreach (char c in contraseña) {
password.AppendChar (c);
}

startInfo.Password = password;

try {
System.Diagnostics.Process proc = System.Diagnostics.Process.Start (startInfo);
System.IO.StreamReader sr = proc.StandardOutput;
proc.WaitForExit ();

str_ejecutaComando = sr.ReadToEnd ();

sr.Close ();
} catch {
Console.WriteLine ("No se ejecutó sentencia en servidor");
}
} catch {
Console.WriteLine ("No se pudo ejecutar comando en servidor");
}
return str_ejecutaComando;
}

y lo invoco así:

string str_comandoSH = "sudo ./myscript";
string str_argumentos = "argumentos";
ejecutaComando2(str_comandoSH, str_argumentos);

Tengo dudas acerca de si estoy usando mal estos datos: comandos, parámetros, directorio de trabajo, etc.
Por favor AYUDA!!

Nota: myscript está en el directorio /lib

si el script está en /lib no

Imagen de deathUser

si el script está en /lib no deberías poner:

string str_comandoSH = "sudo ./myscript";

sino

string str_comandoSH = "sudo /lib/myscript";

Probaste con un comando del sistema, como /bin/ls ...???

bye
;)

Bueno en realidad yo lo

Imagen de AndreR

Bueno en realidad yo lo coloqué en /lib, pero funciona desde el terminal en cualquier directorio, salvo que me pide la contraseña del usuario.
Probe crear un directorio y si dio resultado...Solo no se como enviar a ejecutar este código. Es un programa escrito en c y lo compilé y no tiene extensión, sale como ejecutable.

Desde el terminal lo hago asi:

and@and-pc:~/Escritorio/pruebalib$ sudo ./myscript misParámetros
[sudo] password for and:
Realizando Proceso
Proceso realizado con exito
and@and-pc::~/Escritorio/pruebalib$

Los mensajes son retornados desde el código en c..Pero necesito ejecutar este código desde una aplicación en Mono..

cuando ejecutas: sudo

Imagen de deathUser

cuando ejecutas:

sudo ./myscript misParámetros

le dices que ejecute como root el script myscript ubicado en el directorio actual (eso significa ./) así que no debería funcionar desde cualquier directorio, solo desde cualquier directorio que contenga un archivo myscript y este sea ejecutable.

Cómo solucionas el que te pida el password desde la aplicación en MONO ...??? podrías usar suid para evitar el usar el sudo.

Has capturado los mensajes generados por la llamada en MONO ???

bye
;)

Muchisimas gracias... Lo

Imagen de AndreR

Muchisimas gracias... Lo solucione con el suid.. Con esto no tengo que dar usuario ni contraseña...Al final el archivo se ejecuta con los permisos del dueño.

Aqui dejo el codigo funcionando:

La llamada:

string str_comandoSH = "/lib/myscript";
string str_argumentos = "misParametros";
ejecutaComando2(str_comandoSH, str_argumentos);

El método:

public string ejecutaComando2 (string str_comando, string str_parametros)
{
string str_ejecutaComando = "";
try {
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo ();
startInfo.Arguments = str_parametros;
startInfo.FileName = str_comando;
startInfo.UseShellExecute = false;
startInfo.ErrorDialog = false;
startInfo.CreateNoWindow = true;
startInfo.RedirectStandardOutput = true;
try {
System.Diagnostics.Process proc = System.Diagnostics.Process.Start (startInfo);
System.IO.StreamReader sr = proc.StandardOutput;
proc.WaitForExit ();
str_ejecutaComando = sr.ReadToEnd ();
Console.WriteLine(str_ejecutaComando);
sr.Close ();
} catch {
Console.WriteLine ("No se ejecutó sentencia en servidor");
}
} catch {
Console.WriteLine ("No se pudo ejecutar comando en servidor");
}
return str_ejecutaComando;
}

Si mal no recuerdo, yo lo

Si mal no recuerdo, yo lo ejecutaba de la siguiente manera:
string str_comandoSH = "sudo";
string str_argumentos = "./myscript argumentos";

Ya que por alguna razón (que no entendí entonces y ni me acuerdo ahora) el parámetro de comando solo reconoce una palabra. Prueba así y nos avisas.

_fR@Nk_

Ejecutar proceso como root

Imagen de AndreR

Bueno logré hacer que el comando se ejecute, pero necesito hacer que se ejecute como root. Lo hice así:


string str_comandoSH = "/lib/myscript";
string str_argumentos = "misparamteros";
string a=c.ejecutaComando2(str_comandoSH, str_argumentos);

Con la misma función ejecutaComando2 que coloqué arriba.. Intento poner el usuario root y su contraseña así:


startInfo.UserName = "root";
System.Security.SecureString ss = new System.Security.SecureString ();
ss.AppendChar ('r');
ss.AppendChar ('o');
ss.AppendChar ('o');
ss.AppendChar ('t');
startInfo.Password = ss;

Pero me da el siguiente resultado desde Monodevelop: Error opening output file: Permission denied

Es el mismo error que me da si lo ejecuto desde el terminal sin autentificarme como root.. Al archivo myscript le puse todos los permisos....