Ausführen von sudo-Befehlen in Haskell

8

Ich habe ghc 6.12.3 und Ubuntu 11.04 auf meinem Laptop installiert.

Ich hätte gerne eine Funktion, die einige Shell-Befehle benötigt und sie als Superuser (wie sudo update-manager, sudo iwlist ....) in Haskell ausführt. Ich weiß, dass das System.Process-Modul einige Funktionen wie createProcess, runInteractiveCommand hat. Aber es gibt für einen einzelnen rohen Befehl oder einen einzelnen Shellbefehl, nicht für zusammengesetzte commnads wie "sudo update-manager". Alle meine Experimente an diesen Funktionen zur Ausführung von "sudo ..." scheiterten. Das Terminal, mit dem ich meine Haskell-Funktion ausgeführt habe, hatte keine Antwort.

Ich habe auch das HSH-Paket angeschaut. Aber es scheint mir, dass dort exportierte Funktionen nicht gut für Sudo-Befehle sind.

Ich schätze, dass das Ausführen von Befehlen wie "sudo update-manager" zwei Prozesse erfordert. Einer ist für "Sudo" und der andere ist für "Update-Manager". Also muss ich Funktionen wie "createProcess" zweimal aufrufen und sie irgendwie verbinden, damit der zweite Prozess für "update-manager" Superuser-Privilegien vom ersten Prozess für "sudo" bekommt.

Vielen Dank im Voraus für Hilfe!

    
chenxicali 20.07.2011, 15:34
quelle

3 Antworten

12

Versuchen Sie readProcess von System.Process

%Vor%      

readProcess gibt einen externen Prozess frei, liest dessen Standardausgabe   streng blockiert, bis der Prozess endet, und gibt die   Ausgabezeichenfolge.

Führen Sie es wie folgt aus:

%Vor%

Dies führt sudo mit den Optionen -S und dem Programm aus. -S wird benötigt, um das Passwort von stdin zu lesen. Das Passwort muss mit einem Zeilenumbruch enden, daher fügt das Programm eins hinzu.

    
fuz 20.07.2011 15:47
quelle
8

Beantworten Sie den letzten Absatz. sudo ist ein normales Programm, keinerlei Magie. Es passiert einfach, andere Programme zu starten. Das Gleiche gilt für Ihr Haskell-Programm. Ihr Programm läuft sudo und sudo läuft update-manager Also nein, Sie sollten nicht zwei Prozesse erstellen.

    
n.m. 20.07.2011 16:09
quelle
4

Haben Sie System.Process.system ausprobiert?

%Vor%

Das funktioniert für mich (GHC 7.0.3). Auch für das Scripting in Haskell im Allgemeinen (einschließlich sudo) können Sie sich eine Präsentation ansehen "Praktisch Haskell: Scripting mit Typen " von Don Stewart.

    
Antti 20.07.2011 15:43
quelle

Tags und Links