如何以root身份从Haskell执行命令?

时间:2016-10-25 09:01:34

标签: haskell

考虑以下Haskell函数:

eraseFile :: FilePath -> IO ()
eraseFile basename = 
  do let cmd' = ">" 
         args' = ("/path/to/file/" ++ basename) :: String
     (exitcode', stdout', stderr') <- readProcessWithExitCode cmd' [args'] ""
     return ()

当我尝试在stack ghci repl或main函数中运行时,我从控制台收到permission denied错误。通常,在bash控制台中,您可以将此命令作为sudo运行,但是当从Haskell调用时,这似乎不起作用。

问题:如何以root身份在Haskell中执行系统命令?

1 个答案:

答案 0 :(得分:2)

正如评论中已经指出的那样,你可以在root下运行整个stack / ghc,但我敢说这是一个坏主意。我只是在你的程序中调用sudo作为一个进程。特定命令 - 清空文件,如果我理解正确的话? - 然后使用tee最简单地完成:

  do let cmd' = "sudo" 
         args' = ["tee", "/path/to/file/" ++ basename :: String]
     (exitcode', stdout', stderr') <- readProcessWithExitCode cmd' args' ""

正如Zeta所言,truncate --size 0可能是一个更清洁的命令。

要绕过密码输入,您可能还希望在sudoers file中设置例外。这是毛茸茸的事;当然,如果你能完全避免需要root权限,最好的办法就是。