Запустите команды sudo в Haskell - PullRequest
8 голосов
/ 20 июля 2011

У меня на ноутбуке установлены ghc 6.12.3 и Ubuntu 11.04.

Я хотел бы иметь функцию, которая принимает некоторые команды оболочки и выполняет их как суперпользователь (например, sudo update-manager, sudoIwlist ....) в Haskell.Я знаю, что модуль System.Process имеет некоторые функции, такие как createProcess, runInteractiveCommand.Но есть для одной команды raw или одной команды оболочки, а не для составных комнад, таких как "sudo update-manager".Все мои эксперименты с этими функциями по выполнению "sudo ..." провалились.Терминал, который я использовал для запуска своей функции haskell, не отвечал.

Я также посмотрел пакет HSH.Но мне кажется, что экспортируемые там функции также не годятся для команд sudo.

Я предполагаю, что выполнение таких команд, как "sudo update-manager", требует двух процессов.Один для "sudo", а другой для "update-manager".Поэтому мне нужно дважды вызвать такие функции, как «createProcess», и каким-то образом соединить их, чтобы второй процесс для «update-manager» получил привилегию суперпользователя от первого процесса для «sudo».

Заранее спасибо за помощь!

Ответы [ 3 ]

13 голосов
/ 20 июля 2011

Попробуйте readProcess из System.Process

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

readProcess разветвляет внешний процесс, строго читает его стандартный вывод, блокируя его до завершения, и возвращает строку вывода.

Запустите его так:

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

Выполняется sudo с параметрами -S и программой.-S необходим для чтения пароля из стандартного ввода.Пароль должен заканчиваться символом новой строки, поэтому программа добавляет его.

8 голосов
/ 20 июля 2011

Отвечая на последний абзац.sudo - обычная программа, никакой магии.Это просто происходит, чтобы запустить другие программы.Как и ваша программа на Haskell.Ваша программа запускает sudo и sudo запускает update-manager Так что нет, вам не следует создавать два процесса.

4 голосов
/ 20 июля 2011

Вы пробовали System.Process.system?

import System.Process

main = system "sudo update-manager"

Это работает для меня (GHC 7.0.3).Кроме того, для сценариев в Haskell в целом (включая sudo), вы можете взглянуть на презентацию «Практический Haskell: сценарии с типами» от Дона Стюарта.

...