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
尝试readProcess
从System.Process
Run Code Online (Sandbox Code Playgroud)readProcess :: FilePath -- command to run -> [String] -- any arguments -> String -- standard input -> IO String -- stdout
readProcess
分叉外部进程,严格读取其标准输出,阻塞直到进程终止,并返回输出字符串.
像这样运行:
readProcess "/usr/bin/sudo" ("-S":someProgram) (passwort++"\n")
Run Code Online (Sandbox Code Playgroud)
这将sudo
与选项-S
和程序一起执行.-S
需要从stdin读取密码.密码必须以换行符结束,因此程序会添加一个.
回答最后一段.sudo
是一个常规程序,没有任何魔法.它碰巧运行其他程序.你的Haskell程序也是如此.您的程序运行sudo
并sudo
运行update-manager
所以不,您不应该创建两个进程.
您尝试过 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:使用类型编写脚本”。