2011-07-20 12 views
8

Estoy teniendo instalado ghc 6.12.3 y Ubuntu 11.04 en mi computadora portátil.Ejecutar comandos sudo en Haskell

Me gustaría tener una función que tome algunos comandos de shell y los ejecute como superusuario (como sudo update-manager, sudo iwlist ....) en Haskell. Sé que el módulo System.Process tiene algunas funciones como createProcess, runInteractiveCommand. Pero hay para un solo comando en bruto o un solo comando de shell, no para comandos compuestos como "sudo update-manager". Todos mis experimentos sobre esas funciones para ejecutar "sudo ..." fallaron. La terminal que utilicé para ejecutar mi función haskell no tuvo respuesta.

También miré el paquete HSH. Pero me parece que las funciones exportadas allí tampoco son buenas para los comandos sudo.

Supongo que la ejecución de comandos como "sudo update-manager" requiere dos procesos. Uno es para "sudo" y el otro es para "update-manager". Así que necesito llamar a funciones como "createProcess" dos veces y conectarlas de alguna manera para que el segundo proceso para "update-manager" obtenga privilegio de superusuario desde el primer proceso para "sudo".

Gracias de antemano por ayuda!

+3

'updateManager' es un argumento para' sudo' .sudo' va a leer todos sus argumentos y crea una nueva línea de comandos a partir de ellos. – fuz

+0

Muéstrenos el código que probó que no funcionó. Según tu descripción, debería haber funcionado. – dave4420

+0

Eso probablemente no sea una buena idea. Mejor es soltar su nivel en lugar de elevarlo. – alternative

Respuesta

4

¿Has probado System.Process.system?

import System.Process 

main = system "sudo update-manager" 

Esto funciona para mí (GHC 7.0.3). Además, para los scripts en Haskell en general (sudo incluido), puede echar un vistazo a la presentación "Practical Haskell: scripting with types" de Don Stewart.

+2

Esto falla cuando no hay caparazón. – fuz

+1

El código de la presentación está disponible en https://github.com/mbezjak/playground/tree/master/scripting-with-types – gliptak

12

Trate readProcess de System.Process

readProcess :: FilePath -- command to run 
-> [String]    -- any arguments 
-> String    -- standard input 
-> IO String   -- stdout 

readProcess bifurca un proceso externo, se lee en su salida estándar estrictamente, el bloqueo hasta que el proceso termina, y devuelve la cadena salida.

Run así:

readProcess "/usr/bin/sudo" ("-S":someProgram) (passwort++"\n") 

Esto ejecuta sudo con las opciones -S y el programa. -S es necesario para leer la contraseña de stdin. La contraseña debe terminar con una nueva línea, por lo que el programa agrega uno.

+0

¡Gracias! Esto funciona para mi. – chenxicali

+0

@ user854259 ¿Podría marcar el punto debajo del marcador de mi respuesta para marcarlo como aceptado? Esto es muy útil para que otros lo sepan rápidamente, y es probable que la respuesta sea útil. Además, me da algunos puntos más (rep). – fuz

+0

Acabo de hacer eso. :-) – chenxicali

8

Respondiendo el último párrafo. sudo es un programa regular, sin magia alguna. Simplemente sucede que ejecuta otros programas. Lo mismo ocurre con su programa Haskell. Su programa ejecuta sudo y sudo ejecuta update-manager Así que no, no debe crear dos procesos.

Cuestiones relacionadas