在Haskell中运行sudo命令

时间:2011-07-20 15:34:08

标签: shell haskell sudo

我的笔记本电脑上安装了ghc 6.12.3和Ubuntu 11.04。

我想有一个函数,它接受一些shell命令并在Haskell中以超级用户(如sudo update-manager,sudo iwlist ....)的形式执行它们。我知道System.Process模块​​有一些函数,比如createProcess,runInteractiveCommand。但是对于单个原始命令或单个shell命令,不适用于像“sudo update-manager”这样的复合通信。所有关于执行“sudo ...”的函数的实验都失败了。我用来运行haskell功能的终端没有响应。

我也看了HSH包。但在我看来,那里导出的函数也不适合sudo命令。

我的猜测是执行像“sudo update-manager”这样的命令需要两个进程。一个是“sudo”,另一个是“update-manager”。所以我需要两次调用“createProcess”之类的函数并以某种方式连接它们,以便“update-manager”的第二个进程从“sudo”的第一个进程获得超级用户权限。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:13)

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。从stdin读取密码需要-S。密码必须以换行符结束,因此程序会添加一个。

答案 1 :(得分:8)

回答最后一段。 sudo是一个常规程序,没有任何魔法。它碰巧运行其他程序。你的Haskell程序也是如此。您的程序运行sudosudo运行update-manager所以不,您不应该创建两个进程。

答案 2 :(得分: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"