在Haskell中运行sudo命令

che*_*ali 8 shell sudo haskell

我在笔记本电脑上安装了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"的第一个进程获得超级用户权限.

在此先感谢您的帮助!

fuz*_*fuz 13

尝试readProcessSystem.Process

readProcess :: FilePath -- command to run 
-> [String]             -- any arguments 
-> String               -- standard input 
-> IO String            -- stdout 
Run Code Online (Sandbox Code Playgroud)

readProcess 分叉外部进程,严格读取其标准输出,阻塞直到进程终止,并返回输出字符串.

像这样运行:

readProcess "/usr/bin/sudo" ("-S":someProgram) (passwort++"\n")
Run Code Online (Sandbox Code Playgroud)

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


n. *_* m. 8

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


Ant*_*tti 4

您尝试过 System.Process.system 吗?

import System.Process

main = system "sudo update-manager"
Run Code Online (Sandbox Code Playgroud)

这对我有用(GHC 7.0.3)。另外,对于一般的 Haskell 脚本(包括 sudo),您可以查看 Don Stewart 的演示文稿“Practical Haskell:使用类型编写脚本”

  • 当没有 shell 时,此操作会失败。 (2认同)