https://foro.gambas-es.org/viewtopic.php?f=1&t=3777
-----------------------------------
obedlink
Viernes, 11 Abril 2014, 15:56

Ejecutar Comando Con Sudo Dentro De Gambas 3
-----------------------------------
el codigo esta dentro de un botón toggle.
el codigo del final es para detener el proceso en especifico ya que pienso ejecutar hasta 4 veces el mismo comando, y para detenerlos individualmente quiero usar el comando de consola "sudo kill xxx" donde xxx es el numero del proceso.

la variable "contrasena" es una variable publica y contiene la contraseña de root.

por alguna razon el comando no se ejecuta ni me nuestra error en la consola de gambas.
el programa que estoy ejecutando es xboxdrv un driver user-space para los controles xbox360.

[code linenumbers=false syntax=gambas]Public Sub btnActivar1_Click()

If btnActivar1.Value = True Then
    killpad1 = Shell ("echo " & contrasena & " | sudo -S xboxdrv -d --silent --wid 0" & controltype1 & forcefeedbackpad1 & trigger1 & deadzone1) 'ejecuta el comando y a la vez lo amacena en una variable tipo process
Endif

If btnActivar1.Value = False Then  
    Shell ("echo ", contrasena, " | sudo -S kill ", killpad1.Handle] ' killpad1.handle devuelve el ID de proceso para poder matarlo
Endif
End[/code]


-----------------------------------
jguardon
Viernes, 11 Abril 2014, 16:28

Re: Ejecutar Comando Con Sudo Dentro De Gambas 3
-----------------------------------
Supongo que el fallo lo tienes en los espacios inexistentes entre las variables dentro del comando shell:

[code linenumbers=false syntax=gambas]Shell ("echo " & contrasena & " | sudo -S xboxdrv -d --silent --wid 0" & controltype1 & forcefeedbackpad1 & trigger1 & deadzone1)[/code]

Desconozco cuáles son los argumentos que pasas al programa xboxdrv, pero si haces esto verás a lo que me refiero:

[code linenumbers=false syntax=gambas]print ("echo " & contrasena & " | sudo -S xboxdrv -d --silent --wid 0" & controltype1 & forcefeedbackpad1 & trigger1 & deadzone1)[/code]


controltype1 & forcefeedbackpad1 & trigger1 & deadzone1 te saldrán pegados uno al otro y a la cadena anterior que termina en 0.


Saludos


-----------------------------------
obedlink
Viernes, 11 Abril 2014, 16:49

Re: Ejecutar Comando Con Sudo Dentro De Gambas 3
-----------------------------------
[quote user="jguardon" post="21336"]Supongo que el fallo lo tienes en los espacios inexistentes entre las variables dentro del comando shell:

[code linenumbers=false syntax=gambas]Shell ("echo " & contrasena & " | sudo -S xboxdrv -d --silent --wid 0" & controltype1 & forcefeedbackpad1 & trigger1 & deadzone1)[/code]

Desconozco cuáles son los argumentos que pasas al programa xboxdrv, pero si haces esto verás a lo que me refiero:

[code linenumbers=false syntax=gambas]print ("echo " & contrasena & " | sudo -S xboxdrv -d --silent --wid 0" & controltype1 & forcefeedbackpad1 & trigger1 & deadzone1)[/code]


controltype1 & forcefeedbackpad1 & trigger1 & deadzone1 te saldrán pegados uno al otro y a la cadena anterior que termina en 0.


Saludos[/quote]
No hay problema en eso al asignar el valor a las variables ya llevan el espacio requerido.

aqui esta las asignaciones, como veras ahi van los espacios
[code linenumbers=false syntax=gambas]If ffpad1.Value = True Then
    forcefeedbackpad1 = " --force-feedback --rumble " & Slider_derecho_pad1.Value & "," & Slider_izquierdo_pad1.Value
    Endif
    If checkbox_DeadZone.Value = True Then
    deadzone1 = " --ui-axismap " & "x1^dead:" & Slider_deadzoneLS_pad1.Value & "," & "y1^dead:" & Slider_deadzoneLS_pad1.Value & "," & "x2^dead:" & Slider_deadzoneRS_pad1.Value & "," & "y2^dead:" & Slider_deadzoneRS_pad1.Value
    Endif
    If checkbox_triggers_as_button.Value = True Then
    trigger1 = " --trigger-as-button"
    Endif

    Select Case controltipo1.Index
      Case 0 
      controltype1 = " --mimic-xpad-wireless"
      Case 1 
      controltype1 = " --mimic-xpad"
    End Select[/code]

pero esa linea de codigo funciona, la ultima que es para detener el proceso es la del problema.
*no se porque se duplico el post!! borren los por favor

[code linenumbers=false syntax=gambas]Shell ("echo ", contrasena, " | sudo -S kill ", killpad1.Handle] ' killpad1.handle devuelve el ID de proceso para poder matarlo[/code]
este codigo deveria es como que escribiera en consola "sudo kill 12345" donde 12345 es el PID del proceso, fijate que si quito el espacio despues de "kill" la consola de gambas me devuelve
[code linenumbers=false syntax=gambas]sudo: kill12046: command not found[/code]
es como que hubiera escrito en consola "sudo kill12046" en vez de "sudo kill 12046", pero si le doy ese espacio no hace nada, ni devuelve ningún mensaje la consola.


