考虑以下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中执行系统命令?
答案 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权限,最好的办法就是。