如何以root用户身份执行来自Haskell的命令?
考虑以下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 ()
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' ""