在Haskell中运行sudo命令

8
我在我的笔记本电脑上安装了ghc 6.12.3和Ubuntu 11.04。我想要一个函数,以超级用户的身份执行一些shell命令(比如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
updateManagersudo的一个参数。sudo将读取所有参数并创建一个新的命令行。 - fuz
请展示一下你尝试过但没有成功的代码。根据你的描述,它应该是可以工作的。 - dave4420
这可能不是一个好主意。更好的方法是降低你的水平而不是提高它。 - alternative
3个回答

13

尝试使用System.Process中的readProcess

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

readProcess会派生一个外部进程,严格读取其标准输出,阻塞直到进程终止,并返回输出字符串。

像这样运行它:

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

这会使用选项-S和程序来执行sudo。需要使用-S从stdin读取密码。密码必须以换行符结束,因此程序会添加一个。


8
回答最后一段。 sudo只是一个普通的程序,没有任何魔力。它只是运行其他程序。你的Haskell程序也是如此。你的程序运行sudosudo运行update-manager,所以不应该创建两个进程。

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
当没有 shell 时,这将失败。 - fuz
1
演示中的代码可在以下网址获取:https://github.com/mbezjak/playground/tree/master/scripting-with-types - gliptak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接