2011-07-20 90 views
8

我在我的筆記本電腦上安裝了ghc 6.12.3和Ubuntu 11.04。在Haskell中運行sudo命令

我想要一個函數,它需要一些shell命令並在Haskell中以超級用戶身份執行它們(如sudo update-manager,sudo iwlist ....)。我知道System.Process模塊​​有一些功能,如createProcess,runInteractiveCommand。但是有一個原始命令或一個shell命令,不適用於像「sudo update-manager」這樣的複合命令。我所有關於執行「sudo ...」功能的實驗都失敗了。我用來運行我的haskell函數的終端沒有任何迴應。

我也看了一下HSH包。但在我看來,那裏輸出的函數對於sudo命令來說也不是很好。

我的猜測是執行像「sudo update-manager」這樣的命令需要兩個進程。一個是「sudo」,另一個是「更新管理器」。所以我需要兩次調用諸如「createProcess」之類的函數,並以某種方式連接它們,以便「update-manager」的第二個進程從第一個「sudo」進程獲得超級用戶特權。

在此先感謝您的幫助!

+3

'updateManager'是'sudo'的一個參數.'sudo'將讀取它的所有參數並從它們中創建一個新的命令行。 – fuz

+0

向我們展示您嘗試過的代碼無效。從你的描述來看,它應該是有效的。 – dave4420

+0

這可能不是一個好主意。更好的是降低你的水平,而不是升高它 – alternative

回答

4

你試過System.Process.system嗎?

import System.Process 

main = system "sudo update-manager" 

這適用於我(GHC 7.0.3)。此外,對於Haskell中的腳本(一般包括sudo),您可以查看Don Stewart的演示"Practical Haskell: scripting with types"

+2

當沒有外殼時會失敗。 – fuz

+1

演示代碼可在https://github.com/mbezjak/playground/tree/master/scripting-with-types – gliptak

12

嘗試readProcessSystem.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才能從stdin讀取密碼。密碼必須以換行符結束,所以程序會添加一個。

+0

謝謝!這個對我有用。 – chenxicali

+0

@ user854259你可以在我的答案的分數計數器下面打勾,將其標記爲已接受?這對其他人迅速瞭解很有幫助,哪個答案可能會有所幫助。此外,它給了我更多的觀點(代表)。 – fuz

+0

剛剛做到了。 :-) – chenxicali

8

回答最後一段。 sudo是一個普通的程序,沒有任何魔力。它恰好運行其他程序。你的Haskell程序也是如此。你的程序運行sudosudo運行update-manager所以不,你不應該創建兩個進程。