【问题标题】:Run sudo commands in Haskell在 Haskell 中运行 sudo 命令
【发布时间】:2011-07-20 15:34:08
【问题描述】:

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

提前感谢您的帮助!

【问题讨论】:

  • updateManagersudo 的一个参数。sudo 将读取它的所有参数并从中创建一个新的命令行。
  • 向我们展示您尝试但不起作用的代码。根据您的描述,它应该有效。
  • 这可能不是一个好主意。最好是降低你的水平而不是提高它

标签: shell haskell sudo


【解决方案1】:

System.Process 尝试readProcess

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

readProcess fork 一个外部进程,读取它的标准输出 严格来说,阻塞直到进程终止,并返回 输出字符串。

像这样运行它:

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

这将使用选项-S 和程序执行sudo。从标准输入读取密码需要-S。密码必须以换行符结尾,因此程序会添加一个。

【讨论】:

  • @user854259 您能否点击我的答案得分计数器下方的勾号以将其标记为已接受?这对其他人快速了解非常有帮助,哪个答案可能会有所帮助。此外,它给了我更多的积分(rep)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您尝试过 System.Process.system 吗?

    import System.Process
    
    main = system "sudo update-manager"
    

    这对我有用 (GHC 7.0.3)。此外,对于一般的 Haskell 脚本(包括 sudo),您可以查看 Don Stewart 的演示文稿 "Practical Haskell: scripting with types"

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2011-01-29
    • 2016-10-17
    • 2016-09-07
    • 2015-09-03
    相关资源
    最近更新 更多