我的笔记本电脑上安装了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”的第一个进程获得超级用户权限。
提前感谢您的帮助!
答案 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程序也是如此。您的程序运行sudo
,sudo
运行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"。