Запускайте команды sudo в Haskell

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

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

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

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

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


person chenxicali    schedule 20.07.2011    source источник
comment
updateManager является аргументом для sudo.sudo собирается прочитать все его аргументы и создать из них новую командную строку.   -  person fuz    schedule 20.07.2011
comment
Покажите нам код, который вы пробовали, но он не сработал. Судя по твоему описанию, должно было сработать.   -  person dave4420    schedule 20.07.2011
comment
Наверное, это не очень хорошая идея. Лучше понизить свой уровень, чем повышать его.   -  person alternative    schedule 20.07.2011


Ответы (3)


Попробуйте 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 нужен для чтения пароля со стандартного ввода. Пароль должен заканчиваться новой строкой, поэтому программа добавляет ее.

person fuz    schedule 20.07.2011
comment
@user854259 user854259 Не могли бы вы поставить галочку под счетчиком очков моего ответа, чтобы отметить его как принятый? Это очень полезно для других, чтобы быстро узнать, какой ответ, вероятно, будет полезен. Кроме того, это дает мне еще несколько очков (репутация). - person fuz; 20.07.2011

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

person n. 1.8e9-where's-my-share m.    schedule 20.07.2011

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

import System.Process

main = system "sudo update-manager"

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

person Antti    schedule 20.07.2011
comment
Это терпит неудачу, когда нет оболочки. - person fuz; 20.07.2011
comment
Код из презентации доступен по адресу github.com/mbezjak/playground/tree. /мастер/скрипты-с-типами - person gliptak; 04.10.2013