如何以root用户身份执行来自Haskell的命令?

如何以root用户身份执行来自Haskell的命令?,haskell,Haskell,考虑以下Haskell函数: eraseFile :: FilePath -> IO () eraseFile basename = do let cmd' = ">" args' = ("/path/to/file/" ++ basename) :: String (exitcode', stdout', stderr') <- readProcessWithExitCode cmd' [args'] "" return ()

考虑以下Haskell函数:

eraseFile :: FilePath -> IO ()
eraseFile basename = 
  do let cmd' = ">" 
         args' = ("/path/to/file/" ++ basename) :: String
     (exitcode', stdout', stderr') <- readProcessWithExitCode cmd' [args'] ""
     return ()
eraseFile::FilePath->IO()
擦除文件基名称=
一定要让cmd'=“>”
args'=(“/path/to/file/”++basename)::字符串

(exitcode',stdout',stderr')正如评论中已经指出的,您可以在root下运行整个堆栈/ghc,但我敢说这是个坏主意。更可取的是,我只是从您的程序中将
sudo
作为一个进程调用。特定命令–清空文件(如果我理解正确的话)–然后,最简单的方法是:

do let cmd'=“sudo”
args'=[“tee”,“/path/to/file/”++basename::String]

(exitcode',stdout',stderr')正如评论中已经指出的,您可以在root下运行整个堆栈/ghc,但我敢说这是个坏主意。更可取的是,我只是从您的程序中将
sudo
作为一个进程调用。特定命令–清空文件(如果我理解正确的话)–然后,最简单的方法是:

do let cmd'=“sudo”
args'=[“tee”,“/path/to/file/”++basename::String]

(exitcode',stdout',stderr')您是否尝试以root身份运行
堆栈ghci
?使用sudo应该可以。上面的代码是错误的,因为
不是一个可执行名称,这是shell语法。@TomaszLewowski:是的,但它似乎不起作用。
sudo/opt/ghc/7.10.3/bin/ghc-e'System.Process.readProcessWithExitCode”/usr/bin/env“[]”>=\(\uu,out,\uu)->putStrLn out'
工作正常,显示
env
已作为
root
调用。你是怎么检查这个代码的?您可以添加所有步骤吗?将命令更改为
truncate-s0 filename
似乎已经成功了。您是否尝试以root用户身份运行
stack ghci
?使用sudo应该可以。上面的代码是错误的,因为
不是一个可执行名称,这是shell语法。@TomaszLewowski:是的,但它似乎不起作用。
sudo/opt/ghc/7.10.3/bin/ghc-e'System.Process.readProcessWithExitCode”/usr/bin/env“[]”>=\(\uu,out,\uu)->putStrLn out'
工作正常,显示
env
已作为
root
调用。你是怎么检查这个代码的?您可以添加所有步骤吗?将命令更改为
truncate-s0 filename
似乎已经完成了“understoof”的操作?无论哪种方式,虽然
tee
提供了功能,
truncate--size 0
甚至
cp/dev/null
似乎都是可行的。但话说回来,我看不出有任何理由不使用
writeFile path”“
,而是将
sudo
“向上传播一层”。但那只是我的2美分“底脚”?无论哪种方式,虽然
tee
提供了功能,
truncate--size 0
甚至
cp/dev/null
似乎都是可行的。但话说回来,我看不出有任何理由不使用
writeFile path”“
,而是将
sudo
“向上传播一层”。但那只是我的2美分。
  do let cmd' = "sudo" 
         args' = ["tee", "/path/to/file/" ++ basename :: String]
     (exitcode', stdout', stderr') <- readProcessWithExitCode cmd' args' ""