-----------------------------------
vuott
Viernes, 11 Abril 2014, 20:19

Re: Ejecutar Comando Con Sudo Dentro De Gambas 3
-----------------------------------
Hola,
[code linenumbers=false syntax=gambas]Shell ("echo ", contrasena, " | sudo -S kill ", killpad1.Handle][/code]
1) ¿Por qué utilizas las paréntesis con [i]Shell[/i]?    No son necesarias.
2) ¿Por qué no utilizas sólo recursos de Gambas para matar el proceso?
Yo escribiría de esta manera:
[code linenumbers=false syntax=gambas]
Public killpad1 As Process

Public Sub btnActivar1_Click()

  If btnActivar1.Value = True Then
  killpad1 = Shell "echo " & contrasena & " | sudo -S xboxdrv -d --silent --wid 0" & controltype1 & forcefeedbackpad1 & trigger1 & deadzone1
  Else
  killpad1.Kill
  Endif

End[/code]


-----------------------------------
obedlink
Sabado, 12 Abril 2014, 00:08

Re: Ejecutar Comando Con Sudo Dentro De Gambas 3
-----------------------------------
[quote user="vuott" post="21344"]Hola,
[code linenumbers=false syntax=gambas]Shell ("echo ", contrasena, " | sudo -S kill ", killpad1.Handle][/code]
1) ¿Por qué utilizas las paréntesis con [i]Shell[/i]?    No son necesarias.
Asi lo vi en un ejemplo, y tienes razón no son necesarias, pero tampoco dan error al usarlas, ya probé con y sin comillas es lo mismo.
2) ¿Por qué no utilizas sólo recursos de Gambas para matar el proceso?
eso no lo sabia, lo intente pero no pasa nada, ni  da mensaje de error, tal ves sea porque el comando anterior lo estoy ejecutando como sudo, entonces se necesita detenerlo como sudo.

alguna idea??


-----------------------------------
obedlink
Sabado, 12 Abril 2014, 06:28

Re: Ejecutar Comando Con Sudo Dentro De Gambas 3
-----------------------------------
bueno creo haber encontrado el problema, ambos códigos funcionan pero este el problema:

el primer comando shell, abre 3 procesos, viendo el monitor del sistema a presionar el boton se abre:
sh
xboxdrv
sudo

el segundo shell deberia matar el proceso iniciado pero este solo mata sh y quedan activos xboxdrv y sudo.
usando "shell" se creen 3 procesos, pero usando "exec" solo se crea uno y funciona perfectamente, el problema es que no puedo ejecutar el comando e ingresar el password root.
esta es la forma que lo hago.
[code linenumbers=false syntax=gambas]killpad1 = Exec ["echo", contrasena, "|", "sudo", "-S", "xboxdrv", "-d", "-s", "--wid", "0", controltype1, forcefeedbackpad1, trigger1, deadzone1][/code]
la unica forma que funciona es quitando desde "echo" hasta "-S" quedando asi, pero de esta forma tengo que abrir la aplicación con "sudo ./aplicacion.gambas"
[code linenumbers=false syntax=gambas]killpad1 = Exec ["xboxdrv", "-d", "-s", "--wid", "0", controltype1, forcefeedbackpad1, trigger1, deadzone1][/code]

creo que ahora la pregunta seria como ejecutar un comando como root usando "exec"


-----------------------------------
razaAztk
Sabado, 12 Abril 2014, 22:00

Re: Ejecutar Comando Con Sudo Dentro De Gambas 3
-----------------------------------
Yo lo que hice en una aplicación que necesitaba permisos de root fue editar el *.desktop del instalador, para que la aplicación al abrirla la ejecutara con gksudo.
Aunque ejecutar una aplicación con permisos de super-user es potencialmente peligroso. Debes estar totalmente seguro de tu código.

La aplicación que te comento es [url=http://foro.gambas-es.org/viewtopic.php?t=3544]VPNBook-gb
Y para editar el *.deb puede que te sirva ver: http://libertadhack.blogspot.mx/2010/12/agregar-dependencias-deb-gambas.html

Saludos!


-----------------------------------
codificador
Domingo, 13 Abril 2014, 02:49

Re: Ejecutar Comando Con Sudo Dentro De Gambas 3
-----------------------------------
casualmente encontre esto  http://gambasdoc.org/help/comp/gb.desktop/desktop/runasroot?es&v3 

[code linenumbers=false]Desktop.RunAsRoot("comando") [/code]


-----------------------------------
vuott
Domingo, 13 Abril 2014, 15:26

Re: Ejecutar Comando Con Sudo Dentro De Gambas 3
-----------------------------------
[quote user="codificador" post="21365"][code linenumbers=false]Desktop.RunAsRoot("comando") [/code][/quote]
Esta de [i]codificador[/i] es una gran sugerencia !
Sólo querria añadir que para usar [i]Desktop.RunAsRoot()[/i], es necesario activar el componente [i]gb.desktop[/i] y tener instalado en el sistema el programa "[color=brown]xterm[/color]".


